質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

1回答

557閲覧

WindowsAPIでウィンドウの読み込みが終わらない件

despell

総合スコア10

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

1クリップ

投稿2018/01/16 00:27

編集2018/01/16 00:28

現在Win32APIを用いてプログラムの作成を行っているのですが, ウィンドウの生成自体はうまくいったものの
ウィンドウが読み込み状態から動きません. 以下のようにコードを組んでいるのですがご指導お願いします.

Win32

1//======================================================== 2// ヘッダファイル 3//======================================================== 4 5#include"Main.h" 6 7//======================================================== 8// ウィンドウ関連 9//======================================================== 10 11//std::vector<HWND> g_WinHandle; // ウィンドウハンドル 12 13HWND g_WinHandle[4]; //ウィンドウハンドル 14 15//======================================================== 16// 関数プロトタイプ 17//======================================================== 18 19LRESULT CALLBACK MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 20HRESULT AppLoop(); 21 22//======================================================== 23// WinMainエントリーポイント 24//======================================================== 25int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmndLine, int nCmdShow) 26{ 27 28 //---------------------------------------------------- 29 // ウィンドウクラスの作成・登録 30 //---------------------------------------------------- 31 WNDCLASS WindowClass; // 登録ウィンドウクラス 32 WCHAR szWindowClass[] = { L"Sample" }; // 登録ウィンドウクラス名 33 WCHAR szWindowName[] = { L"Sample - Windowed" }; // ウィンドウ名 34 DWORD dwStyle = WS_OVERLAPPEDWINDOW; // ウィンドウスタイル 35 36 //WCHAR szExePath[MAX_PATH]; 37 //GetModuleFileName(NULL, szExePath, MAX_PATH); 38 //HICON hIcon = ExtractIcon(hInstance, szExePath, 0); 39 40 ZeroMemory(&WindowClass, sizeof(WNDCLASS)); 41 WindowClass.style = CS_DBLCLKS; 42 WindowClass.hInstance = hInstance; 43 WindowClass.lpszClassName = szWindowClass; 44 WindowClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); 45 WindowClass.hIcon = NULL; 46 WindowClass.hCursor = NULL; 47 WindowClass.lpfnWndProc = MsgProc; 48 49 // ウィンドウ登録 50 ATOM ClassAtom = RegisterClass(&WindowClass); 51 if (ClassAtom == 0) { 52 DWORD error = GetLastError(); // 最新エラーコード取得 53 if (ERROR_CLASS_ALREADY_EXISTS != error) { 54 MessageBox(NULL, L"ウィンドウクラスの登録に失敗しました。", L"Error", MB_OK | MB_ICONEXCLAMATION); 55 return E_FAIL; 56 } 57 } 58 59 //---------------------------------------------------- 60 // ウィンドウクラスの作成 61 //---------------------------------------------------- 62 HWND hWnd = CreateWindow( 63 szWindowClass, // 登録ウィンドウクラス名 64 szWindowName, // ウィンドウ名 65 dwStyle, // ウィンドウスタイル 66 0, 0, // ウィンドウ位置 67 MAINWIN_WIDTH, // ウィンドウ幅 68 MAINWIN_HEIGHT, // ウィンドウ高さ 69 NULL, // 親ウィンドウハンドル 70 0, // メニューハンドル・子ウィンドウID 71 WindowClass.hInstance, // Appインスタンスのハンドル 72 NULL // ウィンドウ作成データ 73 ); 74 75 // ウィンドウ表示 76 ShowWindow(hWnd, SW_SHOWDEFAULT); 77 g_WinHandle[0] = hWnd; 78 79 //if (hWnd) { 80 // MessageBox(hWnd, L"ウィンドウが生成されました.", L"情報", MB_OK); 81 82 //} 83 //else { 84 // MessageBox(NULL, L"ウィンドウの生成に失敗しました.", NULL, MB_OK | MB_ICONERROR); 85 //} 86 87 //---------------------------------------------------- 88 // アプリケーションループ 89 //---------------------------------------------------- 90 AppLoop(); 91 92 return 0; 93 94} 95 96//======================================================== 97// アプリケーションループ 98//======================================================== 99HRESULT AppLoop() 100{ 101 HRESULT hr = S_OK; 102 103 //---------------------------------------------------- 104 // メッセージループ 105 //---------------------------------------------------- 106 bool bGotMsg; 107 MSG msg; 108 109 msg.message = WM_NULL; 110 PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE); 111 112 HWND hWnd = g_WinHandle[0]; 113 114 while (WM_QUIT != msg.message) { 115 116 // メッセージのチェック 117 bGotMsg = (PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE) != 0); 118 119 if (bGotMsg) { 120 if (0 == TranslateAccelerator(hWnd, NULL, &msg)) { 121 TranslateMessage(&msg); // 文字メッセージに変換 122 DispatchMessage(&msg); // プロシージャに送出 123 } 124 } 125 126 } 127 128 return hr; 129} 130 131 132//======================================================== 133// メッセージ・プロシージャ 134//======================================================== 135LRESULT CALLBACK MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 136{ 137 138 switch (uMsg){ 139 140 case WM_DESTROY: 141 PostQuitMessage(0); 142 return 0; 143 } 144 145 return DefWindowProc(hWnd, uMsg, wParam, lParam); 146 147}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

bGotMsg = (PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE) != 0);

常に動き続ける何かを処理するためのメッセージループでしょうか。これだと、メッセージキューにメッセージがあることを確認した後にそのメッセージをキューから取り除いていないので、毎回同じメッセージを延々と処理し続ける状態になっています。つまり、ウィンドウのメッセージ処理が全く進まなくなっています。
それを回避するためには、if (bGotMsg) {ブロックに入ったところで改めてPM_REMOVEPeekMessage関数を呼び出し、メッセージをキューから取り除く必要があります。

もし、常に何かしたいわけではないのなら、PeekMessageではなくGetMessageの使用をお勧めします。ご質問のコードだとフルパワーでループし続けているので、CPUコアの使用率が100%に張り付く状態になります。PCによってはCPUファンが高速回転し続けることになってしまうかもしれません。
もし、常に何かしたいのだとしても、できれば適度にSleepが入る仕組みにした方が良いです。

投稿2018/01/16 02:46

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問