Re: [問題] win32 關於proc函式

看板C_and_CPP作者 (莉莉姆)時間14年前 (2009/12/29 03:34), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《QQ29 (我愛阿蓉)》之銘言: : 請教各位 : 我一直很不解 : 假如我有個"主視窗" 和一個 "button" : 主視窗我利用wc.lpfnWndProc = MainWndProc; 註冊這callback函式 : hWnd = CreateWindowEx(...) <=這邊有個hWndParent參數設定NULL : 我理解上應該就是主視窗沒有parent 所以傳入null... : 而在button的視窗註冊如以下 : wc.lpfnWndProc = BtnWndProc; // Callback function : 而我在他的WM_CREATE 會呼叫的函式中寫 : CreateWindow(...) 這邊的hWndParent我填上BtnWndProc收到的 hwnd : 不解的是 這個hwnd 是哪來的??? 呼叫CreateWindow時(回傳之前)會直接在你對應的WndProc收到WM_CREATE訊息 (意謂著沒呼叫CreateWindow的話你根本不會收到該視窗的WM_CREATE訊息) 我看不太瞭解你在誰的WM_CREATE裡面去呼叫button的CreateWindow 按理來說你會在主視窗的WM_CREATE去呼叫button的CreateWindow 所以你這個時刻的hwnd應該是主視窗的,但是你又說"填上BtnWndProc收到的" 所有在視窗對應的WndProc收到的hwnd都代表著目前發生該事件的視窗的handle 因為你在註冊視窗類型時所"指定的WndProc是代表著所有這個視窗類型的 實體都會共用的",所以你需要有handle來辨別到底是"哪個視窗實體"有訊息要處理 : 我一直想不透 每個視窗都有Proc : 函式 而他是以什麼方式定義說我要呼叫哪一個Proc函式 : 是哪個函式有跟系統說 我現在這視窗的message是送給哪個proc function 是你在呼叫RegisterClass()並帶入wc時跟系統說的 在這裡系統會知道所有是wc.lpszClassName類型的視窗 他們的訊息都要被送去wc.lpfnWndProc處理 : 我認為是createWindow(裡面填的hwnd) 但是這hwnd是從 上面講的Proc函式傳進來的(傳 : 進來是啥??) : 讓我百思不解.... : 而且為啥createWindow要再WM_CREATE裡面做呢? 上面有提到 是因為呼叫了CreateWindow才會發生WM_CREATE訊息 所以應該是你誤會了 : 如果我填了hWndParent 而沒有標上WS_CHILD又會怎麼樣= = 不會怎麼樣 就只是跟系統說你目前create的視窗是hWndParent這個視窗所擁有的 但它並不是一個子視窗 : 現在有點混亂~~ : 主要就是想問 到底是怎麼知道我該處發哪個Proc函式@@ WndProc都是透過你呼叫DispatchMessage()時系統幫你觸發的 一般用法時你不用自己觸發 : 另外又有一個疑惑... : wc.lpszClassName 有設定class name : 可是...CreateWindow( LPCTSTR lpClassName, : 怎麼又設定一次class name了..... wc.lpszClassName的設定只是在你呼叫RegisterClass時讓系統 知道你自訂的"視窗類別"叫什麼名字 CreateWindow帶入的lpClassName是要讓系統知道 你現在是要create"那一種名字"的視窗類別的"實體" : 整個架構好混亂 請指點迷津... : 謝謝各位 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.37.95

12/29 10:42, , 1F
推一下:)
12/29 10:42, 1F
文章代碼(AID): #1BEGWxp2 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BEGWxp2 (C_and_CPP)