- 追加された行はこの色です。
- 削除された行はこの色です。
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[0],。(`ω´#)。あぁん?最近、だらしねぇな[0])
#vote((^ω^)やったお[0],何これwww意味不すぎwww[1],。(`ω´#)。あぁん?最近、だらしねぇな[1])