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

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

ただいまの
回答率

90.76%

  • Win32 API

    206questions

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

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 206

despell

score 2

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

//========================================================
//    ヘッダファイル
//========================================================

#include"Main.h"

//========================================================
//    ウィンドウ関連
//========================================================

//std::vector<HWND>    g_WinHandle;    // ウィンドウハンドル

HWND g_WinHandle[4];    //ウィンドウハンドル

//========================================================
//    関数プロトタイプ
//========================================================

LRESULT CALLBACK MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
HRESULT AppLoop();

//========================================================
//    WinMainエントリーポイント
//========================================================
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmndLine, int nCmdShow)
{

    //----------------------------------------------------
    //    ウィンドウクラスの作成・登録
    //----------------------------------------------------
    WNDCLASS    WindowClass;                                    // 登録ウィンドウクラス
    WCHAR        szWindowClass[] = { L"Sample" };                // 登録ウィンドウクラス名
    WCHAR        szWindowName[] = { L"Sample - Windowed" };    // ウィンドウ名
    DWORD        dwStyle = WS_OVERLAPPEDWINDOW;                    // ウィンドウスタイル

    //WCHAR        szExePath[MAX_PATH];
    //GetModuleFileName(NULL, szExePath, MAX_PATH);
    //HICON hIcon = ExtractIcon(hInstance, szExePath, 0);

    ZeroMemory(&WindowClass, sizeof(WNDCLASS));
    WindowClass.style = CS_DBLCLKS;
    WindowClass.hInstance = hInstance;
    WindowClass.lpszClassName = szWindowClass;
    WindowClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    WindowClass.hIcon = NULL;
    WindowClass.hCursor = NULL;
    WindowClass.lpfnWndProc = MsgProc;

    // ウィンドウ登録
    ATOM ClassAtom = RegisterClass(&WindowClass);
    if (ClassAtom == 0) {
        DWORD error = GetLastError();        // 最新エラーコード取得
        if (ERROR_CLASS_ALREADY_EXISTS != error) {
            MessageBox(NULL, L"ウィンドウクラスの登録に失敗しました。", L"Error", MB_OK | MB_ICONEXCLAMATION);
            return E_FAIL;
        }
    }

    //----------------------------------------------------
    //    ウィンドウクラスの作成
    //----------------------------------------------------
    HWND hWnd = CreateWindow(
        szWindowClass,                // 登録ウィンドウクラス名
        szWindowName,                // ウィンドウ名
        dwStyle,                    // ウィンドウスタイル
        0, 0,                        // ウィンドウ位置
        MAINWIN_WIDTH,                // ウィンドウ幅
        MAINWIN_HEIGHT,                // ウィンドウ高さ
        NULL,                        // 親ウィンドウハンドル
        0,                            // メニューハンドル・子ウィンドウID
        WindowClass.hInstance,        // Appインスタンスのハンドル
        NULL                        // ウィンドウ作成データ
    );

    // ウィンドウ表示
    ShowWindow(hWnd, SW_SHOWDEFAULT);
    g_WinHandle[0] = hWnd;

    //if (hWnd) {
    //    MessageBox(hWnd, L"ウィンドウが生成されました.", L"情報", MB_OK);

    //}
    //else {
    //    MessageBox(NULL, L"ウィンドウの生成に失敗しました.", NULL, MB_OK | MB_ICONERROR);
    //}

    //----------------------------------------------------
    //    アプリケーションループ
    //----------------------------------------------------
    AppLoop();

    return 0;

}

//========================================================
//    アプリケーションループ
//========================================================
HRESULT AppLoop()
{
    HRESULT hr = S_OK;

    //----------------------------------------------------
    //    メッセージループ
    //----------------------------------------------------
    bool    bGotMsg;
    MSG        msg;

    msg.message = WM_NULL;
    PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);

    HWND hWnd = g_WinHandle[0];

    while (WM_QUIT != msg.message) {

        // メッセージのチェック
        bGotMsg = (PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE) != 0);

        if (bGotMsg) {
            if (0 == TranslateAccelerator(hWnd, NULL, &msg)) {
                TranslateMessage(&msg);        // 文字メッセージに変換
                DispatchMessage(&msg);        // プロシージャに送出
            }
        }

    }

    return hr;
}


//========================================================
//    メッセージ・プロシージャ
//========================================================
LRESULT CALLBACK MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{

    switch (uMsg){

        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }

    return DefWindowProc(hWnd, uMsg, wParam, lParam);

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Win32 API

    206questions

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