メッセージボックス

最初のアプリケーションは、以下のとおり。(hello.c)
#pragma resource "hello.res" /*←BCC5.5初期版でうまくいくためのおまじない*/
#include <windows.h>
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int cmdShow){
	MessageBox(NULL, "hello, world", "hello", MB_OK);
	return 0;
}
Windowsアプリはmain()ではなくWinMain()で始まります。PASCALと付いているのは関数の呼び出し規約です。 なお、このままコンパイルすると、ほとんどのコンパイラで「パラメータ○○は一度も使用されない」 といった趣旨の警告が出ると思いますが、PASCAL呼び出し規約では引数の型と個数が食い違っていたら 暴走したりしますので、コンソールアプリみたいにmain(void)とmain(int argc, char** argv)のどちらでも 良いというわけにはいきません。C++なら、int PASCAL WinMain(HINSTANCE, HINSTANCE, LPSTR, int) のように引数の型情報だけを記述することで、この警告を抑えることができます。 それぞれの引数の意味は、実際に使う時に解説することにします。

MessageBox()は、Windows APIです。APIとは、他のOSではシステムコールと呼ばれているものと、 ほとんど同じ概念です。MessageBoxの第一引数には「親ウィンドウのハンドル」を渡しますが、 今回は親ウインドウが存在しないのでNULLを渡します。第二引数、第三引数は表示される文字列です。 第四引数には、そのメッセージボックスのタイプを指定するフラグを渡します。このへんの詳しいことは、 APIリファレンスを参照してください。

他に、単独で使えるAPIとして、MessageBeep()などがあります。その名の通り、音を出すのに使います。

あと、ついでにアイコンも、つけましょう。アイコンエディタでアイコンをデザインしたら、 hello.icoというファイル名で保存し、hello.rcファイル(リソーススクリプトファイル)に指定します。

#include <windows.h>
helloicon  ICON "HELLO.ICO"
16ビットの場合、リンカへの定義ファイル(DEFファイル)も作成します。以下の内容で、hello.defというファイル名で作成します。
NAME	HELLO
DESCRIPTION  'HELLO: HELLO WINDOWS WORLD'
EXETYPE WINDOWS
STUB	    'WINSTUB.EXE'
CODE    PRELOAD MOVEABLE
DATA    MOVEABLE PRELOAD MULTIPLE
HEAPSIZE  4096
STACKSIZE 8192
このDEFファイルは、16ビットコンパイラでは必要な場合がありますが、32ビットのコンパイラでは 無くても大丈夫な場合がほとんどです。かえって、存在するとエラーになる場合すらあるようです。

コンパイル方法は、各コンパイラによってまちまちです。

GUI環境(IDEとかPWBとか)でコンパイルする場合

たいていのWindows用コンパイラでは「新規プロジェクト」とかいうメニュー項目があって、 そこでプロジェクトを作り(ターゲットは「Win32アプリケーション」とかにします。)ソースファイル (*.cと*.rc)を「追加」して「ビルド」すれば実行ファイルができると思います。

コマンドラインからコンパイルする場合

まず、MS-DOSプロンプトを開いて、ソースのあるディレクトリに移動します。 (この意味が分からない方は、MS-DOSの入門書でも読んでください)そのあと、 メッセージボックスだけで何ができる?と、お思いの方もいるかもしれませんが、
#include <windows.h>
#include <stdio.h>
char buf[256];
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int cmdShow){
	int i, j; long time, time2; double f=1, d=1;
	time=GetTickCount();
	for (i=0; i<30000; ++i)
		f+=d;
	time2=GetTickCount();
	sprintf(buf,"doubleの加算%d回 %ld ミリ秒", i, time2-time);
	MessageBox(NULL, buf, "ベンチマーク", MB_OK);
}
といった簡単なベンチマークや
#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
char buf[256];
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int cmdShow){
	int s, r;
	s = waveOutGetNumDevs();/*再生デバイスの数*/
	r = waveInGetNumDevs(); /*録音デバイスの数*/
	sprintf(buf,"録音ポート=%d 再生ポート=%d",r,s);
	MessageBox(NULL, buf, "サウンド機能", MB_OK);
	return 0;
}
といった、ちょっとした調査や
#include <windows.h>
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int cmdShow){
	if (MessageBox(NULL, "○○します。よろしいですか?", "状態変更", MB_YESNO)){
		/*実際の処理*/
		MessageBox(NULL, "完了しました", "状態変更", MB_OK);
	}
	return 0;
}
といった、ちょっとした質問とそれによる動作ぐらいは行うことができます。

前のページ

次のページ

一つ上のページに戻る