Strange bugs in CXTPDockingPaneAutoHideWnd |
Post Reply |
Author | |
dbrulhart
Groupie Joined: 19 October 2006 Location: Switzerland Status: Offline Points: 38 |
Post Options
Thanks(0)
Posted: 10 August 2007 at 7:52am |
Hi Oleg,
Two strange behaviors in CXTPDockingPaneAutoHideWnd:
1) If drag and dropping something from a AutoHide docked pane in the main view, then the implementation of CXTPDockingPaneAutoHideWnd::OnClose() calls the standard MFC CFrameWnd::OnClose() which calls CanCloseFrame() then SaveModified() which popups a MessageBox asking to Save the document...
Definitely a bug... I think
CXTPDockingPaneAutoHideWnd::OnClose() shouldn't call CFrameWnd::OnClose() or implement its own way od closing the window. 2) When opening an AutoHide pane or passing from an AutoHide to another, most of the time the main view is drawn on top of the AutoHide panes, or part of it. It gets better when disabling the autohide animation, but still there. Reproducable all the time. Very annoying.
Sorry to be a boring Newbie ;-)
Thanks for our quick support as ever.
Dominique
|
|
Oleg
Admin Group Joined: 21 May 2003 Location: United States Status: Offline Points: 11234 |
Post Options
Thanks(0)
|
Hello,
1. I can't reproduce it with our GUI_VisualStudio sample. I drop from Help pane to main view.
Think you attaching some CView to pane directly without parent CFrameWnd.
Please show full stack.
2. Set clip styles for View and Frame:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{ // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE; cs.style |= WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
return TRUE;
} |
|
Oleg, Support Team
CODEJOCK SOFTWARE SOLUTIONS |
|
dbrulhart
Groupie Joined: 19 October 2006 Location: Switzerland Status: Offline Points: 38 |
Post Options
Thanks(0)
|
Hi Oleg, Issue 2 seems OK now. Thanks for the fix. Issue 1: I create all views that way :
CWnd *pWnd = (CWnd *)pClass->CreateObject();
pWnd->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW & ~WS_BORDER, CRect(0,0,0,0), this, nID, &context); pWnd->SetOwner( this);("this" is the CMDIChildWnd implementing the DockingPaneManager)
Maybe SetOwner() is not enough ?
Please find full call stack below. CFrameWnd::OnClose() learly get the active document and calls CanCloseFrame()... not really logical for the AutoHide frame.
Thanks a lot again
Dominique
ntdll.dll!7c90eb94()
user32.dll!77d491be() user32.dll!77d491f1() mfc71ud.dll!AfxInternalPumpMessage() Line 158 + 0x13 C++ mfc71ud.dll!CWinThread::PumpMessage() Line 916 C++ mfc71ud.dll!AfxPumpMessage() Line 195 + 0xb C++ mfc71ud.dll!CWnd::RunModalLoop(unsigned long dwFlags=4) Line 4566 + 0x5 C++ mfc71ud.dll!CDialog::DoModal() Line 527 + 0xc C++ MTCommonUIud.dll!MTCommonUIMessageBox(CWnd * pParentWnd=0x00000000, const wchar_t * pszText=0x0a371560, const wchar_t * pszCaption=0x014a2270, unsigned int uType=3, const _GUID & guidMessageID={...}) Line 3215 + 0xb C++ MTCommonUIud.dll!MTCommonUIMessageBox(const wchar_t * pszText=0x0a371560, const wchar_t * pszCaption=0x014a2270, unsigned int uType=3, const _GUID & guidMessageID={...}) Line 3162 + 0x17 C++ Pyramix.exe!CEDLDoc::SaveModified() Line 12415 + 0x1c C++ mfc71ud.dll!CDocument::CanCloseFrame(CFrameWnd * pFrameArg=0x0a36a908) Line 195 C++ mfc71ud.dll!CFrameWnd::OnClose() Line 785 + 0x18 C++ > ToolkitPro1113vc71UD.dll!CXTPDockingPaneAutoHideWnd::OnClose() Line 403 C++ mfc71ud.dll!CWnd::OnWndMsg(unsigned int message=16, unsigned int wParam=0, long lParam=0, long * pResult=0x0012f898) Line 2023 C++ mfc71ud.dll!CWnd::WindowProc(unsigned int message=16, unsigned int wParam=0, long lParam=0) Line 1745 + 0x1e C++ mfc71ud.dll!AfxCallWndProc(CWnd * pWnd=0x0a36a908, HWND__ * hWnd=0x001b0e88, unsigned int nMsg=16, unsigned int wParam=0, long lParam=0) Line 241 + 0x1a C++ mfc71ud.dll!AfxWndProc(HWND__ * hWnd=0x001b0e88, unsigned int nMsg=16, unsigned int wParam=0, long lParam=0) Line 389 C++ mfc71ud.dll!AfxWndProcBase(HWND__ * hWnd=0x001b0e88, unsigned int nMsg=16, unsigned int wParam=0, long lParam=0) Line 209 + 0x15 C++ user32.dll!77d48734() user32.dll!77d48816() user32.dll!77d4c63f() user32.dll!77d4c665() ToolkitPro1113vc71UD.dll!CXTPSkinManagerApiHook::CallWindowProcOrig(long (HWND__ *, unsigned int, unsigned int, long)* lpPrevWndFunc=0x7c3b06a0, HWND__ * hWnd=0x001b0e88, unsigned int Msg=16, unsigned int wParam=0, long lParam=0) Line 213 + 0x19 C++ ToolkitPro1113vc71UD.dll!CXTPSkinManager::DoCallWindowProc(long (HWND__ *, unsigned int, unsigned int, long)* lpPrevWndFunc=0x7c3b06a0, HWND__ * hWnd=0x001b0e88, unsigned int Msg=16, unsigned int wParam=0, long lParam=0) Line 641 C++ ToolkitPro1113vc71UD.dll!CXTPSkinManager::HookWndProc(HWND__ * hWnd=0x001b0e88, unsigned int message=16, unsigned int wParam=0, long lParam=0) Line 696 + 0x19 C++ user32.dll!77d48734() user32.dll!77d48816() user32.dll!77d489cd() ntdll.dll!7c915b4f() mfc71ud.dll!CThreadLocal<AFX_MODULE_THREAD_STATE>::GetData() Line 177 + 0xd C++ user32.dll!77d48a10() mfc71ud.dll!AfxInternalPumpMessage() Line 188 C++ mfc71ud.dll!CWinThread::PumpMessage() Line 916 C++ mfc71ud.dll!CWinThread::Run() Line 637 + 0xb C++ mfc71ud.dll!CWinApp::Run() Line 701 C++ mfc71ud.dll!AfxWinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, wchar_t * lpCmdLine=0x0002085a, int nCmdShow=1) Line 49 + 0xb C++ Pyramix.exe!wWinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, wchar_t * lpCmdLine=0x0002085a, int nCmdShow=1) Line 25 C++ Pyramix.exe!wWinMainCRTStartup() Line 390 + 0x39 C kernel32.dll!7c816fd7() ntdll.dll!7c915b4f() |
|
Oleg
Admin Group Joined: 21 May 2003 Location: United States Status: Offline Points: 11234 |
Post Options
Thanks(0)
|
Hello,
As I wrote you create view without parent CFrameWnd. Instead Attach method you can use AttachView - it will create View, its parent frame and attach it to pane. See sources of CXTPDockingPane::AttachView
|
|
Oleg, Support Team
CODEJOCK SOFTWARE SOLUTIONS |
|
dbrulhart
Groupie Joined: 19 October 2006 Location: Switzerland Status: Offline Points: 38 |
Post Options
Thanks(0)
|
Hi Oleg,
Just tried with AttachView... exact same behavior.
CXTPDockingPaneAutoHideWnd::OnClose() calls CFrameWnd::OnClose() and then CDocument* pDocument = GetActiveDocument() returns the main document which is modified...
I can override CXTPDockingPaneAutoHideWnd::OnClose() to avoid this, but I think this should be done in the toolkit itself...
Thanks again for your quick support
Dominique
|
|
dbrulhart
Groupie Joined: 19 October 2006 Location: Switzerland Status: Offline Points: 38 |
Post Options
Thanks(0)
|
Hi Oleg,
I tried overiding CXTPDockingPaneManager to be able to generate my own CXTPDockingPaneAutoHidePanel that implements its own CXTPDockingPaneAutoHideWnd... but CXTPDockingPaneAutoHidePanel::ShowPane() is not virtual... so I have to overide all methods calling it as well... not the solution...
Is there any hook anywhere that I could use to bypass CXTPDockingPaneAutoHideWnd::OnClose or better CFrameWnd::OnClose() ?
I really have to find a way as we're releasing an important release very soon and this is still an open issue. Thanks a lot again
Dominique
|
|
dbrulhart
Groupie Joined: 19 October 2006 Location: Switzerland Status: Offline Points: 38 |
Post Options
Thanks(0)
|
Hi Oleg,
After more investigation and looking at your samples, I guess I no understand why it works in your samples. It's just because you always give a NULL docment to the AttachView() function.
The problem in our app is that we have 8 different views that are on docking panes and they all have to have their Document properly set. It CANNOT be NULL... these Views interact together with and through the Document.
Any ideas how we could solve this ?
In fact we should just find a way to set the CXTPDockingPaneAutoHideWnd document to NULL, or overide its virtual GetActiveDocument() to return NULL.
Any easy way of doing so ?
Thanks again for your help
Dominique
|
|
Oleg
Admin Group Joined: 21 May 2003 Location: United States Status: Offline Points: 11234 |
Post Options
Thanks(0)
|
Hello, I tried to add Document but still can't reproduce. May be you manually close/destroy pane after drag and drop ?
|
|
Oleg, Support Team
CODEJOCK SOFTWARE SOLUTIONS |
|
dbrulhart
Groupie Joined: 19 October 2006 Location: Switzerland Status: Offline Points: 38 |
Post Options
Thanks(0)
|
Hi Oleg,
No, I don't close the the pane manually, I just let things happen.
It also happens without drag & drop. If the view inside the pane has the focus then when clicking in the main view, the focus goes to the main, the pane closes automatically and he message appears.
If just passing the mouse over the pane button, the pane opens and then moving out of the pane, then it closes without message.
The message appears only if the view in the pane got the focus then looses it.
I hope it helps
Thanks again
Dominique
|
|
dbrulhart
Groupie Joined: 19 October 2006 Location: Switzerland Status: Offline Points: 38 |
Post Options
Thanks(0)
|
Hi Oleg,
Somebody from our team found a solution for this problem.
Just have to call CDocument::UpdateFrameCounts() after the views and frames are created so CDocument::CanCloseFrame() properly does its job when closing CXTPDockingPaneAutoHideWnds.
Thanks again for your time on this one
Cheers,
Dominique
|
|
dbrulhart
Groupie Joined: 19 October 2006 Location: Switzerland Status: Offline Points: 38 |
Post Options
Thanks(0)
|
Hi Oleg,
Previous solution with UpdateFramesCount() doesn't work either.
We found another solution: overidding CDocument::CanCloseFrame() and allow closing frames here if the given frame is not the main CMDIChildWnd().
For all those interested, this is our current status.
Thanks to all
Dominique
|
|
Post Reply | |
Tweet
|
Forum Jump | Forum Permissions You cannot post new topics in this forum You cannot reply to topics in this forum You cannot delete your posts in this forum You cannot edit your posts in this forum You cannot create polls in this forum You cannot vote in polls in this forum |