Re: [問題] win32 關於proc函式
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):