作者damody (天亮damody)
看板C_and_CPP
標題Re: [問題] Dialog 包 class, CALLBACK Proc 處理
時間Sun Jul 29 18:15:00 2012
小弟我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