從雙擊至窗口最大化都發生了什麼

 在研究Duilib框架時的測試小例子,只需在OnSize下斷點,並雙擊標題欄,即會在OnSize中命令斷點,可分析調用流程,解釋見後

	//5、最後,響應了OnSize消息
>	DuiLib_d.dll!DuiLib::WindowImplBase::OnSize(unsigned int uMsg, unsigned int wParam, long lParam, int & bHandled)  行 225	C++
 	DuiLib_d.dll!DuiLib::WindowImplBase::HandleMessage(unsigned int uMsg, unsigned int wParam, long lParam)  行 370 + 0x1f 字節	C++
 	DuiLib_d.dll!DuiLib::CWindowWnd::__WndProc(HWND__ * hWnd, unsigned int uMsg, unsigned int wParam, long lParam)  行 436 + 0x1b 字節	C++
 	user32.dll!__InternalCallWinProc@20()  + 0x2b 字節	
 	user32.dll!UserCallWinProcCheckWow()  + 0x30a 字節	
 	user32.dll!SendMessageWorker()  + 0x26a39 字節	
 	user32.dll!RealDefWindowProcWorker()  + 0x263 字節	
 	user32.dll!RealDefWindowProcW()  + 0x5b 字節	
 	uxtheme.dll!6bd3690f() 	
 	[下面的框架可能不正確和/或缺失,沒有爲 uxtheme.dll 加載符號]	
 	uxtheme.dll!6bd365e8() 	
 	user32.dll!DefWindowProcW()  + 0x263 字節	
 	user32.dll!__InternalCallWinProc@20()  + 0x2b 字節	
 	user32.dll!UserCallWinProcCheckWow()  + 0x30a 字節	
 	user32.dll!CallWindowProcW()  + 0x97 字節
	//4、此處 WM_WINDOWPOSCHANGED 0x47 窗口位置尺寸發生變化
 	DuiLib_d.dll!DuiLib::CWindowWnd::HandleMessage(unsigned int uMsg, unsigned int wParam, long lParam)  行 496 + 0x22 字節	C++
 	DuiLib_d.dll!DuiLib::WindowImplBase::HandleMessage(unsigned int uMsg, unsigned int wParam, long lParam)  行 390	C++
 	DuiLib_d.dll!DuiLib::CWindowWnd::__WndProc(HWND__ * hWnd, unsigned int uMsg, unsigned int wParam, long lParam)  行 436 + 0x1b 字節	C++
 	user32.dll!__InternalCallWinProc@20()  + 0x2b 字節	
 	user32.dll!UserCallWinProcCheckWow()  + 0x30a 字節	
 	user32.dll!DispatchClientMessage()  + 0xf0 字節	
 	user32.dll!___fnINLPWINDOWPOS@4()  + 0x41 字節	
 	ntdll.dll!_KiUserCallbackDispatcher@12()  + 0x36 字節	
 	win32u.dll!_NtUserMessageCall@28()  + 0xc 字節	
 	user32.dll!RealDefWindowProcWorker()  + 0xbd 字節	
 	user32.dll!RealDefWindowProcW()  + 0x5b 字節	
 	uxtheme.dll!6bd4343e() 	
 	uxtheme.dll!6bd431c5() 	
 	uxtheme.dll!6bd36bb8() 	
 	uxtheme.dll!6bd365e8() 	
 	user32.dll!DefWindowProcW()  + 0x263 字節	
 	user32.dll!__InternalCallWinProc@20()  + 0x2b 字節	
 	user32.dll!UserCallWinProcCheckWow()  + 0x30a 字節	
 	user32.dll!CallWindowProcW()  + 0x97 字節	
	//3、此處是DefWindowProcW向窗口發送了命令消息 0x112 WM_SYSCOMMAND wPrarm = 0xF032 窗口最大化命令
 	DuiLib_d.dll!DuiLib::CWindowWnd::HandleMessage(unsigned int uMsg, unsigned int wParam, long lParam)  行 496 + 0x22 字節	C++
 	DuiLib_d.dll!DuiLib::WindowImplBase::OnSysCommand(unsigned int uMsg, unsigned int wParam, long lParam, int & bHandled)  行 257 + 0x14 字節	C++
 	DuiLib_d.dll!DuiLib::WindowImplBase::HandleMessage(unsigned int uMsg, unsigned int wParam, long lParam)  行 372 + 0x1f 字節	C++
 	DuiLib_d.dll!DuiLib::CWindowWnd::__WndProc(HWND__ * hWnd, unsigned int uMsg, unsigned int wParam, long lParam)  行 436 + 0x1b 字節	C++
 	user32.dll!__InternalCallWinProc@20()  + 0x2b 字節	
 	user32.dll!UserCallWinProcCheckWow()  + 0x30a 字節	
 	user32.dll!DispatchClientMessage()  + 0xf0 字節	
 	user32.dll!___fnDWORD@4()  + 0x49 字節	
 	ntdll.dll!_KiUserCallbackDispatcher@12()  + 0x36 字節	
 	win32u.dll!_NtUserMessageCall@28()  + 0xc 字節	
 	user32.dll!RealDefWindowProcWorker()  + 0xbd 字節	
 	user32.dll!RealDefWindowProcW()  + 0x5b 字節	
 	uxtheme.dll!6bd4343e() 	
 	uxtheme.dll!6bd5cbd8() 	
 	uxtheme.dll!6bd36bb8() 	
 	uxtheme.dll!6bd365e8() 	
 	user32.dll!DefWindowProcW()  + 0x263 字節	
 	user32.dll!__InternalCallWinProc@20()  + 0x2b 字節	
 	user32.dll!UserCallWinProcCheckWow()  + 0x30a 字節	
 	user32.dll!CallWindowProcW()  + 0x97 字節	
	//2、此處是 雙擊標題欄的消息 0xa3 WM_NCLBUTTONDBLCLK 
 	DuiLib_d.dll!DuiLib::CWindowWnd::HandleMessage(unsigned int uMsg, unsigned int wParam, long lParam)  行 496 + 0x22 字節	C++
 	DuiLib_d.dll!DuiLib::WindowImplBase::HandleMessage(unsigned int uMsg, unsigned int wParam, long lParam)  行 390	C++
 	DuiLib_d.dll!DuiLib::CWindowWnd::__WndProc(HWND__ * hWnd, unsigned int uMsg, unsigned int wParam, long lParam)  行 436 + 0x1b 字節	C++
 	user32.dll!__InternalCallWinProc@20()  + 0x2b 字節	
 	user32.dll!UserCallWinProcCheckWow()  + 0x30a 字節	
 	user32.dll!DispatchMessageWorker()  + 0x234 字節	
 	user32.dll!_DispatchMessageW@4()  + 0x10 字節
	//1、此處是程序響應的消息循環
 	DuiLib_d.dll!DuiLib::CPaintManagerUI::MessageLoop()  行 2012 + 0xc 字節	C++
 	BDMonSetup.exe!wWinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, wchar_t * lpCmdLine, int nCmdShow)  行 41 + 0x8 字節	C++
 	BDMonSetup.exe!__tmainCRTStartup()  行 547 + 0x2c 字節	C
 	BDMonSetup.exe!wWinMainCRTStartup()  行 371	C
 	kernel32.dll!75fc62c4() 	
 	ntdll.dll!__RtlUserThreadStart()  + 0x2f 字節	
 	ntdll.dll!__RtlUserThreadStart@8()  + 0x1b 字節	

雙擊消息從步驟2開始

2.雙擊標題欄,窗口過程對非客戶區窗口消息進行處理,並用SendMessage向窗口發送窗口最大化的命令

3.窗口過程處理,響應窗口最大化消息,發送窗口,大小位置變化消息

4.窗口過程處理,修改窗口的大小和位置,並調用了OnSize變化的事件

5.OnSize被調用了

 

其中消息之間使用了SendMessage,因此,可以形成上面的堆棧,SendMessage可以相象爲,直接通過窗口過程的地址調用窗口過程

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章