3 回答

TA貢獻1810條經驗 獲得超4個贊
回調函數用于異步操作中,就是讓系統等待某個事件發生,并且告訴系統,事件發生后用哪個函數去處理,這個函數就叫回調函數,事件發生后,系統自動調用這個函數。而程序可以去做其它事件,不用等待事件。
這里WndProc這個函數就是告訴系統,接收到消息后就這個函數來處理。
HWND hWnd 這個參數不能不設,因為系統調用這個函數時是認為有這個參數的,你不設,調用就會出錯,這是回調函數,是系統來調用,而不是你自己去調用。
你不用管這個問題,雖然WNDCLASS定義是在CreateWindow之前,但CreateWindow之前是沒有消息的,所以不會調用WndProc,也就不會出錯。wndClass.lpfnWndProc = WndProc;只是讓系統知道消息函數的地址在哪里,在沒有調用DispatchMessage(&msg); 之前是不會調用WndProc的。
這樣解釋不是很好,希望你能理解。

TA貢獻1820條經驗 獲得超2個贊
你好:
(1)WNDCLASS的設定 和 WndProc函數是可以不放在同一文件里的,你在定義wndclss之前聲明一下窗口過程處理函數即可,把函數的定義放在另一個文件里
(2)定義HWND hwnd;
hwnd=CreateWindow();
這樣你并沒有重復定義啊
(3)在wndlass定義的參數中是不需要定義窗口句柄的,值是定義了一個你在第一步聲明的過程函數地址即可,你可以好好在看看它的參數
(4)窗口過程函數的地址在窗口類注冊的時候傳給了操作系統,當這個窗口收到消息后,消息dispatch()給了操作系統,操作系統根據窗口過程的地址就找到了處理函數 ,這就是操作系統的回調:即你定義函數體,操作系統幫你調用

TA貢獻1982條經驗 獲得超2個贊
windowproc函數的四個參數分別對應消息的窗口句柄,消息代碼,消息代碼的兩個參數。一個程序可以有多個窗口,第一個參數標識了消息接收的特定窗口。在窗口過程內部使用switch/case語句來確定窗口過程接收什么消息,以及怎么處理。代碼如下:
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_CHAR:
break;
case WM_PAINT:
break;
case WM_CLOSE:
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
這個函數是系統調用的,系統自會把參數傳遞過去的,你就不用考慮了,只要按格式寫就行了。
- 3 回答
- 0 關注
- 170 瀏覽
添加回答
舉報