Windows API Primer   メッセージ

ホーム   目次

メッセージ

次の message.c は、メッセージについての理解を深めるために、ウィンドウが発するメッセージをまとめたアプリケーションです。

message.c


#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int     WINAPI   WinMain(HINSTANCE hInstance,
			 HINSTANCE hPrevInstance,
			 LPSTR     lpCmdLine,
			 int       nCmdShow)
{
  WNDCLASS wc;
  HWND     hwnd;
  MSG      msg;

  wc.style         = CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc   = WndProc;
  wc.cbClsExtra    = 0;
  wc.cbWndExtra    = 0;
  wc.hInstance     = hInstance;
  wc.hIcon         = NULL;
  wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
  wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND + 1;
  wc.lpszMenuName  = NULL;
  wc.lpszClassName = TEXT("MESSAGE");

  RegisterClass(&wc);

  hwnd             = CreateWindow(TEXT("MESSAGE"),
				  TEXT("Windows API Primer"),
				  WS_OVERLAPPEDWINDOW | WS_VISIBLE,
				  CW_USEDEFAULT, CW_USEDEFAULT, 300, 200,
				  NULL, NULL, hInstance, NULL);

  while (GetMessage(&msg, NULL, 0, 0))
    {
      DispatchMessage(&msg);
    }
  
  return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  static HWND  label;
         RECT  rect;
	 HFONT font;
	 int   x, y;
	 TCHAR szBuf[256];
	 
	 
  switch (msg)
    {
    case WM_CREATE:
      GetClientRect(hwnd, &rect);
      font  = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
      label = CreateWindow(TEXT("STATIC"),
			   TEXT("♪( ´▽`)"),
			   WS_CHILD | WS_VISIBLE | SS_CENTER,
			   (rect.right  - 200) / 2,
			   (rect.bottom -  15) / 2,
			   200, 15, hwnd, NULL, NULL, NULL);
      SendMessage(label, WM_SETFONT, (WPARAM)font, 0);
      break;
    case WM_SIZE:
      GetClientRect(hwnd, &rect);
      SetWindowPos (label, HWND_TOP,
		    (rect.right  - 200) / 2,
		    (rect.bottom -  15) / 2,
		    0, 0, SWP_NOSIZE);
      break;
    case WM_KEYDOWN:
      if (wParam == VK_RETURN)
	SendMessage(label, WM_SETTEXT, 0,
		    (LPARAM)TEXT("Enter key has been pressed."));
      else
	SendMessage(label, WM_SETTEXT, 0,
		    (LPARAM)TEXT("A key has been pressed."));
      break;
    case WM_RBUTTONDOWN:
      SendMessage(label, WM_SETTEXT, 0,
		  (LPARAM)TEXT("Right button was clicked."));
      break;
    case WM_LBUTTONDOWN:
      SendMessage(label, WM_SETTEXT, 0,
		  (LPARAM)TEXT("Left button was clicked."));
      break;
    case WM_MOUSEMOVE:
      x = LOWORD(lParam);
      y = HIWORD(lParam);
      wsprintf(szBuf, TEXT("Mouse has moved to %d %d"), x, y);
      SendMessage(label, WM_SETTEXT, 0, (LPARAM)szBuf);
      break;
    case WM_MOVE:
      x = LOWORD(lParam);
      y = HIWORD(lParam);
      wsprintf(szBuf, TEXT("Window has moved to %d %d"), x, y);
      SendMessage(label, WM_SETTEXT, 0, (LPARAM)szBuf);
      break;
    case WM_DESTROY:
      PostQuitMessage(0);
      break;
    }
  return DefWindowProc(hwnd, msg, wParam, lParam);
}
    


実行結果


ウィンドウに対するそれぞれの操作がラベルに表示されます。
右クリックRight button was clicked.
左クリックLeft button was clicked.
キーボードのキーを押すA key has been pressed.
エンターキーを押すEnter key has been pressed.
マウスを移動するMouse has moved to x point y point
ウィンドウを移動するWindow has moved to x point y point


コード説明

  1. wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    ウィンドウクラスのカーソルをこのように設定すると矢印カーソルになります。
  2. case WM_KEYDOWN:
    ウィンドウがアクティブな時にキーボードのキーを押すと WM_KEYDOWN メッセージが送信されます。
  3. if (wParam == VK_RETURN)
    エンターキーが押された場合は、wPram に VK_RETURN という仮想キーコードが入っています。
  4. SendMessage(label, WM_SETTEXT, 0, (LPARAM)TEXT("Enter key has been pressed."));
    SendMessageでSETTEXTメッセーを送るとウィンドウ(GUI 部品)の文字列を設定できます。引数は次のとおりです。
    1. 第1引数に、メッセージを送るウィンドウ(GUI 部品)を指定します。
    2. 第2引数に、SETTEXT メッセージを指定します。
    3. 第3引数に、wParamの値を指定しますが、今回は使いませんので、0 を指定しています。
    4. 第4引数に、文字列を LPARAM 型にキャストして指定します。
  5. case WM_RBUTTONDOWN:
    マウスの右ボタンを押し下げた時に送信されるメッセージです。WM_RBUTTONUP とすると、マウスボタンをダウンしてからアップした時なので、クリックした時になります。
  6. case WM_LBUTTONDOWN:
    マウスの左ボタンを押し下げた時に送信されるメッセージです。WM_LBUTTONUP とすると、マウスボタンをダウンしてからアップした時なので、クリックした時になります。
  7. case WM_MOUSEMOVE:
    マウスが移動した時に送信されるメッセージです。
    1. x = LOWORD(lParam);
      lParam は32bitの整数型ですが、その下位16bitにマウスのX座標が入っています。lParam の下位16bitを取り出すには、LOWORD マクロを使います。
    2. y = HIWORD(lParam);
      lParam の上位16bitにマウスのY座標が入っています。lParamの上位16bitを取り出すには、HIWORD マクロを使います。
    3. wsprintf(szBuf, TEXT("Mouse has moved to %d %d"), x, y);
      wsprintfは、書式文字列を作成する関数です。第1引数の文字列変数に、第2引数以下の書式文字列を代入します。
  8. case WM_MOVE:
    ウィンドウが移動した時に送信されるメッセージです。


39260 visits
Posted: Jun. 03, 2020
Update: Jun. 03, 2020

ホーム   目次