windows编程,消息函数中拦截消息的问题
生活随笔
收集整理的這篇文章主要介紹了
windows编程,消息函数中拦截消息的问题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
很多年沒有寫windows窗口程序了,今天自制基于vulkan的程序時遇到了一些問題,部分代碼如下:
LRESULT CALLBACK XWindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg) {case WM_CLOSE://PostQuitMessage(0);shouldClose = true;break;case WM_PAINT://run(info);//return 0;break;default:break;}return (DefWindowProc(hWnd, uMsg, wParam, lParam)); }int main() {while (true) {//while1MSG msg;while (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) { //while2TranslateMessage(&msg);DispatchMessage(&msg);}vulkan_render();}上面代碼正常運行,當有消息時,windows處理消息,當沒有消息時執(zhí)行渲染函數(shù)vulkan_render()。
如果改一下代碼:將
case WM_PAINT:break;改為:
case WM_PAINT:return 0;渲染函數(shù) vulkan_render將永遠不會被執(zhí)行,循環(huán)陷入在while2中出不來了。
原因如下 :
WM_PAINT這個消息一般來說并不頻繁,只有當窗口需要重繪時WINDOWS才發(fā)送此消息,比如窗口大小改變,窗口最小化再恢復(fù)時,窗口移出屏幕外再移回來,注意窗口被其它窗口蓋住再重現(xiàn)時不會導(dǎo)致重繪。
如果我們將這個消息在處理函數(shù)中直接return,不給后面?DefWindowProc的處理機會,那么WINDOWS就不知道WM_PAINT被處理過了,于是下一幀仍會向程序發(fā)送WM_PAINT消息。這樣一直循環(huán)下去。
因此,消息處理函數(shù)不要隨便return,除非你很清楚自己在做什么
總結(jié)
以上是生活随笔為你收集整理的windows编程,消息函数中拦截消息的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++用参数返回结果与用返回值返回结果的
- 下一篇: 【转】未能加载文件或程序集或它的某一个依