/* デバイスコンテキストのマッピングモード   2005/ 1/ 1 宍戸 輝光 */ #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); HWND hwMain; DWORD dwMM = MM_TEXT; HMENU g_hMenuMM; #define IDM_TEXT 1 #define IDM_LOMETRIC 2 #define IDM_HIMETRIC 3 #define IDM_LOENGLISH 4 #define IDM_HIENGLISH 5 #define IDM_TWIPS 6 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MSG msg; WNDCLASSEX wndclass ; HMENU hMenu; wndclass.cbSize = sizeof(wndclass); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = NULL; wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "CMapmode"; wndclass.hIconSm = NULL; RegisterClassEx(&wndclass); /* ウインドウ作成 */ hwMain = CreateWindow ("CMapmode", "デバイスコンテキストのマッピングモード", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 568, NULL, NULL, hInstance, NULL); /* メニュー作成 */ hMenu = CreateMenu(); g_hMenuMM = CreateMenu(); /* メニュー項目追加 */ AppendMenu(g_hMenuMM, MF_STRING, IDM_TEXT, "MM_TEXT"); AppendMenu(g_hMenuMM, MF_STRING, IDM_LOMETRIC, "MM_LOMETRIC"); AppendMenu(g_hMenuMM, MF_STRING, IDM_HIMETRIC, "MM_HIMETRIC"); AppendMenu(g_hMenuMM, MF_STRING, IDM_LOENGLISH, "MM_LOENGLISH"); AppendMenu(g_hMenuMM, MF_STRING, IDM_HIENGLISH, "MM_HIENGLISH"); AppendMenu(g_hMenuMM, MF_STRING, IDM_TWIPS, "MM_TWIPS"); /* メニュー項目をグループ化し、チェック */ CheckMenuRadioItem(g_hMenuMM, IDM_TEXT, IDM_TWIPS, IDM_TEXT, MF_BYCOMMAND); /* ウインドウメニュー設定 */ AppendMenu(hMenu, MF_POPUP, (UINT)g_hMenuMM, "マッピングモード"); SetMenu(hwMain, hMenu); /* ウインドウを表示 */ ShowWindow(hwMain, iCmdShow); /* メッセージループ */ while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; switch (iMsg) { /* メニュー選択時 */ case WM_COMMAND: switch (LOWORD(wParam)) { /* マッピングモード変更 */ case IDM_TEXT: case IDM_LOMETRIC: case IDM_HIMETRIC: case IDM_LOENGLISH: case IDM_HIENGLISH: case IDM_TWIPS: dwMM = LOWORD(wParam); break; } /* 選択されたメニュー項目をチェック */ CheckMenuRadioItem(g_hMenuMM, IDM_TEXT, IDM_TWIPS, dwMM, MF_BYCOMMAND); /* 再描画 */ InvalidateRgn(hwnd, NULL, TRUE); return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); /* 描画用ペンとブラシ選択 */ SelectObject(hdc, GetStockObject(BLACK_PEN)); SelectObject(hdc, GetStockObject(WHITE_BRUSH)); /* デバイスコンテキストのマッピングモード設定 */ SetMapMode(hdc, dwMM); /* 原点設定 */ SetViewportOrgEx(hdc, 0, 256, NULL); /* 原点から255 * 255単位の長方形を描画 */ Rectangle(hdc, 0, 0, 255, 255); /* 底辺と対面する辺の中点で三角形を描く */ MoveToEx(hdc, 0, 0, NULL); LineTo(hdc, 128, 255); LineTo(hdc, 255, 0); EndPaint(hwnd, &ps); return 0; case WM_DESTROY : /* 終了処理 */ PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, iMsg, wParam, lParam); }