2011-06-09 99 views
1

在MFC中使用Visual Studio C++。我如何將MessageBox放到它的父窗口中?目前它以桌面爲中心。C++:如何居中MessageBox?

+2

在MessageBox調用之前使用PostMessage()。在你的消息處理程序中,使用EnumWindows找到你想要的消息框和MoveWindow。 – 2011-06-09 22:17:04

+0

消息框有類#32770,它應該可以幫助你找到它 – 2011-06-09 22:21:11

回答

0

你不能。這就是爲什麼很多人編寫自己的MessageBox類。

3

:: AfxMessageBox()出現在MainFrame的中心。這基本上是一個對MainFrame的句柄作爲第一個參數的:: MessageBox()的調用。這不適合你嗎?

+0

不適用於我。它有可能是以應用程序的「MainFrame」爲中心的,但我需要它集中在我的CDialog派生的對話框中(這是我從中調用MessageBox/AfxMessageBox的地方)。 – User 2011-06-14 00:23:46

0

誰說「不行」?

試試這個:

這是Win32 API中,用C寫的,因爲你需要翻譯嗎?

case WM_NOTIFY:{ 
    HWND X=FindWindow("#32770",NULL); 
    if(GetParent(X)==H_frame){int Px,Py,Sx,Sy; RECT R1,R2; 
    GetWindowRect(hwnd,&R1); GetWindowRect(X,&R2); 
    Sx=R2.right-R2.left,Px=R1.left+(R1.right-R1.left)/2-Sx/2; 
    Sy=R2.bottom-R2.top,Py=R1.top+(R1.bottom-R1.top)/2-Sy/2; 
    MoveWindow(X,Px,Py,Sx,Sy,1); 
    } 
} break; 

是添加到WndProc中的代碼。您可以設置爲位置你喜歡,在這種情況下,它只是在主程序窗口的中心。它會爲任何消息框,文件打開/保存對話框以及可能的其他本機控件執行此操作。我不確定,但我想你可能需要包含COMMCTRL或COMMDLG來使用它,至少,如果你想打開/保存對話框,你會。

我試着查看NMHDR的通知代碼和hwndFrom,然後確定它同樣有效,而且更容易,而不是。如果你真的想要非常具體,告訴FindWindow尋找你想要它找到的窗口的唯一標題(標題)。

此消息在屏幕上繪製之前觸發,因此如果您設置全局標誌以指示何時由代碼完成操作並查找唯一標題,則確保您執行的操作只會發生一次將可能是多個通知器)。我沒有詳細探討這一點,但我管理得到CreateWindow將一個編輯框放在消息框對話框中。它看起來不合適,就像老鼠的耳朵嫁接到克隆豬的脊椎上一樣,但它起作用。以這種方式做事可能比自己做起來要容易得多。

烏鴉。

編輯:小糾正處理由雷蒙德提出的問題。確保父母手柄始終保持一致,並且這應該可以正常工作。它對我來說,即使有兩個相同的程序實例...

+2

請注意,這將找到* a *消息框,而不一定是* your *消息框。 – 2012-05-25 20:32:25

+0

沒有問題... 用if(GetParent(X)== H_frame)替換'if(X)'',並且程序中的文件對話框和消息框也由H_frame或任何句柄名稱來管理,其值將會是唯一的,所以即使同一個程序的多個實例也能安全地共存。 – 2012-05-26 00:13:11