我有一个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"));
}

08-06 00:11