亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

越想越不明白,到底是怎么回事??該怎么解決?

越想越不明白,到底是怎么回事??該怎么解決?

Smart貓小萌 2022-11-03 22:18:36
我很想辦WNDCLASS的設定 和 WndProc函數分別放在兩個文件中但問題出來了 參數怎么傳遞啊?有人說因為是回調函數,所以不必管它,但不管不行啊?還有 第一個參數HWND hWnd的hWnd不設可以不? 設了好像也沒什么用?因為語句HWND hwnd = CreateWindow(...);在WNDCLASS定義之后,而WndProc的調用是在wndClass.lpfnWndProc = WndProc;語句中,此時還沒有窗口句柄呢!參數中有一個,而后面又定義了一個,不是多此一舉啊?
查看完整描述

3 回答

?
慕萊塢森

TA貢獻1810條經驗 獲得超4個贊

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

查看完整回答
反對 回復 2022-11-08
?
DIEA

TA貢獻1820條經驗 獲得超2個贊

你好:
(1)WNDCLASS的設定 和 WndProc函數是可以不放在同一文件里的,你在定義wndclss之前聲明一下窗口過程處理函數即可,把函數的定義放在另一個文件里

(2)定義HWND hwnd;
hwnd=CreateWindow();
這樣你并沒有重復定義啊

(3)在wndlass定義的參數中是不需要定義窗口句柄的,值是定義了一個你在第一步聲明的過程函數地址即可,你可以好好在看看它的參數

(4)窗口過程函數的地址在窗口類注冊的時候傳給了操作系統,當這個窗口收到消息后,消息dispatch()給了操作系統,操作系統根據窗口過程的地址就找到了處理函數 ,這就是操作系統的回調:即你定義函數體,操作系統幫你調用


查看完整回答
反對 回復 2022-11-08
?
臨摹微笑

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;
}
這個函數是系統調用的,系統自會把參數傳遞過去的,你就不用考慮了,只要按格式寫就行了。


查看完整回答
反對 回復 2022-11-08
  • 3 回答
  • 0 關注
  • 170 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號