第四回-付録01 : Windows プログラミング


このページでは、Windows アプリケーションを取り上げる。

ただし、提示するソースコードの内容を理解することを求めているのではなく、
Borland C++ Compiler (BCC) でも Windows アプリケーションが作成できるということを 確かめられればそれで良い。

Windows アプリケーションを作成するには様々な方法があるが、ここで紹介するのは Win32API を用いる手法である。
googleなどで、「bcc, win32api」をキーワードに検索すれば、多くの情報が得られるだろう。
Win32API を用いた方法は最もプリミティヴ (原始的) なものであり、以下に見るように記述は非常に煩雑である。

Win32API よりも簡単に Windows アプリケーションを作成したい人には商用コンパイラである Microsoft Visual StudioC++ Builder などを紹介しておく。

また、簡単に Windows アプリケーションを作成したいが、お金はかけたくないという人には、BCC に フリーなライブラリを組み合わせる方法もあるが、
これはドキュメント等を自分で積極的に調べられる人向けであろう。


Win32API を用いた Windows アプリケーション

前置きが長くなったが、BCC + Win32API で Windows アプリケーションを作成する方法を以下に記す。

まず、Windows アプリケーションを作成するためには、BCC Developer において以下の準備をする必要がある。 この設定は、コンソールアプリケーションではなく Windows アプリケーションを作成するためのものである。
!この設定をしたプロジェクトでは、いつものコンソールアプリケーションはコンパイルできないので注意!

以上の準備のもと、以下のソースを保存してコンパイルして実行すれば Windows アプリケーションが起動する。

#define _WIN32_WINNT 0x400
#define WINVER 0x400
#include <windows>
using namespace std;

long WINAPI WndProc(HWND hwnd,UINT msg,UINT wParam,LONG lParam)
{
    PAINTSTRUCT ps;

	switch(msg){
		case WM_CREATE: break;
		case WM_DESTROY: PostQuitMessage(0); break;
		case WM_SIZE: break;
		case WM_PAINT: BeginPaint(hwnd,&ps);
			TextOut(ps.hdc,0,0,"Hello World!",12);
			EndPaint(hwnd,&ps);
			break;
		default: 
			return DefWindowProc(hwnd,msg,wParam,lParam);
	}
	return(0);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR, int nCmdShow)
{
	HWND hwnd;
	MSG msg;
	WNDCLASS wc;	/*window型のアプリを作る.*/
	if(!hPrevInstance){
		wc.style   = CS_HREDRAW|CS_VREDRAW;	/* Windowスタイル */
		wc.lpfnWndProc   = WndProc;	/* イベントハンドラの定義 */
		wc.cbClsExtra       = 0;
		wc.cbWndExtra       = 0;
		wc.hInstance   = hInstance;	/* 自分のインスタンスをセット */
		wc.hIcon         = NULL;	/* ICONは使わないのでNULL */
		wc.hCursor     = LoadCursor(NULL,IDC_ARROW); 
		wc.hbrBackground    = 
			(HBRUSH)GetStockObject(WHITE_BRUSH);
		wc.lpszMenuName     = NULL;
		wc.lpszClassName    = "HelloWorld" ;
		RegisterClass(&wc) ;	/* winOsに通知・登録する.*/
	}
	hwnd=CreateWindow(
		"HelloWorld",
		"Test Program Windows sample 001",
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		400+GetSystemMetrics(SM_CXBORDER)*2,
		200+GetSystemMetrics(SM_CYCAPTION)
		+GetSystemMetrics(SM_CYMENU)
		+GetSystemMetrics(SM_CYBORDER) * 2,
		NULL,
		NULL,
		hInstance,
		NULL);	/*このhInstanceのポインターをhwndに渡す*/

	ShowWindow(hwnd,nCmdShow);
	UpdateWindow(hwnd);
	while(GetMessage(&msg,NULL,0,0)){	/*msgループ*/
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}




←第四回課題解答第五回演習→

第四回トップページへ

クラスから入る C++ へ戻る