看板 C_and_CPP 關於我們 聯絡資訊
小弟我c++程式只有四年經驗,有錯請指正謝謝。 我的理解: 在 windows 中要註冊一個視窗需要一個 static 的 WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam ) 函數 而一個 class 出來時只會有一個 static WndProc 因為你無法動態產生多個 static WndProc 去註冊 Windows 的視窗 不過一個程式也只需要一個 WndProc 就夠了= = 比如說你的 DialogBox 想要接到 keydown 事件 但是要區分是不同的 DialogBox 收到的 可以這樣,先定義 typedef std::map<HWND, int> hwndmap; 這邊的 int 在實際運用上都是寫 class 指標 在 insert 時把 this 指標丟進去 class 中加 static hwndmap m_Map; 註冊視窗時 static int count = 0; m_Map.insert(std::make_pair(window_handle, count)); ++count; 在 WndProc 中可以 case WM_KEYDOWN: { int i = m_Map[hWnd]; printf("%d keydown\n", i); } 寫出來後發現很簡單 個人感覺原po早就會了= = 附上程式: http://damody.googlecode.com/files/test_window.7z 功能很簡單,在 window0 按按鍵 就 printf "0 down" window1 => printf "1 down" 個人不太會寫教學文,大家看不太懂就抱歉了。 而多執行緒的部份就是 把下面這三行 分配到不同的執行緒同時執行 PeekMessage(&msg, m_hWnd, 0, 0, PM_REMOVE) TranslateMessage(&msg); DispatchMessage(&msg); 有什麼好處我一時也想不到, 但壞處是 WndProc 就要多考慮很多同步的東西。 : 補充說明(Supplement): : 想過的替代方案有兩個 : (1) friend CALLBACK DlgProc < 這大概不能真的解決吧 > : (2) class 裡不寫 DlgProc, 以 *DlgProc 做函式指標, : 真正的 DlgProc 直接寫到外面, class member 直接指到外面去。 : 其他進階問題: : (1) 一開始想過先做一個 Base VirDlgClass , : 在 DlgProc 那裡用純虛擬函式, 不過還是卡死, 這種設計應較佳? : (2) 不知道有沒有書專門講視窗程式設計怎麼包 class ? (這是最想知道的) : Win32 聖經是翻完二、三遍, 不過每次要刻的時候就讓人懷念 C++ class 的特性。 : 是沒有要開發完整的 windows class 體系出來,講概念、相關的一些 DP 就行。 : 一個小 sample 動不動就要用 MFC 或安裝其他 library 感覺就沒很好, : 深入淺出那本只講概述原理(是很深入沒錯啦);Open Source 又太大; : 用 C 刻整個變數命名很亂,真的是..一言難盡。 : 謝謝各位先進不吝指教,小弟感激不盡。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.118.175.35 ※ 編輯: damody 來自: 140.118.175.35 (07/29 18:21)
damody:新手版友可以去看一下 GameDesign 版 屍體般的程式系列文 07/29 18:22
EdisonX:你的範例寫得很好耶!!學習了,感謝 !! 07/29 20:09