日本語が扱えるように変更
チュートリアルには掲載されていないが、このままでは日本語を含めることができない。MessageBox()でダイアログボックスを表示させたときのようにそのままだと日本語がうまく扱えないのだ。
例えば、次のようにウィンドウタイトルを英語から日本語に変更する。
ウィンドウタイトルを日本語に変更した場合のwinmain.c
#ifndef UNICODE
#define UNICODE
#endif
#include <windows.h>
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
// Register the window class.
const wchar_t CLASS_NAME[] = L"Sample Window Class";
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = CLASS_NAME;
RegisterClass(&wc);
// Create the window.
HWND hwnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class
L"ウィンドウプログラミング学習",// Window text
WS_OVERLAPPEDWINDOW, // Window style
// Size and position
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, // Parent window
NULL, // Menu
hInstance, // Instance handle
NULL // Additional application data
);
if (hwnd == NULL)
{
return 0;
}
ShowWindow(hwnd, nCmdShow);
// Run the message loop.
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
EndPaint(hwnd, &ps);
}
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
このソースコードをコンパイルしようとすると、次のような感じでエラーになる。
ここでの解決方法は、MessageBox()のときと同じだ。cl.exeのオプションに、ソースコードファイルがUTF-8で保存されていることを/source-charset:utf-8で明示すればよい。このオプションを指定してビルドが行われるようにMakefileを次のように書き換える。
cl.exeへ/source-charset:utf-8を追加したMakefile
CMD= winmain
CC= cl.exe
CFLAGS= /c /source-charset:utf-8
LINK= link.exe
LIBS= user32.lib
LFLAGS=
EXIST= cmd.exe /C if exist
all: build
build: $(CMD).exe
$(CMD).exe: $(CMD).obj
$(LINK) $(LFLAGS) $(LIBS) *.obj
dir
.c.o:
$(CC) $(CFLAGS) $*.c
run: build
$(CMD).exe
clean:
$(EXIST) $(CMD).obj del *.obj
$(EXIST) $(CMD).exe del $(CMD).exe
dir
この状態であればコンパイルが通るようになり、次のようにアプリケーションを実行して日本語タイトルが表示されることも確認することができる。
これでチュートリアルを読み進めていくための準備は完了だ。
ウィンドウプログラミングスタート
MessageBox()の場合と比べるとだいぶ長いソースコードになっているが、このサンプルソースコードはWindows APIを使ってウィンドウを作成する際に基本となるさまざまな処理がまとめられておりとても参考になる。Windowsでウィンドウプログラミングを行う際に実際にはどのような処理を行う必要があるのかをよく学ぶことができるのだ。
慣れてくればそれほど難しいサンプルではないので、しばらくはこのサンプルを使ってウィンドウプログラミングを学んでいく。Windowsでウィンドウプログラミングを身につけていくよいスタートラインになってくれると思う。