无法使用属性表创建居中属性表对话框
Can't use PropSheet to create a centered property sheet dialog
我正在使用以下设置创建一个非模态属性表:
PROPSHEETHEADER pshdr = { 0 };
pshdr.dwSize = sizeof(PROPSHEETHEADER);
pshdr.dwFlags = PSH_NOAPPLYNOW | PSH_PROPSHEETPAGE |
PSH_MODELESS | PSH_USECALLBACK;
pshdr.pfnCallback = PropSheetProc;
pshdr.hwndParent = mGlobalState->trayWin;
pshdr.pszCaption = L"My Settings";
pshdr.nPages = mPages.size();
pshdr.ppsp = mWinPages;
在PropSheetProc中,我捕获PSCB_PRECREATE消息并修改对话框模板,使其获得DS_CENTER样式:
static int CALLBACK
PropSheetProc(HWND hwndDlg, // IN
UINT uMsg, // IN
LPARAM lParam) // IN
{
// Before the dialog is created, bless it with the DS_CENTER style.
if (uMsg == PSCB_PRECREATE) {
DLGTEMPLATE *dlgTemplate = (DLGTEMPLATE *)lParam;
_ASSERT(dlgTemplate);
dlgTemplate->style |= DS_CENTER;
}
return 0;
}
然而,这并不能成功地使对话集中。我试图捕获PSCB_INITIALIZED而不是调用传递给PropSheetProc的hwnd上的CenterWindow方法:
void
CenterWindow(HWND hwndWindow) // IN
{
int nX, nY, nScreenWidth, nScreenHeight;
RECT rectWindow;
nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
GetWindowRect(hwndWindow, &rectWindow);
nX = (nScreenWidth - (rectWindow.right - rectWindow.left)) / 2;
nY = (nScreenHeight - (rectWindow.bottom - rectWindow.top)) / 2;
SetWindowPos(hwndWindow, 0, nX, nY, 0, 0,
SWP_NOZORDER | SWP_NOSIZE);
}
但这也不行!
最后,我将CenterWindow调用直接移动到PropSheet调用之后:
mHwnd = (HWND)PropertySheet(&pshdr);
CenterWindow(mHwnd);
return mHwnd != NULL;
这确实有效,尽管在负载过重的系统上,对话框从初始位置闪烁到最终位置,这是次优的。
使用PropSheetProc来修改DLGTEMPLATE结构看起来很直观。实际上,我可以应用其他窗口样式。但是DS_CENTER似乎没有效果。那么我做错了什么呢?我有很多方法可以解决这种破碎,但为什么它首先是破碎的呢?
重载CPropertySheet的InitialUpdate(),并在那里放置CenterWindow()调用。这发生在窗口在屏幕上绘制之前,但在它被创建之后,所以它的hwnd将是有效的。没有什么东西坏了。必须创建对话框以具有有效的HWND。或者,如果您使用资源编辑器,您可以将其属性设置为居中,并且它将获得相同的结果。为什么要重载属性表的WinProc ?MFC使用消息映射的全部原因是为了消除甚至需要触摸WinProc的。
如果你在SDK风格的应用程序中使用raw win api::
在属性表的WinProc中处理WM_CREATELPARAM中的LPCREATE结构体将包含来自创建调用的有效HWND。只要确保将适当的参数传递回WndProcDefault(),否则窗口创建将失败。
- 如何在Qbutton的帮助下更改Q对话框的宽度
- 当对话框被接受时,如何用参数调用槽
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 如何多次询问来自QML对话框的输入?
- 选择文件对话框错误
- 自定义对话框(源自QDialog)不会关闭(Android)
- 如何在 MFC 对话框中使用 OnDraw
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- 从资源视图访问对话框时出现问题
- 如何检测窗口当前是否正在运行模式对话框?
- "最小化"按钮不会出现在 MFC 对话框中
- 如何获取QNetworkConfiguration UserChoice对话框?
- MFC 对话框属性表用法在 VS 2017 中产生错误,适用于 VS 2013
- 如何在"数据链接属性"对话框中自定义"连接"选项卡?
- 如何以编程方式结束对话框(即属性表)
- 文件属性对话框中的自定义选项卡
- VC++:如何在MFC对话框的属性表顶部显示控件
- 从属性页的事件处理程序调用DoModal()不会弹出对话框
- 无法使用属性表创建居中属性表对话框
- MFC对话框包含文件的属性页在Visual Studio 2008中显示为空