Windows APIを使うのだから、CUIアプリケーションではなくGUIアプリケーションを作ってみよう。Windows APIはこの辺りの開発が簡単にできるところがポイントだ。最初はメッセージダイアログをつくるのがよいと思う。ソースコードが短く理解しやすいからだ。
Windows APIで初めてのウィンドウプログラミング
前回までに、ビルドツールとして「Visual Studio Build Tools 2022」をインストールし、「Developer Command Prompt for VS 2022」でHello Worldプログラムをビルドして実行することを確認した。Microsoft C/C++を使った最も簡単なプログラムのビルドを動作を確認したといったところだ。
Windows APIを使うのだから、CUIアプリケーションではなくGUIアプリケーションを作ってみよう。Windows APIはこの辺りの開発が簡単にできるところがポイントだ。最初はメッセージダイアログをつくるのがよいと思う。ソースコードが短く理解しやすいからだ。
メッセージダイアログを作成する代表的なAPIであるMessageBox()の説明は次のページにまとまっている。
このドキュメントには次のようなサンプルソースコードが掲載されている
WinMain function (winbase.h) - Win32 apps | Microsoft Docs に掲載されているサンプルソースコード
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow)
{
return MessageBox(NULL, "hello, world", "caption", 0);
}
このサンプルソースコードをベースにカスタマイズを行って、初めてWindows APIを使ったウィンドウプログラミンを行ってみよう。
メッセージダイアログ「MessageBox」
先ほどのサンプルプログラムのままでは芸がないので、次のようにメッセージ部分を日本語に変えたソースコードを用意する。
helloworld.c
/*
* Reference:
* https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-winmain
*/
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow)
{
return MessageBox(NULL, "新大陸へようこそ!", "はじめてのウィンドウプログラミング", 0);
}
このプログラムをcl.exeでコンパイルし、link.exeでリンクすればビルド完了だ。前回のnmake用のMakefileを作成したわけだが、このファイルを今回のケースに置き換えたものを用意する。
nmake用のMakefile
CMD= helloworld
CC= cl.exe
CFLAGS= /c
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
前回との違いはlink.exeでリンクする対象に「user32.lib」を追加している点にある。利用するWindows APIの実態がそこにあるからで、このファイルをリンクしないと実行することができない。手動でMakefileを整えていくと、このようにどのファイルをリンクして使っているのかがよくわかってくる。
オブジェクトファイルを生成するためのコンパイルと、実行ファイルを生成するためのリンクの処理を次に書いておく。
オブジェクトファイルの生成
cl.exe /c helloworld.c
実行ファイルの生成
link.exe user32.lib helloworld.obj
上記手順でビルドを行えばhelloworld.exeという実行ファイルが生成される。生成された実行ファイルを実行すると次のようになる。
Windows APIを使ったウィンドウプログラムの初実行だ。しかしながら、ウィンドウタイトルも、ダイアログ内のテキストも文字化けした状態だ。失敗してしまったが、まず「ウィンドウプログラミングをする」という目的は達成といったところだ。