Hello Worldすら表示しない空のウィンドウを表示するプログラムです。C++で素のWindows APIを直接使用しています。

こういうのが欲しくなったとき、どこかから探してきて自分のスタイルに書き換えるという作業を毎回行っているので、次こそはそんな不毛な作業をしなくて済むように、というわけでここに置きます。

#define WINVER 0x0400
#define _WIN32_WINNT 0
#define _WIN32_WINDOWS 0
#define _WIN32_IE 0
 
#define OEMRESOURCE
 
#include <windows.h>
#include <windowsx.h>
#include <tchar.h>
 
void OnDestroy(HWND)
{
  PostQuitMessage(0);
}
 
LRESULT CALLBACK WndProc(
  HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch (msg)
  {
    HANDLE_MSG(hwnd, WM_DESTROY, OnDestroy);
  }
  return DefWindowProc(hwnd, msg, wParam, lParam);
}
 
int WINAPI _tWinMain(
  HINSTANCE hinst, HINSTANCE, LPTSTR, int cmdShow)
{
  WNDCLASSEX wcex = {
    sizeof wcex,
    CS_HREDRAW | CS_VREDRAW,
    WndProc,
    0, 0,
    hinst,
    static_cast<HICON>(LoadImage(
      nullptr, MAKEINTRESOURCE(OIC_SAMPLE), IMAGE_ICON,
      0, 0, LR_DEFAULTSIZE | LR_SHARED)),
    static_cast<HCURSOR>(LoadImage(
      nullptr, MAKEINTRESOURCE(OCR_NORMAL), IMAGE_CURSOR,
      0, 0, LR_DEFAULTSIZE | LR_SHARED)),
    reinterpret_cast<HBRUSH>(COLOR_WINDOW + 1),
    nullptr,
    TEXT("Test Window Class"),
    nullptr,
  };
  auto wndClass = RegisterClassEx(&wcex);
  if (!wndClass)
  {
    return 1;
  }
 
  auto hwnd = CreateWindowEx(
    WS_EX_APPWINDOW | WS_EX_OVERLAPPEDWINDOW,
    MAKEINTATOM(wndClass),
    TEXT("Hello World"),
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT,
    CW_USEDEFAULT, CW_USEDEFAULT,
    nullptr,
    nullptr,
    hinst,
    nullptr);
  if (!hwnd)
  {
    return 1;
  }
  ShowWindow(hwnd, cmdShow);
  UpdateWindow(hwnd);
 
  for (;;)
  {
    MSG msg = {};
    auto ret = GetMessage(&msg, nullptr, 0, 0);
    if (ret == 0 || ret == -1)
    {
      return ret;
    }
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
}

これを書くにあたり、私にとって2つ新しい点があります。

  • IDI_APPLICATION/IDC_ARROWではなく、OIC_SAMPLE/OCR_NORMALを使用してみました。定数の値としては同じです。LoadImage関数のリファレンスには、IDI_*/IDC_*には触れられておらずOIC_*/OCR_*系の定数が紹介されているので、こちらを使ってみました。IDI_APPLICATION/IDC_ARROWと違って、MAKEINTRESOURCEに渡さないといけないので面倒でした。
  • MAKEINTATOMマクロ。キャストの手間を省くものです。これは欲しいと前から思っていましたが、存在していたというわけです。

HWND引数がヌルならGetMessageの戻り値が-1になる可能性は無視して良いのではないかという話もありますが、一応戻り値が-1の場合の処理を入れたくなる私です。


スポンサード リンク

この記事のカテゴリ

  • ⇒ 空のウィンドウを表示するだけのWindowsアプリケーション
  • ⇒ 空のウィンドウを表示するだけのWindowsアプリケーション