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.
aber nach dem Login-Fenster Größe ändern oder Login-Fenster bewegen, ist es sehr schlecht an. siehe unten Bild
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 ??
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
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
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