我有一个CDockablePane,其中包含基于CTreeCtrl的自定义控件。
当我移动CDockablePane时,所有内容都会正确刷新。当我调整CDockablePane的大小时,所有内容都会正确刷新。当我双击CDockablePane的“标题”(将CDockablePane捕捉到其原始位置)时,CDockablePane显示为白色,没有CTreeCtrl。我必须将鼠标悬停,然后事情开始显示一个树状项目。
我不敢相信这不是“内置”的,我必须缺少一些东西。
这是我的CDockablePane中的OnSize和OnPaint函数。
void CLegendeTreePane::OnSize(UINT nType, int cx, int cy)
{
CDockablePane::OnSize(nType, cx, cy);
if(m_pWndTree)
{
m_pWndTree->SetWindowPos(NULL, -1, -1, cx, cy, SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER);
}
}
void CLegendeTreePane::OnPaint()
{
if(m_pWndTree)
m_pWndTree->AfficheItems();
CDockablePane::OnPaint();
}
因此,我需要添加/修改什么,以便CDockablePane在双击标题调整大小时刷新所有内容?
谢谢!
最佳答案
我遇到了同样的问题,并找到了解决方法。首先,它似乎发生在MDI文档应用程序上,而不是在SDI Document应用程序上。在与VS2010中具有可停靠窗格的新项目进行了比较之后,我试图找到原因。
在我的应用程序中,我正在注册一个新的WNDCLASS并在创建大型机时使用它,以确保使用我的应用程序中的功能FindWindow只能运行一个应用程序。当我进行此更改时,所有内容现在都可以正确显示。
(之前)
BOOL CMDIAppApp::InitInstance()
{
//just before creating doc template
// Register our unique class name that we wish to use
WNDCLASSEX wndcls;
memset(&wndcls, 0, sizeof(WNDCLASSEX)); // start with NULL defaults
wndcls.cbSize = sizeof(WNDCLASSEX);
wndcls.lpfnWndProc = ::DefWindowProc;
wndcls.hInstance = AfxGetInstanceHandle();
wndcls.hIcon = LoadIcon(IDR_MAINFRAME); // or load a different icon
wndcls.hCursor = LoadCursor( IDC_ARROW );
wndcls.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
wndcls.lpszMenuName = NULL;
// Specify our own class name for using FindWindow later
CString csClassName = _T("MyApp");
wndcls.lpszClassName = csClassName;
// Register new class and exit if it fails
if (!RegisterClassEx(&wndcls))
{
TRACE("Class Registration Failed\n");
return false;
}
// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_MDIAppTYPE,
RUNTIME_CLASS(CMDIAppDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CMDIAppView));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
}
并在我的CMainFrame中使用它
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.lpszClass = _T("MyApp");
if( !CMDIFrameWndEx::PreCreateWindow(cs) )
return FALSE;
return TRUE;
}
(后)
删除与您的应用程序中的类注册有关的所有内容,不是我们需要放的所有内容,我们要做的就是修改CMainFrame的PreCreateWindow功能,确保CMainFrame保留所有默认窗口设置并仅更改CMainFrame的ClassName一旦创建
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CMDIFrameWndEx::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
// Check if our class is already defined
LPCTSTR pszClassName = _T("MyApp");
WNDCLASS wndcls;
if (!::GetClassInfo(AfxGetInstanceHandle(), pszClassName, &wndcls))
{
// Get the current requested window class
VERIFY(GetClassInfo(AfxGetInstanceHandle(), cs.lpszClass, &wndcls));
// We want to register this info with our name
wndcls.lpszClassName = pszClassName;
// Need to preset the icon otherwise the function GetIconWndClass
// calling us will overwrite our class.
LPCTSTR pszIcon = MAKEINTRESOURCE(IDR_MAINFRAME);
HINSTANCE hInst = AfxFindResourceHandle(pszIcon, ATL_RT_GROUP_ICON);
_ASSERTE(hInst!=NULL);
wndcls.hIcon = ::LoadIcon(hInst, pszIcon);
// Register our class now and check the outcome
if (!::RegisterClass(&wndcls))
{
_ASSERTE(!__FUNCTION__ "RegisterClass failed");
return FALSE;
}
}
// Now use our class
cs.lpszClass = pszClassName;
return TRUE;
}
确保在应用程序退出后注销课程,通常是在
CMyApp::ExiInstance()
{
::UnregisterClass(_T("MyApp"));
}