2011-12-06 14 views
0

を作成するために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は効果がないようです。だから私は何が間違っているの?このブローカネスを回避するには多くの方法がありますが、なぜ最初は壊れていますか?

答えて

1

CPropertySheetのInitialUpdate()をオーバーロードし、そこにCenterWindow()呼び出しを配置し​​ます。これは、ウィンドウが画面に描画される前に発生しますが、作成後はhwndが有効になります。何も壊れていない。ダイアログは、有効なHWNDを持つように作成する必要があります。また、リソースエディタを使用して作業する場合、プロパティを中央に設定することができ、同じ結果が得られます。なぜあなたはプロパティシートのWinProcをオーバーロードしていますか? MFCがメッセージマップを使用する全理由は、WinProcのものに触れる必要性を排除することでした。

あなたは、SDKのスタイルのアプリケーション::プロパティシートのWINPROCで

ハンドルWM_CREATEで生の勝利のAPIを使用している場合。 LPARAMのLPCREATE構造体には、create呼び出しからの有効なHWNDが含まれます。適切なパラメータをWndProcDefault()に渡してください。そうしないと、ウィンドウの作成が失敗します。

+0

これは良い答えですが、私はPSCB_PRECREATEハンドラのコードを変更してWS_VISIBLEスタイルを解除しました。その後、CenterWindow(hwnd)とShowWindow(hwnd、SW_SHOW)を私の余暇ですることができます。私はプロパティシートでWM_CREATEをキャッチできるとは思わない?ありがとう、結構です。 –

関連する問題