1. 程式人生 > >學習windows編程 day4 之 自定義映射

學習windows編程 day4 之 自定義映射

BE port turn pro pos truct IT llb 中心

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;
    int iMapMode;
    static int cxClient, cyClient;
    switch (message)
    {
    case WM_SIZE:
        cxClient = LOWORD(lParam);
        cyClient = HIWORD(lParam);
        
break; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rect); //創建自定義映射 iMapMode = GetMapMode(hdc); SetMapMode(hdc, MM_ISOTROPIC); //各向同性(會去幹預映射過程,將多余裁剪) //SetMapMode(hdc, MM_ANISOTROPIC); //各向異性(不會去幹預,會自適應) SetWindowExtEx(hdc, 100
, 100, NULL); //相當於取出原來邏輯窗口的100*100像素放大為現在視口的1/2*1/2(1/4) 所以現在視口所顯示的最大尺寸為200*200 SetViewportExtEx(hdc, cxClient / 2, cyClient / 2, NULL); //設置視口原點在中心 SetViewportOrgEx(hdc, cxClient / 2, cyClient / 2, NULL); //MM_ISOTROPIC: windows為了保證按比例將整個視口落在視圖中,會將多余的尺寸排除在外,若是有背景,則多余為黑色,會以最大比例占據窗口(前提是和原來設置和視口和窗口之比不變的前提下)
//MM_ANISOTROPIC:則不會,而是成比例拉伸 Rectangle(hdc, -100, -100, 100, 100); Ellipse(hdc, -80, -80, 80, 80); EndPaint(hwnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); }

上面只修改了大小對應,下面則修改了方向:

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;
    int iMapMode;
    static int cxClient, cyClient;
    switch (message)
    {
    case WM_SIZE:
        cxClient = LOWORD(lParam);
        cyClient = HIWORD(lParam);
        break;
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        GetClientRect(hwnd, &rect);
//創建自定義映射
        
        iMapMode = GetMapMode(hdc);
        //SetMapMode(hdc, MM_ISOTROPIC);    //各向同性(會去幹預映射過程,將多余裁剪)
        SetMapMode(hdc, MM_ANISOTROPIC);    //各向異性(不會去幹預,會自適應)
        SetWindowExtEx(hdc, 100, 100, NULL);    
        //相當於取出原來邏輯窗口的100*100像素放大為現在視口的1/2*1/2(1/4) 所以現在視口所顯示的最大尺寸為200*200
        
        //修改這裏兩個值得正負可以修改視口的x,y指向
        //默認MM_TEXT    x向右為正    y向下為正
        SetViewportExtEx(hdc, cxClient / 2, cyClient / 2, NULL);
        //修改後        x向左為正    y向上為正
        SetViewportExtEx(hdc, -cxClient / 2, -cyClient / 2, NULL);
        //....

        //設置視口原點在中心
        SetViewportOrgEx(hdc, cxClient / 2, cyClient / 2, NULL);

        //MM_ISOTROPIC: windows為了保證按比例將整個視口落在視圖中,會將多余的尺寸排除在外,若是有背景,則多余為黑色,會以最大比例占據窗口(前提是和原來設置和視口和窗口之比不變的前提下)
        //MM_ANISOTROPIC:則不會,而是成比例拉伸
        Rectangle(hdc, -100, -100, 100, 100);
        Ellipse(hdc, -80, -80, 80, 80);

        //發現采用默認MM_TEXT方式
        TextOut(hdc, -40, -40, L"Love", 4);
        TextOut(hdc, 40, 40, L"HAHA", 4);

        MoveToEx(hdc, 0, -100, NULL);
        LineTo(hdc, 0, 100);
        MoveToEx(hdc, -100, 0, NULL);
        LineTo(hdc, 100, 0);


        EndPaint(hwnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }


    return DefWindowProc(hwnd, message, wParam, lParam);
}

學習windows編程 day4 之 自定義映射