3 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
回調(diào)函數(shù)用于異步操作中,就是讓系統(tǒng)等待某個(gè)事件發(fā)生,并且告訴系統(tǒng),事件發(fā)生后用哪個(gè)函數(shù)去處理,這個(gè)函數(shù)就叫回調(diào)函數(shù),事件發(fā)生后,系統(tǒng)自動(dòng)調(diào)用這個(gè)函數(shù)。而程序可以去做其它事件,不用等待事件。
這里WndProc這個(gè)函數(shù)就是告訴系統(tǒng),接收到消息后就這個(gè)函數(shù)來(lái)處理。
HWND hWnd 這個(gè)參數(shù)不能不設(shè),因?yàn)橄到y(tǒng)調(diào)用這個(gè)函數(shù)時(shí)是認(rèn)為有這個(gè)參數(shù)的,你不設(shè),調(diào)用就會(huì)出錯(cuò),這是回調(diào)函數(shù),是系統(tǒng)來(lái)調(diào)用,而不是你自己去調(diào)用。
你不用管這個(gè)問(wèn)題,雖然WNDCLASS定義是在CreateWindow之前,但CreateWindow之前是沒(méi)有消息的,所以不會(huì)調(diào)用WndProc,也就不會(huì)出錯(cuò)。wndClass.lpfnWndProc = WndProc;只是讓系統(tǒng)知道消息函數(shù)的地址在哪里,在沒(méi)有調(diào)用DispatchMessage(&msg); 之前是不會(huì)調(diào)用WndProc的。
這樣解釋不是很好,希望你能理解。

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

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
windowproc函數(shù)的四個(gè)參數(shù)分別對(duì)應(yīng)消息的窗口句柄,消息代碼,消息代碼的兩個(gè)參數(shù)。一個(gè)程序可以有多個(gè)窗口,第一個(gè)參數(shù)標(biāo)識(shí)了消息接收的特定窗口。在窗口過(guò)程內(nèi)部使用switch/case語(yǔ)句來(lái)確定窗口過(guò)程接收什么消息,以及怎么處理。代碼如下:
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;
}
這個(gè)函數(shù)是系統(tǒng)調(diào)用的,系統(tǒng)自會(huì)把參數(shù)傳遞過(guò)去的,你就不用考慮了,只要按格式寫(xiě)就行了。
- 3 回答
- 0 關(guān)注
- 165 瀏覽
添加回答
舉報(bào)