2011-06-09 246 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