AfxMessageBoxの表示位置

[戻る]
えんどう 2004/04/14(水) 14:06:19
AfxMessageBox()でメッセージボックスを表示したのですが
表示する位置をかえるにはどうしたらよいでしょうか?

ダイアログ上にコマンドボタンを配置して
このコマンドボタンをクリックしたときに
表示するメッセージボックスの位置が
ダイアログ上の真中に表示されるので
この位置をずらしたいのです。

επιστημη [E-Mail] [HomePage] 2004/04/14(水) 14:37:11
ソースを読めばわかるけど、AfxMessageBoxは最終的には
Win32-API MessageBox で実現しています。 
で、MessageBox-APIには位置指定の術がないはず。

どうしてもやりたければ自前でこしらえるが吉かと。

r 2004/04/14(水) 15:11:20
MFC のソースを読んでもまずわからないと思うけど、
MFC は強制的に MessageBox-API のメッセージボックスを移動しています。
なので、AfxMessageBox が最終的に行う Win32-API MessageBox も同様に
スクリーンの中央ではなくメインウィンドウなど適当なウィンドウの中央へと強制移動
されます。

http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200304/03040023.txt

επιστημη [E-Mail] [HomePage] 2004/04/14(水) 15:19:35
> MFC は強制的に MessageBox-API のメッセージボックスを移動しています。

そうでした。失礼。
# このからくりが理解できれば思いのままに移動できるわけだが…

n 2004/04/14(水) 17:57:43
こんなからくりです。^^;

MFCではウィンドウ作成時(DoModal()やCreate()等が呼ばれる時)にCBTフックを
掛ける。
 CWnd::CreateDlgIndirect(LPCDLGTEMPLATE,CWnd*,HINSTANCE)
 {
  AfxHookWindowCreate(...);// wincore.cpp line 325
 }
 CWnd::CreateEx(DWORD,LPCTSTR,LPCTSTR,DWORD,int,int,int,int,HWND,HMENU,LPVOID)
 {
  AfxHookWindowCreate(...);// wincore.cpp line 702
 }
 AfxHookWindowCreate()
 {
  pThreadState->m_hHookOldCbtFilter=
   ::SetWindowsHookEx(WH_CBT,_AfxCbtFilterHook,...);// wincore.cpp line 633
 }

インストールされたCBTフックプロシージャはウィンドウの作成を常時監視し、
ウィンドウプロシージャの置き換え(サブクラス化)を行う。
 _AfxCbtFilterHook()
 {
  if (code==HCBT_CREATEWND)
   ::SetWindowLong(...,GWL_WNDPROC,_AfxActivationWndProc);
   // wincore.cpp line 603
 }

サブクラス化されたダイアログにWM_INITDIALOGが来ると中央に移動させられる。
 _AfxActivationWndProc()
 {
  case WM_INITDIALOG:
   _AfxPostInitDialog(...);// wincore.cpp line 416
 }
 _AfxPostInitDialog()
 {
  pWnd->CenterWindow();// wincore.cpp line 134
 }
 CWnd::CenterWindow()
 {
  SetWindowPos(...);// wincore.cpp line 3241
 }

このCBTフックはアプリケーション終了時に解除される。
 AfxWinTerm()
 {
  ::UnhookWindowsHookEx(pThreadState->m_hHookOldCbtFilter);
  // appterm.cpp line 69
 }

古いスレッドには追加発言できません。