AfxMessageBoxの表示位置 – プログラミング – Home

通知
すべてクリア

AfxMessageBoxの表示位置


えんどう
 えんどう
(@えんどう)
ゲスト
結合: 21年前
投稿: 3
Topic starter  

AfxMessageBox()でメッセージボックスを表示したのですが
表示する位置をかえるにはどうしたらよいでしょうか?

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


引用解決済
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

ソースを読めばわかるけど、AfxMessageBoxは最終的には
Win32-API MessageBox で実現しています。
で、MessageBox-APIには位置指定の術がないはず。

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


返信引用
r
 r
(@r)
ゲスト
結合: 22年前
投稿: 48
 

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

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

> MFC は強制的に MessageBox-API のメッセージボックスを移動しています。

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


返信引用
n
 n
(@n)
ゲスト
結合: 21年前
投稿: 90
 

こんなからくりです。^^;

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
}


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました