標籤:tor iso color toe str imap 視圖 視窗 編程
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 之 自訂映射