Win32プログラミングをしてみよう(3)


自前作成ウィンドウでハローワールド。こん程度で精一杯胸一杯。ごちそうさまでした。しばらくいいや。
無意味にNT系でしか動かないコードになっています。

#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hWindow, UINT uMessage, WPARAM wParam, LPARAM lParam){
  HDC hDevice;
  PAINTSTRUCT PaintStruct;

  switch(uMessage){
  case WM_DESTROY:
    PostQuitMessage(0);
    break;
  case WM_CREATE:
    MessageBoxW(NULL,L"Hello, World!",L"ほげほげ",MB_OK);
    break;
  case WM_PAINT:
    hDevice = BeginPaint(hWindow, &PaintStruct);
    TextOutW(hDevice, 0, 0, L"Hello, World!", wcslen(L"Hello, World!"));
    EndPaint(hWindow, &PaintStruct);
    break;
  default:
    return DefWindowProc(hWindow, uMessage, wParam, lParam);
  }
  return 0L;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow) {
  int argc, i;
  WNDCLASS Class;
  HWND hWindow;
  MSG Message;
  LPWSTR *argv, lpCmdText=L"";

  argv = CommandLineToArgvW(GetCommandLineW(), &argc);
  for(i=0;i<argc;++i){
    wcscat(lpCmdText, argv[i]);
    wcscat(lpCmdText, L"\n");
  }

  Class.style = 0;
  Class.lpfnWndProc = WindowProc;
  Class.cbClsExtra = 0;
  Class.cbWndExtra = 0;
  Class.hInstance = hInstance;
  Class.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  Class.hCursor = LoadCursor(NULL, IDC_ARROW);
  Class.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  Class.lpszMenuName = NULL;
  Class.lpszClassName = "HogeClass";
  RegisterClass(&Class);

  hWindow =
  CreateWindowW(L"HogeClass", L"HogeWindow", WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
                NULL, NULL, hInstance, NULL);
  ShowWindow(hWindow, SW_SHOWDEFAULT);
  UpdateWindow(hWindow);
  while(GetMessageW(&Message, NULL, 0, 0)){
    TranslateMessage(&Message);
    DispatchMessage(&Message);
  }

  return 0;
}

ちょっとなるほど、な気分になってきた。WNDCLASSのMenuNameとかClassNameがワイド文字にできないのはどうにかできないんだろうか。

test