Я создал индивидуальный класс с наследованием 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
}
при запуске этого отображает правильно, как присутствует в изображении ниже.
, но после того, как окно изменения размера окна Логин или переместить входа в систему, это отобразить очень плохо. смотрите ниже изображение
Я не знаю, как решить эту проблему. Нужно ли что-то делать в сообщении WM_PAINT или что-то еще. Я много пробовал, но у меня нет выбора. Может кто-нибудь, пожалуйста, помогите мне на этом?
Не сразу понятно, почему вы указываете значения для * 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
Я не обрабатывал сообщения 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
Где вы читали, что вы можете смешивать стили окон со стилями классов? 'CS_HREDRAW' и' CS_VREDRAW' могут использоваться только при регистрации класса окна. – IInspectable