2016-07-11 10 views
0

Ich habe eine benutzerdefinierte Klasse mit erben CDockablepane in SDI-Anwendung MFC erstellt. für BeispielGrößenanpassung Fenster funktioniert nicht richtig 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() 
}; 

in CPP außer Kraft setzen I OnCreate- Funktion und OnSize Funtion

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 
} 

wenn ich es laufen diese in unten Bild korrekt als vorhanden angezeigt wird.

enter image description here

aber nach dem Login-Fenster Größe ändern oder Login-Fenster bewegen, ist es sehr schlecht an. siehe unten Bild

enter image description here

Ich weiß nicht, wie dieses Problem zu beheben. Muss ich etwas in WM_PAINT-Nachricht oder etwas anderes tun. Ich habe viel versucht, aber ich habe keine Wahl. Kann mir bitte jemand dabei helfen ??

+0

Nicht sofort klar, warum Sie Werte für * X * und * Y * in Ihrem Aufruf von SetWindowPos angeben, obwohl Sie das System sagen, dass es diese Werte ignorieren sollte ('SWP_NOMOVE '). Wie auch immer, Ihr Problem ist eines von diesen: '1' Ihr' WM_PAINT' Message Handler ist fehlerhaft. '2' Ihr' WM_ERASEBKGND' Message Handler ist unpassend. '3' In Ihrer Fensterklassenregistrierung fehlen die' CS_HREDRAW'/'CS_VREDRAW' [Fensterklassenstile] (https://msdn.microsoft.com/en-us/library/windows/desktop/ff729176.aspx). Mit anderen Worten: Es ist in dem Code, den wir nicht sehen können. Bitte zeigen Sie [mcve]. – IInspectable

+0

Ich habe WM_PAINT- oder WM_ERASEBKGND-Nachrichten nicht verarbeitet. Wie ich dieses Login-Fenster aufgerufen habe, ist unten dargestellt: CString strLoginPageWnd; \t bNameValid = strLoginPageWnd.LoadString (IDS_LOGINPAGE_WND); \t ASSERT (bNameValid); \t if (m_wndLoginPage.Create (strLoginPageWnd, dieses, 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 ("Fehler beim Erstellen des LoginPage-Fensters \ n"); \t \t zurück FALSCH; // konnte nicht erstellt werden \t} m_wndLoginPage.EnableDocking (CBRS_ALIGN_ANY); \t DockPane (& m_wndLoginPage); – NIKHIL

+1

Wo hast du gelesen, dass du Fensterstile mit Klassenstilen mischen kannst? 'CS_HREDRAW' und' CS_VREDRAW' können nur beim Registrieren einer Fensterklasse verwendet werden. – IInspectable

Antwort

1

Sie möchten die Position ändern, aber warum übergeben Sie SWP_NOMOVE in SetWindowPos?

Wissen Sie, dass Sie in Visual Studio 2015 die Möglichkeit haben, das Dialoglayout mit dynamischen Layouts zu verwalten: https://msdn.microsoft.com/en-us/library/mt270148.aspx? Das beste dynamische Layout-Tutorial ist http://mariusbancila.ro/blog/2015/07/27/dynamic-dialog-layout-for-mfc-in-visual-c-2015/

+0

Ich möchte die Position von Dockwindow nicht im Dockwindow platzierten Steuerelement ändern. Zur Kontrolle habe ich SWP_NOMOVE verwendet. – NIKHIL