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

前回やったのはメッセージボックス表示させるだけWindowsプログラム。Windowsなんだし、ウィンドウを作ってみた。

何もしないウィンドウを表示するだけのプログラム。

window.c

#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hWindow, UINT uMessage, WPARAM wParam, LPARAM lParam){
  switch(uMessage){
  case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
  }
  return DefWindowProc(hWindow, uMessage, wParam, lParam);
}

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

  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_WINLOGO);
  Class.hCursor = LoadCursor(NULL, IDC_ARROW);
  Class.hbrBackground = (HBRUSH)(COLOR_WINDOWTEXT+1);
  Class.lpszMenuName = NULL;
  Class.lpszClassName = ClassName;
  RegisterClass(&Class);

  hWindow =
  CreateWindow(ClassName, "MainWindow", WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
                NULL, NULL, hInstance, NULL);
  ShowWindow(hWindow, SW_SHOWDEFAULT);
  UpdateWindow(hWindow);
  while(GetMessageW(lpMessage, NULL, 0, 0)){
    TranslateMessage(lpMessage);
    DispatchMessage(lpMessage);
  }

  return 0;
}

うーん。コード量が一気にうげー。

cl window.c user32.lib shell32.lib

コンパイル。いいかげんIDEからやった方が楽かなあ。でもまだこの段階だったら、一々「プロジェクトの新規作成、あっちクリックこっちクリックほげほげ」なんてやるよりテキストエディタで適当に書いて、cl.exeから適当にコンパイルしてた方が楽な気がする。IDEとかまともに使ったことないからよくわからないけど。

test