を作成するためにPropSheetを使用することはできません:PropSheetProcでは、私は次の設定を使用して、モードレスプロパティシートを作成しています中心に、プロパティシートダイアログ
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;
、私は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);
}
をしかし、それはどちらか動作しません!
mHwnd = (HWND)PropertySheet(&pshdr);
CenterWindow(mHwnd);
return mHwnd != NULL;
そして、これが作業を行い、負荷の高いシステム上で、しかし、その最終位置まで以上にその初期位置からダイアログが点滅、:
は最後に、私が直接PropSheet呼び出しの後にCenterWindowコールを移動しましたそれは最適ではない。
DLGTEMPLATE構造を変更するためにPropSheetProcを使用することは直感的です。実際、私は他のウィンドウスタイルを適用することができます。しかし、DS_CENTERは効果がないようです。だから私は何が間違っているの?このブローカネスを回避するには多くの方法がありますが、なぜ最初は壊れていますか?
これは良い答えですが、私はPSCB_PRECREATEハンドラのコードを変更してWS_VISIBLEスタイルを解除しました。その後、CenterWindow(hwnd)とShowWindow(hwnd、SW_SHOW)を私の余暇ですることができます。私はプロパティシートでWM_CREATEをキャッチできるとは思わない?ありがとう、結構です。 –