Win32APIを使っていても
デバック用に
printfなどが使いたいということがあると思います
そんなときは、プログラムの(WinMain関数の)冒頭に
次のような記述をします
AllocConsole(); freopen("CONOUT$", "w", stdout); freopen("CONIN$", "r", stdin);
コンソールも開きます
scanf関数による入力なども受けつけます
また、次のようにいつものコンソールプロジェクトでウィンドウを作成することも可能です
この場合問題となるのはインスタンスハンドルを
どうやって取得するかという話ですが、対策はあります
コンソールを選択します
次へ
・コンソールアプリケーション
・空のプロジェクト
を選びます
コンソールアプリケーションなので
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(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\"")
この章以降はウィンドウを作成する部分よりも
ウィンドウプロシージャの部分がメインの処理となります
ウィンドウ作成の部分はこの章のコードをコピペしてください