Strange bugs in CXTPDockingPaneAutoHideWnd
Printed From: Codejock Forums
Category: Codejock Products
Forum Name: Docking Pane
Forum Description: Topics Related to Codejock Docking Pane
URL: http://forum.codejock.com/forum_posts.asp?TID=7773
Printed Date: 12 December 2024 at 1:38pm Software Version: Web Wiz Forums 12.04 - http://www.webwizforums.com
Topic: Strange bugs in CXTPDockingPaneAutoHideWnd
Posted By: dbrulhart
Subject: Strange bugs in CXTPDockingPaneAutoHideWnd
Date 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
|
Replies:
Posted By: Oleg
Date Posted: 10 August 2007 at 9:01am
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
|
Posted By: dbrulhart
Date Posted: 10 August 2007 at 9:43am
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()
|
Posted By: Oleg
Date Posted: 13 August 2007 at 1:25am
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
|
Posted By: dbrulhart
Date Posted: 13 August 2007 at 5:41am
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
|
Posted By: dbrulhart
Date Posted: 17 August 2007 at 1:44am
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
|
Posted By: dbrulhart
Date Posted: 17 August 2007 at 8:25am
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
|
Posted By: Oleg
Date Posted: 17 August 2007 at 9:06am
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
|
Posted By: dbrulhart
Date Posted: 17 August 2007 at 9:35am
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
|
Posted By: dbrulhart
Date Posted: 23 August 2007 at 11:11am
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
|
Posted By: dbrulhart
Date Posted: 31 August 2007 at 10:51am
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
|
|