ウィンドウを作成することができましたので、

 

次に作成したウィンドウに文字列を書き込みたいと思います。

手順は次の通りです。

GetDC関数で、ウィンドウのクライアント領域のデバイスコンテキストのハンドルを取得します。

そのハンドルを使って、TextOut関数で文字列を書きます。

書き終わったら、ReleaseDC関数でデバイスコンテキストを開放する必要があります。

 

〇GetDC関数

HDC GetDC(
  [in] HWND hWnd
);

hWndは描画するウィンドウのハンドルです。

戻り値は指定されたウィンドウのクライアント領域のデバイスコンテキストへのハンドルです。

NULLを設定すると画面全体が選択されます。

 

〇TextOut関数

BOOL TextOutW(
  [in] HDC     hdc,
  [in] int     x,
  [in] int     y,
  [in] LPCWSTR lpString,
  [in] int     c
);

各パラメータについて

1.  [in] int     x

x 座標 (論理座標)。

 

2.[in] int     y

y 座標 (論理座標)

 

3.[in] LPCWSTR lpString

描画する文字列へのポインター。

 

4.int     c

文字列の長さ (文字数)。

文字数はlstrlen関数を使用して得ることができます。

 

〇ReleaseDC関数

int ReleaseDC(
  [in] HWND hWnd,
  [in] HDC  hDC
);

 

〇文字列を描画するプログラムです。

日本、こんにちは!と表示します。

 

  1. #include <windows.h>
  2.  
  3. LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  4. {
  5.     switch (uMsg)
  6.     {
  7.     case WM_DESTROY:
  8.         PostQuitMessage(0);
  9.         break;
  10.  
  11.     case WM_CREATE:
  12.         ShowWindow(hWnd, SW_SHOW);
  13.         return 0;
  14.  
  15.     default:
  16.         return DefWindowProc(hWnd, uMsg, wParam, lParam);
  17.     }
  18.     return 0;
  19. }
  20.  
  21. int APIENTRY wWinMain(
  22.     _In_ HINSTANCE hInstance,
  23.     _In_opt_ HINSTANCE hPrevInstance,
  24.     _In_ LPWSTR ipCmdLine,
  25.     _In_ int nCmdShow
  26. ) {
  27.  
  28.     WNDCLASSEXW wcex;
  29.  
  30.     wcex.cbSize = sizeof(WNDCLASSEX);
  31.  
  32.     wcex.style = CS_HREDRAW | CS_VREDRAW;
  33.     wcex.lpfnWndProc = WndProc;
  34.     wcex.cbClsExtra = 0;
  35.     wcex.cbWndExtra = 0;
  36.     wcex.hInstance = hInstance;
  37.     wcex.hIcon = NULL;
  38.     wcex.hCursor = NULL;
  39.     wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  40.     wcex.lpszMenuName = NULL;
  41.     wcex.lpszClassName = TEXT("TestWindow");
  42.     wcex.hIconSm = NULL;
  43.  
  44.     RegisterClassExW(&wcex);
  45.  
  46.     HWND hWnd = CreateWindowEx(0UL, TEXT("TestWindow"), TEXT("日本"), WS_OVERLAPPEDWINDOW,
  47.         CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
  48.  
  49.     if (!hWnd)
  50.     {
  51.         return FALSE;
  52.     }
  53.  
  54.     HDC hdc = GetDC(hWnd);
  55.     LPCWSTR lpString = TEXT("日本、こんにちは!");
  56.     TextOut(hdc, 10, 10, lpString, lstrlen(lpString));
  57.     ReleaseDC(hWnd, hdc);
  58.  
  59.     MSG msg;
  60.  
  61.     while (GetMessage(&msg, NULL, 0, 0))
  62.     {
  63.         DispatchMessage(&msg);
  64.     }
  65.  
  66.     return (int)msg.wParam;
  67. }

 

〇プログラムを実行すると次のように表示されます。

ただし、ウィンドウのサイズを変えたりすると消えてしまいます。

システムはウィンドウのサイズなどが変わったときに、

クライアントウィンドウの領域を無効にします。

無効になることで、描画された文字列が消えてしまいます。

システムから再度描画の依頼するWM_PAINTというメッセージが来ます。

このメッセージを処理することで、再度文字列を描画することができます。

次回、WM_PAINTで文字列を書くで説明します。