我创建了一个自定义类,在SDI应用程序MFC中继承了CDockablepane。对于前
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消息或其他内容中执行某些操作。我尝试了很多,但我没有任何选择。 有人可以帮我这个吗??
答案 0 :(得分: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/
答案 1 :(得分:0)
记录在案的MFC绘图问题-移动或调整工具窗口或工具栏的大小时出现断线是Windows的错误,仅在多台显示器上发生。它已在Windows 10 1803中修复,但在1809年重新引入,并于2020年3月在1903和1909年修复。
https://support.microsoft.com/en-us/help/4541335/windows-10-update-kb4541335
知识库文章中的描述(必须展开折叠的链接):
解决了在多监视器环境中拖动时发生的Microsoft Foundation Class(MFC)工具栏的图形问题。