こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ダイアログ表示後に1回だけ実行

ダイアログベースのプログラムで、ダイアログを表示後にメッセージボックスを表示しようとして、下のプログラムのようにしたのですがダイアログが表示される前にメッセージボックスが表示されてしまいます。
ダイアログが表示された直後に1回だけ表示されるようにするにはどうすればいいですか?


#include<Windows.h>
#include "resource.h"
HINSTANCE hinst;
INT_PTR CALLBACK dlgproc(HWND,UINT,WPARAM,LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
hinst=hInstance;
DialogBox(hinst,TEXT("mydlgmain"),NULL,dlgproc);
}
INT_PTR CALLBACK dlgproc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp)
{
TCHAR moji[]=TEXT("ダイアログ表示");
switch(msg)
{
case WM_INITDIALOG:
MessageBox(hwnd,moji,TEXT(""),MB_OK);
return(INT_PTR)TRUE;
case WM_CLOSE:
EndDialog(hwnd,LOWORD(wp));
return (INT_PTR)TRUE;
}
return(INT_PTR)FALSE;
}
--- 実行環境 ---
Microsoft Visual C++ 2010 Express
WIN32 ユニコードビルド
C言語

投稿日時 - 2016-07-16 15:35:11

QNo.9202399

困ってます

質問者が選んだベストアンサー

WM_INITDIALOGは、
表示される前に来るメッセージなので、
動作としては正しいです。

プログラムの可読性が低くなるかもしれないですが、
最初のセットフォーカスやアクティブだとか、
ダイアログ内のコントロールのメッセージを使うとか、
というやりかたです。
いずれにしても、1回だけ行うためのロジックは、
自作する必要があります。
(フォーカス系でメッセージボックスは問題ありか?)

またはメッセージボックスは使わないで、
ダイアログ内のコントロールを、
一時的に変えるってやりかたもあります。

あ。
WM_INITDIALOGで、ユーザー定義のメッセージを自分になげて、
そのなかでやればいいかな?

ま、いろいろ試してみてください。

投稿日時 - 2016-07-16 19:30:10

お礼

回答ありがとうございました。ユーザー定義のメッセージでの方法はよく分からなかったので、別な方法を考えていろいろやってみた結果WM_PAINTの中でメッセージボックスを表示する方法でできました。

投稿日時 - 2016-07-18 14:36:58

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

処理はプログラムを順に動作するとは限らないのです。
といったら語弊が出ますが、
Cは詳しくないですが、出力系は表示されてから次の処理に行くことはないのです。
画面表示の司令を出したら即、次の処理に移ります。
なので先に出したはずの表示が後からになることがあります。
制御したければ画面に表示されたことを確認してから次に進むように
改造せねばなりません。
私はそのロジックはわかりませんので、調べてわからなければ、
https://teratail.com/ にでも聞いてください。
サイトは「C DialogBox」でググってみてください。

投稿日時 - 2016-07-16 15:48:22

お礼

回答ありがとうございました。

投稿日時 - 2016-07-16 20:10:33