2016-07-11 3 views
0

Я создал индивидуальный класс с наследованием CDockablepane в приложении SDI MFC. напр.Изменение размера окна не работает должным образом 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() 
}; 

в .cpp я переопределить функцию OnCreate и 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 
} 

при запуске этого отображает правильно, как присутствует в изображении ниже.

enter image description here

, но после того, как окно изменения размера окна Логин или переместить входа в систему, это отобразить очень плохо. смотрите ниже изображение

enter image description here

Я не знаю, как решить эту проблему. Нужно ли что-то делать в сообщении WM_PAINT или что-то еще. Я много пробовал, но у меня нет выбора. Может кто-нибудь, пожалуйста, помогите мне на этом?

+0

Не сразу понятно, почему вы указываете значения для * X * и * Y * в своем вызове 'SetWindowPos', даже если вы сообщаете системе, что он должен игнорировать эти значения (' SWP_NOMOVE '). В любом случае, ваш вопрос является одним из следующих: '1' Ваш обработчик сообщений 'WM_PAINT' неисправен. '' Ваш обработчик сообщений '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. Как я назвал это окно Login ниже: 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, а не управление, размещенное в Dockwindow. Поэтому для управления я использовал SWP_NOMOVE. – NIKHIL

Смежные вопросы