Win32APIを使っていても
デバック用に
printfなどが使いたいということがあると思います
そんなときは、プログラムの(WinMain関数の)冒頭に
次のような記述をします

	AllocConsole();	
	freopen("CONOUT$", "w", stdout); 
	freopen("CONIN$", "r", stdin);   

コンソールも開きます
scanf関数による入力なども受けつけます

&ref(winconsole.GIF);

-----------------------------------------------------------

また、次のようにいつものコンソールプロジェクトでウィンドウを作成することも可能です
この場合問題となるのはインスタンスハンドルを
どうやって取得するかという話ですが、対策はあります

コンソールを選択します

&ref(console.GIF);

次へ

&ref(console2.GIF);

・コンソールアプリケーション
・空のプロジェクト
を選びます

&ref(console3.GIF);

コンソールアプリケーションなので
main関数からアプリケーションは開始します

	// ウィンドウズバージョン指定
	#define _WIN32_WINNT 0x0500
 
	#include <stdio.h>
	#include <stdlib.h>
	#include <tchar.h>
	#include <windows.h>
	#include <windowsx.h>
	#include <commctrl.h>
	#pragma comment(lib,"comctl32.lib")
 	#pragma comment(lib,"winmm.lib") 
 
	// コンソール画面隠蔽
	//#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
	// ウィンドウプロシージャ
	LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
 
	int main(int argc,char* argv[])
	{
		HINSTANCE hInstance = GetModuleHandle(NULL);	// インスタンスハンドル取得
		const TCHAR* WC_BASIC = _T("Basic");		// ウィンドウクラス名
 
		/********************************************************/
		/*		ウィンドウクラスの定義と作成		*/
		/********************************************************/
 		
		// シンプルウィンドウクラス設定
		WNDCLASSEX wcex ={sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, WndProc, 0,0,hInstance,
			(HICON)LoadImage(NULL,MAKEINTRESOURCE(IDI_APPLICATION),IMAGE_ICON,0,0,LR_DEFAULTSIZE | LR_SHARED),
			(HCURSOR)LoadImage(NULL,MAKEINTRESOURCE(IDC_ARROW),IMAGE_CURSOR,0,0,LR_DEFAULTSIZE | LR_SHARED), 
			(HBRUSH)GetStockObject(WHITE_BRUSH), NULL, WC_BASIC , NULL};
 
		// シンプルウィンドウクラス作成
		if(!RegisterClassEx(&wcex)) 
			return -1;
 
		/********************************************************/
		/*		ウィンドウの作成			*/
		/********************************************************/
 
		HWND hWnd = CreateWindowEx(
				0,			//拡張ウィンドウスタイル
				WC_BASIC,		//ウィンドウクラス名
				_T("タイトル"),		//タイトルバーにこの名前が表示されます
				WS_OVERLAPPEDWINDOW,	//ウィンドウスタイル
				CW_USEDEFAULT,		//X座標
				CW_USEDEFAULT,		//Y座標
				CW_USEDEFAULT,		//幅
				CW_USEDEFAULT,		//高さ
				NULL,			//親ウィンドウのハンドル、親を作るときはNULL
				NULL,			//メニューハンドルorリソースID
				hInstance,		//インスタンスハンドル
				NULL);
 		
		// ウィンドウ作成失敗
		if (hWnd == NULL)
			return -1;
 
		// ウィンドウを可視状態にする
		ShowWindow(hWnd, SW_SHOW);
		UpdateWindow(hWnd);
 
		/********************************************************/
		/*		メッセージループ			*/
		/********************************************************/
 
		MSG msg = {}; 
		while(msg.message != WM_QUIT) {
			if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
			else{
				// メッセージ処理をしてないとき
			}
		}	    
		return 0;
	}
 
	// ウィンドウプロシージャ
	LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
	{
		switch (msg) {
			case WM_DESTROY:
				PostQuitMessage(0);
				return 0;
		}
		return (DefWindowProc(hWnd, msg, wParam, lParam));
	}

肝心のインスタンスハンドルの取得は一行だけです
 HINSTANCE hInstance = GetModuleHandle(NULL);	// インスタンスハンドル取得

あとウィンドウクラスの定義を短くまとめました
書き方が違うだけで代入しているものはまったく同じです
構造体の変数の順番がわかっていれば
配列同様に、初期化子{}を使って、代入することができます

また、
プログラム冒頭の一行のコメントアウトをはずせば
コンソールは隠蔽できます

 // コンソール画面隠蔽
 #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

この章以降はウィンドウを作成する部分よりも
ウィンドウプロシージャの部分がメインの処理となります
ウィンドウ作成の部分はこの章のコードを使用してください

全ソースコードは下から
&ref(main.cpp);

#vote((^ω^)やったお[0],何これwww意味不すぎwww[1],。(`ω´#)。あぁん?最近、だらしねぇな[1])
|(^ω^)やったお|1|
|何これwww意味不すぎwww|1|
|。(`ω´#)。あぁん?最近、だらしねぇな|1|


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS