Posted by : Izumikawa Fukumi 2014年5月30日金曜日

今回初めてC言語を使ってWindowsFormを作成したので、記録として残しておきます。

私も完全に理解しているわけでもなく確実にここに載っている情報が確かとは言えませんのでご了承下さい。また、間違っている箇所等間違った理解等があった場合コメントにて指摘して下さいますようよろしくお願い致します






今回の学習の参考にさせて頂いたサイトは以下のURLのサイトです。

Win32 API 階梯 - C による GUI アプリケーション開発




ではまず、ウィンドウ自体の作成方法なのですが、流石C言語です。
ウィンドウを作成するだけでも相当なコード量になります。

その前にプロジェクトから作成しましょう。

開発環境は「Microsoft VisualStudio」で行います。

まず、「新しいプロジェクト」をクリックし、
[Visual C++] -> [Win32] -> [Win32 プロジェクト] -> [OK]


[アプリケーションの設定] -> [空のプロジェクト] -> [完了]


補足:アプリケーション種類はコンソールアプリケーションではなく、Windowsアプリケーションです。




次に、ソースファイルの作成を行います。
[ソリューションエクスプローラー] -> [ソースファイル右クリック] -> [追加] -> [新しい項目]
-> [Visual C++] -> [C++ファイル(.cpp)]

これでソースファイルの準備が完了です。

後はコードを書くだけです。



手始めに以下のソースを書いてみましょう。

#include 


//プロトタイプ宣言
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
				   LPSTR lpszCmdLine, int nCmdShow)
{
	TCHAR szAppName[] = TEXT("testApp");
	WNDCLASS wc;
	HWND hwnd;
	MSG msg;

	//ウィンドウクラス属性設定

	wc.style			= CS_HREDRAW | CS_VREDRAW;					//スタイル
	wc.lpfnWndProc		= WndProc;									//ウィンドウプロジャ
	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	= szAppName;								//クラス名


	//ウィンドウクラス登録.
	if(!RegisterClass(&wc)) return 0;

	//ウィンドウを作成
	hwnd = CreateWindow (
		szAppName, TEXT("title"),
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT,
		CW_USEDEFAULT, CW_USEDEFAULT,
		NULL, NULL,
		hInstance, NULL);

	if(!hwnd) return 0;

	//ウィンドウ表示
	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);

	while(GetMessage(&msg, NULL, 0, 0) > 0){
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){

	HDC hdc;
	PAINTSTRUCT ps;

    switch (uMsg) {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}


うむ。長いですね。
一応このソースでウィンドウを表示出来ます。

では私が分かる範囲で説明をしていきます。

まず、「ウィンドウクラス属性」と言うのはウィンドウの細かい設定の様な物です。
ここで私がまず躓いた所は、「ウィンドプロジャ」です。

上記URLのサイトでは最初は、[DefWindowProc]と記載していました。
ですが、これだとタスク自体はある状態らしいです。

なので、正しくは[WndProc]です。


次に、「ウィンドウの作成」ですが、
これも各種設定の様な物ですね。

	//ウィンドウを作成
	hwnd = CreateWindow (
		szAppName, TEXT("title"),
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, 
		CW_USEDEFAULT,
		100, 
		150,
		NULL, 
		NULL,
		hInstance, 
		NULL);


上記の様にすればformのサイズ等も設定出来ます。
詳しくは以下を参考に、
http://walk.wgag.net/winapi/createwnd.html#03



次に

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){

	HDC hdc;
	PAINTSTRUCT ps;

    switch (uMsg) {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

の部分ですが、これはいわばイベントハンドラの様な物らしいです。
フォーム上で起こった出来事をPostしてそれを受け取り、その時の状況に応じてどう処理するか等を書いていきます。


ま〜私が理解した所はここぐらいですね。

- Copyright © I aim to creator. - Hatsune Miku - Powered by Blogger - Designed by Johanes Djogan -