2016-07-11 39 views
0

SDockアプリケーションMFCでCDockablepaneを継承してカスタマイズされたクラスを作成しました。例えば、 .cppファイルでサイズ変更ウィンドウが正しく動作しないMFC

class CLoginPage : public CDockablePane 
{ 
    public: 
    CLoginPage(); 
protected: 
    CStatic lbl_username; 
    CStatic lbl_password; 
    CEdit txt_username; 
    CEdit txt_password; 
    CButton btn_login; 
    CButton btn_Signup; 
protected: 
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); 
    afx_msg void OnSize(UINT nType, int cx, int cy); 

    DECLARE_MESSAGE_MAP() 
}; 

私はこれを実行すると、それは下の画像内に存在すると正しく表示される機能とOnSize関数目的球

int CLoginPage::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
    if (CDockablePane::OnCreate(lpCreateStruct) == -1) 
     return -1; 

    if(!lbl_username.Create(_T("User Name"), WS_CHILD | WS_VISIBLE, CRect(150, 150, 100, 30), this, ID_STATIC_USERNAME)) 
    { 
     TRACE0("Failed to create userName in LoginPage window\n"); 
     return -1; 
    } 
......................................same for other control 
} 


void CLoginPage::OnSize(UINT nType, int cx, int cy) 
{ 
    CDockablePane::OnSize(nType, cx, cy); 

    // Tab control should cover the whole client area: 
    CRect rectClient; 
    this->GetWindowRect(rectClient); 

    lbl_username.SetWindowPos (NULL, rectClient.left+150, rectClient.top+150, 100, 30, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER); 
.............................same for other control 
} 

をOnCreate関数オーバーライドします。

enter image description here

が、サイズ変更、ログインウィンドウまたは移動ログインウィンドウの後に、それは非常に悪いが表示されます。私はこれを解決する方法がわからない画像

enter image description here

下記参照してください。 WM_PAINTメッセージなどで何かする必要がありますか?私はたくさん試しましたが、私はどんなオプションも得られません。 誰かが私にこれを助けてもらえますか?

+0

です。システムを伝えているにもかかわらず、 'SetWindowPos'の呼び出しで* X *と* Y *の値を指定する理由は、すぐには分かりません。これらの値を無視する必要があります(' SWP_NOMOVE ')。とにかく、あなたの問題は次のいずれかです: '1'あなたの' WM_PAINT'メッセージハンドラはバグです。 '2'あなたの' WM_ERASEBKGND'メッセージハンドラは不適切です。 '3'あなたのウィンドウクラスの登録に' CS_HREDRAW'/'CS_VREDRAW' [ウィンドウクラススタイル](https://msdn.microsoft.com/en-us/library/windows/desktop/ff729176.aspx)がありません。言い換えれば、それは私たちが見ることができないコードにあります。 [mcve]を表示してください。 – IInspectable

+0

私はWM_PAINTまたはWM_ERASEBKGNDメッセージを処理していません。私がこのログインウィンドウをどのように呼んだかは以下の通りです:CString strLoginPageWnd; \t bNameValid = strLoginPageWnd.LoadString(IDS_LOGINPAGE_WND); \t ASSERT(bNameValid); \t場合(m_wndLoginPage.Create(strLoginPageWnd、これ、CRectは(0、0、200、200)、TRUE、ID_VIEW_LOGINPAGEWND、WS_CHILD |!WS_VISIBLE | WS_CLIPSIBLINGS | CBRS_TOP | CS_HREDRAW | CS_VREDRAW | CBRS_FLOAT_MULTI)) \t { \t \t TRACE0( "LoginPageウィンドウの作成に失敗しました\ n"); \t \t return FALSE; //作成に失敗しました \t} m_wndLoginPage.EnableDocking(CBRS_ALIGN_ANY); \t DockPane(&m_wndLoginPage); – NIKHIL

+1

どこでクラススタイルとウィンドウスタイルを混ぜることができるのですか? 'CS_HREDRAW'と' CS_VREDRAW'は、ウィンドウクラスの登録時にのみ使用できます。 – IInspectable

答えて

1

位置を変更したいが、なぜSWP_NOMOVEをSetWindowPosに渡すのですか?

Visual Studio 2015では、ダイナミックレイアウトを使用してダイアログレイアウトを管理することができます:https://msdn.microsoft.com/en-us/library/mt270148.aspx?最適な動的レイアウトのチュートリアルはhttp://mariusbancila.ro/blog/2015/07/27/dynamic-dialog-layout-for-mfc-in-visual-c-2015/

+0

Dockwindowに置かれたコントロールではないドックウィンドウの位置を変更したい。したがって、私はSWP_NOMOVEを使用しました。 – NIKHIL

関連する問題