re: GUI框架:消息檢查者 cexer 2009-11-22 20:07
@OwnWaterloo
【boost有自己的苦衷。它需要一個簡短的東西來做占位符。】
你誤會我的意思了。我是同意你的,我的意思是確實應該避免使用,因為像 boost,stl 之類的庫很多地使用了這樣的下劃線。
【將_HandlerMapIter改為HandlerMapIter或者HandlerMapIter_真的沒有壞處。
本來就是一個private,庫用戶不可見的名字。屬于Handler,也不會和其他重名。還避免了(可能微乎其微)與_HandlerMapIter宏沖突。】
嗯,明白你的意思。其實這是我的習慣,外部不可見的都加個下劃線在前頭,沒考慮到與標準庫發生沖突的情況,你想的更細致一點。
【boost有自己的苦衷。它需要一個簡短的東西來做占位符。】
你誤會我的意思了。我是同意你的,我的意思是確實應該避免使用,因為像 boost,stl 之類的庫很多地使用了這樣的下劃線。
【將_HandlerMapIter改為HandlerMapIter或者HandlerMapIter_真的沒有壞處。
本來就是一個private,庫用戶不可見的名字。屬于Handler,也不會和其他重名。還避免了(可能微乎其微)與_HandlerMapIter宏沖突。】
嗯,明白你的意思。其實這是我的習慣,外部不可見的都加個下劃線在前頭,沒考慮到與標準庫發生沖突的情況,你想的更細致一點。
re: GUI框架:消息檢查者 cexer 2009-11-22 14:48
@OwnWaterloo
【剛醒…… 一邊吃飯一邊先把不涉及風格的東西解釋一下……】
你們那里沒有出太陽?這么大好時光不要拿來睡覺浪費了。回復完這個,我就出去曬太陽了。
【調用的是子類的函數,使用的是父類的數據(被切割了)……】
函數指針和虛函數的唯一區別就是函數指針少個讀表的動作。所以如果說這樣破壞了“不變式”,那么虛函數也是一樣的。使用子類函數讀父類數據,這種手法是經常被用到各種模式中的,這里也不存在切割問題,因為已經沒有什么可以切割的。
【語言保留的標識符還分了幾種, 統一起來就是以下劃線開始的程序員全都不能使用。】
這只專家們一個很學究氣的建議,跟“謹慎使用內聯函數”一樣的警示級別。因為標準庫的作者確實使用了一些下劃線的變量,boost 也有很多下劃線開始的東西,像占位符 _1,_2,..._n。為了避免名字沖突確實少用為妙,但用了也不應該看作錯誤。
【剛醒…… 一邊吃飯一邊先把不涉及風格的東西解釋一下……】
你們那里沒有出太陽?這么大好時光不要拿來睡覺浪費了。回復完這個,我就出去曬太陽了。
【調用的是子類的函數,使用的是父類的數據(被切割了)……】
函數指針和虛函數的唯一區別就是函數指針少個讀表的動作。所以如果說這樣破壞了“不變式”,那么虛函數也是一樣的。使用子類函數讀父類數據,這種手法是經常被用到各種模式中的,這里也不存在切割問題,因為已經沒有什么可以切割的。
【語言保留的標識符還分了幾種, 統一起來就是以下劃線開始的程序員全都不能使用。】
這只專家們一個很學究氣的建議,跟“謹慎使用內聯函數”一樣的警示級別。因為標準庫的作者確實使用了一些下劃線的變量,boost 也有很多下劃線開始的東西,像占位符 _1,_2,..._n。為了避免名字沖突確實少用為妙,但用了也不應該看作錯誤。
re: GUI框架:消息檢查者 cexer 2009-11-22 13:06
@Loaden
謝謝老鄧!也希望你的框架再進化!
謝謝老鄧!也希望你的框架再進化!
re: GUI框架:消息檢查者 cexer 2009-11-22 12:33
@OwnWaterloo
【強行使用class, 會使得需要定制的時候,就需要定義一個類 —— 其實僅僅需要定制一個函數就可以了。】
這樣的設計也是跟框架的整體設計有關系,以后寫了消息映射者你再看看。倒是沒考慮過使用函數來實現消息檢查者,我更喜歡它有對象的感覺一點,OOP語言嘛,而且類是肯定比函數有大得多的靈活性的。
【有些不需要id,wp,lp的checker該怎么辦呢……需要比id,wp,lp更多參數的checker又該怎么辦呢……】
之所以不需要再需要新的成員數據,是因為消息本身就只有那幾個數據。如果需要檢查更復雜的情況,比如說字符串,這樣的模式也是可以勝任的,以前實現過。在 MessageChecker 當中加一個多態的 Data 成員,它的多態復雜度要比 MessageChecker 本身在堆上分配的小得多,目前沒遇到id,wparam,lparam 三個參數解決不了問題的情況,暫時不會增加這個 Data 成員。
【從msvc和gcc的實現來看,虛指針是切割不掉的,它在父類中。虛表就更不存在切割一說……】
這樣走旁門左道是因為以前確實遇到過虛函數失效的問題,應該不會真是我忘了用指針調用了吧?更可能是編譯器bug,因為指針調用虛函數從小就記得。VC71對于C++標準的支持不是很理想,遇到過很多編譯器報“cl.exe 內部錯誤”,特別是涉及模板的時候。
【是因為這樣可以多態調用,但不能保證子類的不變式……調用的是子類的函數,使用的是父類的數據(被切割了)……】
什么不變式要變式哦,聽起來好討厭,能抓貓的就是牛老鼠。寫出來的程序編譯通過鏈接成功,客戶能運行它的時候覺得心里爽就行了,所有的規則應該是為這個最終的目的服務的,而不應該為規則而規則。
【“for (_HandlerMapIter it = m_map.begin(); it!=m_map.end(); ++it)這個效率是很低的……HandlerMapIter的命名也是不符合c/c++規范的…… 都被Gof帶壞了……】
我倒是并不覺得它的效率很低,因為只是十多次的循環,不過也希望看看你有更有效率的方法。命令風格是被翻炒了千億次的問題了,使程序員從編碼到設計都能保持最大的個性,我覺得正是C++的一大特色。就算有人腰上圍一圈炸彈手執打火機來逼我改風格,我依然視死如歸地覺得自己的命名方式美妙絕倫無以倫比的,堅持風格得有血可流有頭可斷發型不能亂的勇氣啊。所以你就將就著看了。
“規則,風格,效率”,OwnWaterloo兄弟啊,你就是典型的傳說中的學院派 cpper 。很高興又來占我沙發,同時很是抱歉,這篇博文可能讓你失望了。但我會再接再勵,希望后續的文章能引起你的興趣,不負你兩占沙發的厚望。
【強行使用class, 會使得需要定制的時候,就需要定義一個類 —— 其實僅僅需要定制一個函數就可以了。】
這樣的設計也是跟框架的整體設計有關系,以后寫了消息映射者你再看看。倒是沒考慮過使用函數來實現消息檢查者,我更喜歡它有對象的感覺一點,OOP語言嘛,而且類是肯定比函數有大得多的靈活性的。
【有些不需要id,wp,lp的checker該怎么辦呢……需要比id,wp,lp更多參數的checker又該怎么辦呢……】
之所以不需要再需要新的成員數據,是因為消息本身就只有那幾個數據。如果需要檢查更復雜的情況,比如說字符串,這樣的模式也是可以勝任的,以前實現過。在 MessageChecker 當中加一個多態的 Data 成員,它的多態復雜度要比 MessageChecker 本身在堆上分配的小得多,目前沒遇到id,wparam,lparam 三個參數解決不了問題的情況,暫時不會增加這個 Data 成員。
【從msvc和gcc的實現來看,虛指針是切割不掉的,它在父類中。虛表就更不存在切割一說……】
這樣走旁門左道是因為以前確實遇到過虛函數失效的問題,應該不會真是我忘了用指針調用了吧?更可能是編譯器bug,因為指針調用虛函數從小就記得。VC71對于C++標準的支持不是很理想,遇到過很多編譯器報“cl.exe 內部錯誤”,特別是涉及模板的時候。
【是因為這樣可以多態調用,但不能保證子類的不變式……調用的是子類的函數,使用的是父類的數據(被切割了)……】
什么不變式要變式哦,聽起來好討厭,能抓貓的就是牛老鼠。寫出來的程序編譯通過鏈接成功,客戶能運行它的時候覺得心里爽就行了,所有的規則應該是為這個最終的目的服務的,而不應該為規則而規則。
【“for (_HandlerMapIter it = m_map.begin(); it!=m_map.end(); ++it)這個效率是很低的……HandlerMapIter的命名也是不符合c/c++規范的…… 都被Gof帶壞了……】
我倒是并不覺得它的效率很低,因為只是十多次的循環,不過也希望看看你有更有效率的方法。命令風格是被翻炒了千億次的問題了,使程序員從編碼到設計都能保持最大的個性,我覺得正是C++的一大特色。就算有人腰上圍一圈炸彈手執打火機來逼我改風格,我依然視死如歸地覺得自己的命名方式美妙絕倫無以倫比的,堅持風格得有血可流有頭可斷發型不能亂的勇氣啊。所以你就將就著看了。
“規則,風格,效率”,OwnWaterloo兄弟啊,你就是典型的傳說中的學院派 cpper 。很高興又來占我沙發,同時很是抱歉,這篇博文可能讓你失望了。但我會再接再勵,希望后續的文章能引起你的興趣,不負你兩占沙發的厚望。
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-20 17:33
@OwnWaterloo
你的這個需求有點像 java 的 AWT 的 添加 listener 的方式
addWindowListener ( new WindowListener(){
void windowOpened(){ ...... }
void windowClosing(){ ...... }
} );
也有點類似自動化腳本的
onclick = "javascript:{......}"
或者 lua 的
window.onClick = function( arg )
begin
--......
end
確實是很誘人的語法。可惜三種 C++ 都不能實現,boost::lamda 生成的函數對象好像是臨時的吧?也不能這樣保存起來以后再使用。
你的這個需求有點像 java 的 AWT 的 添加 listener 的方式
addWindowListener ( new WindowListener(){
void windowOpened(){ ...... }
void windowClosing(){ ...... }
} );
也有點類似自動化腳本的
onclick = "javascript:{......}"
或者 lua 的
window.onClick = function( arg )
begin
--......
end
確實是很誘人的語法。可惜三種 C++ 都不能實現,boost::lamda 生成的函數對象好像是臨時的吧?也不能這樣保存起來以后再使用。
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-20 17:05
@OwnWaterloo
你說:“如果在修改wc并注冊之前,已經創建了一些窗口呢?
會怎樣? 也會跟著被修改? 不會吧……?”
確實不會。Windows 還沒實現那么神奇的功能,而且沒必要。如果需要同時修改已經創建的窗口,就只能列舉出來一個個地子類化。
你說:“如果在修改wc并注冊之前,已經創建了一些窗口呢?
會怎樣? 也會跟著被修改? 不會吧……?”
確實不會。Windows 還沒實現那么神奇的功能,而且沒必要。如果需要同時修改已經創建的窗口,就只能列舉出來一個個地子類化。
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-20 16:58
@OwnWaterloo
你說:“超類化?”
隨手找了篇文章:http://hi.baidu.com/combojiang/blog/item/45e968b7b8a510f131add11c.html@OwnWaterloo
你說:“跟是否可以函數對象沒什么關系。主要需求是定義這個回調(或者函數對象)的地方最好和使用這個回調的地方比較接近。”
我的意思是,可以定義函數對象代替函數來作為回調。實在是需要純粹的回調函數,也可以在外面定義一個公用的模板,然后在內部定義一個函數對象為參數來具現化這個模板,就獲得了真正的函數地址。不知這個是否與你的需求有所出入?
你說:“超類化?”
隨手找了篇文章:http://hi.baidu.com/combojiang/blog/item/45e968b7b8a510f131add11c.html@OwnWaterloo
你說:“跟是否可以函數對象沒什么關系。主要需求是定義這個回調(或者函數對象)的地方最好和使用這個回調的地方比較接近。”
我的意思是,可以定義函數對象代替函數來作為回調。實在是需要純粹的回調函數,也可以在外面定義一個公用的模板,然后在內部定義一個函數對象為參數來具現化這個模板,就獲得了真正的函數地址。不知這個是否與你的需求有所出入?
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-20 16:42
@OwnWaterloo
你說:“已經注冊過的窗口類,如果要塞context,都需要subclassing。
SetWindowLongPtr( hwnd, GWLP_WNDPROC, insert_context );
然后在insert_context中將context塞進去,SetProp或thunk。
只是GetWindowLongPtr塞不了。”
可以塞的,只是需要超類化(superclassing)之后再塞。子類化(subclassing)在這里不行。但超類化是更需要謹慎使用的東西。
你說:“如何在調用點上創建這個回調函數,而不是在調用點所在函數外。“
C++不能創嵌套函數的,但可以在函數當中創建一個函數對象。你試試看?
你說:“已經注冊過的窗口類,如果要塞context,都需要subclassing。
SetWindowLongPtr( hwnd, GWLP_WNDPROC, insert_context );
然后在insert_context中將context塞進去,SetProp或thunk。
只是GetWindowLongPtr塞不了。”
可以塞的,只是需要超類化(superclassing)之后再塞。子類化(subclassing)在這里不行。但超類化是更需要謹慎使用的東西。
你說:“如何在調用點上創建這個回調函數,而不是在調用點所在函數外。“
C++不能創嵌套函數的,但可以在函數當中創建一個函數對象。你試試看?
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-20 10:00
@OwnWaterloo
你說“那這個成員函數g,就不能在另一個線程中使用。因為table = get_tss_table();是線程相關的。”
首先用表肯定是可以的,比如說我們一個全局表。針對映射表的操作有三種,一種窗口創建時的插入,一種窗口銷毀時的刪除,還有就是窗口消息來時的查詢。創建和銷毀是在調用的 GUI 線程當中進行的,做不到跨線程的創建和銷毀。而查詢時是在 WNDPROC 中進行的,這個函數是由系統調用,也是在 GUI 線程中運行的。既然所有的操作都在同一個 GUI 線程,那何必要用全局表呢,還要加鎖,這不正是 TSS 派上用場的地方嘛。
你說:“GetWindowLongPtr的其他限制”
GetWindowLongPtr 確實有比較大的限制。除了你所說的,對話框,按鈕這類的已經注冊過的窗口類,其 cbWndExtra 都已經是固定的,要想使用 GetWindowLongPtr 來存取額外數據的話,就必須要超類化,這樣的就又麻煩了。所以綜合考慮,SetProp 和 thunk 是最優選擇。
你說:“總之…… win32 gui是很浩瀚的事情…………“
當然是的,不浩翰就沒有辟波斬浪的快感嘛。OwnWaterloo 晚上兩點還堅持在前線?深更半夜的,都在研究些什么高深課題呢?多好的睡覺時間啊,晚上睡得香,白天不嗑睡,早起早睡效率才更高!
你說“那這個成員函數g,就不能在另一個線程中使用。因為table = get_tss_table();是線程相關的。”
首先用表肯定是可以的,比如說我們一個全局表。針對映射表的操作有三種,一種窗口創建時的插入,一種窗口銷毀時的刪除,還有就是窗口消息來時的查詢。創建和銷毀是在調用的 GUI 線程當中進行的,做不到跨線程的創建和銷毀。而查詢時是在 WNDPROC 中進行的,這個函數是由系統調用,也是在 GUI 線程中運行的。既然所有的操作都在同一個 GUI 線程,那何必要用全局表呢,還要加鎖,這不正是 TSS 派上用場的地方嘛。
你說:“GetWindowLongPtr的其他限制”
GetWindowLongPtr 確實有比較大的限制。除了你所說的,對話框,按鈕這類的已經注冊過的窗口類,其 cbWndExtra 都已經是固定的,要想使用 GetWindowLongPtr 來存取額外數據的話,就必須要超類化,這樣的就又麻煩了。所以綜合考慮,SetProp 和 thunk 是最優選擇。
你說:“總之…… win32 gui是很浩瀚的事情…………“
當然是的,不浩翰就沒有辟波斬浪的快感嘛。OwnWaterloo 晚上兩點還堅持在前線?深更半夜的,都在研究些什么高深課題呢?多好的睡覺時間啊,晚上睡得香,白天不嗑睡,早起早睡效率才更高!
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-19 23:21
@OwnWaterloo
你說:“性感誘人吧? 所以我極力推薦這妞……
也正因為誤解很嚴重……
所以用戶代碼訪問 [0, length ) 的幾率還真不大……”
確實非常性感誘惑人,我們不要宣揚了,好東西我們兩知道就好了,哈哈!MSDN真是有點猥瑣。。。實現這么好個功能,卻不知道大書特書,讓那 GWL_USERDATA 忽悠了不知道多少程序員。OwnWaterloo 兄弟,該睡覺了,身體是革命的本錢啊,再聊。
你說:“性感誘人吧? 所以我極力推薦這妞……
也正因為誤解很嚴重……
所以用戶代碼訪問 [0, length ) 的幾率還真不大……”
確實非常性感誘惑人,我們不要宣揚了,好東西我們兩知道就好了,哈哈!MSDN真是有點猥瑣。。。實現這么好個功能,卻不知道大書特書,讓那 GWL_USERDATA 忽悠了不知道多少程序員。OwnWaterloo 兄弟,該睡覺了,身體是革命的本錢啊,再聊。
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-19 23:04
@OwnWaterloo
你說:“我一直都在強調……
GetWindowLongPtr, GWL_USERDATA是普遍被誤解了的……”
哈哈,原來如此。看來我對 GetWindowLongPtr 真是有深深的誤解!和你一番討論挺有收獲的,這樣看來我得再多權衡一下了!這樣的 GetWindowLongPtr 是一個誘人的選擇。看來不看書,只聽道聽途說來的東西真是不行的。可以回頭去睡覺了,多謝了!
你說:“我一直都在強調……
GetWindowLongPtr, GWL_USERDATA是普遍被誤解了的……”
哈哈,原來如此。看來我對 GetWindowLongPtr 真是有深深的誤解!和你一番討論挺有收獲的,這樣看來我得再多權衡一下了!這樣的 GetWindowLongPtr 是一個誘人的選擇。看來不看書,只聽道聽途說來的東西真是不行的。可以回頭去睡覺了,多謝了!
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-19 22:48
@OwnWaterloo
你說的:“
oid f( CWnd* w)
{
CWnd* d = w->GetItem( ... );
d->GetWindowTitle( ... );
}
具體是不是叫這個名字不記得了。
由一個窗口得到上面的控件的窗口,然后取一下標題。
如果w來自另一個線程 …… 等著程序掛吧……
d是一個指針,有主動釋放嗎?
mfc的消息循環還會在odle時清除這種"臨時對象"的指針。
就為了滿足它的table機制,需要在動態內存中創建對象,并使用類似gc的機制去清理……
mfc的大、慢就是這么一點一點的積累出來的。
table這種方式絕不可取……
”
你說的這個是 MFC 的實現嘛,MFC 還在系統中加了鉤子呢。它的這個指針之所以有諸如線程的限制,也是因為實現的功能太雜。我們的 TSS 表可是壓根沒想過要實現這么個“臨時指針”的功能。關于跨線程調用,應該是 API 是怎么樣,跨線程調用成員函數也應該能干啥。TSS 表只是消息到窗口類當中很小的一步,不該影響到窗口類本身的工作。所以函數調用跟 TSS 表一點關系都沒有的,如果一個函數調用因為 TSS 表而崩潰,那就是有問題的實現了。以前用過這種方式實現的,正是考慮到多線程才使用 TSS。
你說的:“
oid f( CWnd* w)
{
CWnd* d = w->GetItem( ... );
d->GetWindowTitle( ... );
}
具體是不是叫這個名字不記得了。
由一個窗口得到上面的控件的窗口,然后取一下標題。
如果w來自另一個線程 …… 等著程序掛吧……
d是一個指針,有主動釋放嗎?
mfc的消息循環還會在odle時清除這種"臨時對象"的指針。
就為了滿足它的table機制,需要在動態內存中創建對象,并使用類似gc的機制去清理……
mfc的大、慢就是這么一點一點的積累出來的。
table這種方式絕不可取……
”
你說的這個是 MFC 的實現嘛,MFC 還在系統中加了鉤子呢。它的這個指針之所以有諸如線程的限制,也是因為實現的功能太雜。我們的 TSS 表可是壓根沒想過要實現這么個“臨時指針”的功能。關于跨線程調用,應該是 API 是怎么樣,跨線程調用成員函數也應該能干啥。TSS 表只是消息到窗口類當中很小的一步,不該影響到窗口類本身的工作。所以函數調用跟 TSS 表一點關系都沒有的,如果一個函數調用因為 TSS 表而崩潰,那就是有問題的實現了。以前用過這種方式實現的,正是考慮到多線程才使用 TSS。
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-19 22:38
@OwnWaterloo
我可沒說不考慮效率哈。別說C++,就算用石頭寫程序,都得考慮效率的。只是效率不是影響一切的標準,特別是當效率的差別微乎其微的時候。我不是不考慮效率,而是覺得用 thunk 實現 GUI 框架的效率不一定就能高多少,因為真正吊車尾的是消息隊列, SetProp 和 thunk 這點微末的時間,相對系統得到事件,生成消息,翻譯消息,發送消息,排隊消息的這一大堆的內部操作的時間來說,短得不值一提。GUI 線程只是用來跑 GUI 的,不能用 GUI 線程來完成分步式計算啊。
用 GetWindowLongPtr 來作為實現框架確實也很簡單,效率也最高。但因為GWL_USERDATAR 的眾所周知而又獨一無二,這個問題是很嚴重的,而且很明顯,OwnWaterloo兄啊,何苦這么執著地為它辯護。。。。要是在廣告中說道,“此 GUI 框架物美價廉童叟無欺,但請不要使用 GWL_USERDATA 因為本框架要使用”,怎么賣得出去啊。
三種方式當中 thunk 和 SetProp 確實是前者優一點,我個人放棄效率而選擇標準一點的實現。至于 GetWindowLongPtr ,現在你就算用左輪手槍指著我的腦袋,我也還是堅持不能用的哈 。
我可沒說不考慮效率哈。別說C++,就算用石頭寫程序,都得考慮效率的。只是效率不是影響一切的標準,特別是當效率的差別微乎其微的時候。我不是不考慮效率,而是覺得用 thunk 實現 GUI 框架的效率不一定就能高多少,因為真正吊車尾的是消息隊列, SetProp 和 thunk 這點微末的時間,相對系統得到事件,生成消息,翻譯消息,發送消息,排隊消息的這一大堆的內部操作的時間來說,短得不值一提。GUI 線程只是用來跑 GUI 的,不能用 GUI 線程來完成分步式計算啊。
用 GetWindowLongPtr 來作為實現框架確實也很簡單,效率也最高。但因為GWL_USERDATAR 的眾所周知而又獨一無二,這個問題是很嚴重的,而且很明顯,OwnWaterloo兄啊,何苦這么執著地為它辯護。。。。要是在廣告中說道,“此 GUI 框架物美價廉童叟無欺,但請不要使用 GWL_USERDATA 因為本框架要使用”,怎么賣得出去啊。
三種方式當中 thunk 和 SetProp 確實是前者優一點,我個人放棄效率而選擇標準一點的實現。至于 GetWindowLongPtr ,現在你就算用左輪手槍指著我的腦袋,我也還是堅持不能用的哈 。
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-19 21:50
@OwnWaterloo
就像你把火箭的點火系統裝到拖拉機上,轟轟烈烈地點燃了拖拉機,它還是不能以宇宙第一速度脫離地球獲得自由一樣。Windows 系統維護消息隊列的時間遠遠多于消息到窗口那一彈指一揮間,我們再努力地擠時間出來也只是尋求心理上的安慰。所以在寫 GUI 框架時我盡量避免的是空間消耗而不是時間。
不過最佩服C++程序員們的一大優點就是,就算只有一點效率也是要打破腦袋擠出來的,有總比沒有好嘛。你們討論的我都認真看到,在效率和安全上 thunk 確實是很明顯的最佳選擇,我在考慮以后用這個了。在利益的誘惑下,心里的負罪感是可以克服的!
還是不敢選 GetWinowLongPtr 。它的好用是世人皆知的,就像一個大美女,人人都想染指一把,很難說在哪個月黑風高的晚上,哪個不愛看文檔的程序員就忍不住用了它,于是崩潰藍屏,整個世界清靜了。。。這樣的事一定會發生的,因為不愛看文檔的人太多了。
SetProp 雖然也有危險,但是那概率小得多。世上的 Windows 程序員有多少,這些 Windows 程序員當中寫 GUI 的又有多少,寫 GUI 的程序員們直接用 API 寫的又有多少,直接用 API 寫的用到 SetProp 的又有多少,用到 SetProp 偏偏又用到和我一樣參數的又有多少呢。我感覺遇到這樣的概率比走路時被不明飛行物砸中的概率還要小。
當然作為一個庫的作者,不能把完全安全性交給概率去解決。不像 GetWindowLongPtr 你只能眼睜等著崩潰,用 SetProp 為了增大安全性可以有很多手段。可以用一個 GUID 來 SetProp( guid .... ) ,可以用圓周率3.14159265。。。。,甚至可以用對女朋友的愛情宣言全文,愛是獨一無二的嘛!
MFC的窗口指針可以在線程間傳遞,只是除了 SendMessage 之外能干的事不多。這跟那個 TSS 表沒多大關系,GUI 很多 API 本身就是不能跨線程。真正不能在線程間傳遞的是 TSS 表本身,我們用 TSS 的目的就是避免線程間的牽扯,當然是不會在線程間傳來傳去的,而且這個表對 GUI 框架的客戶而言是看不到的,想傳也傳不了。TSS 映射表的速度也不如想像中的慢,一個再巨型的 GUI 軟件,能有多少窗口可供映射的呢。
這些方法我都用過。權衡起來,還是覺得 SetProp 是最簡單好用的一個,有興趣的同志可以測試一下在 SetProp 和 thunk 的實現效率差別有多大。我個人覺得在消息隊列吊車尾的情況下,差別不大。
就像你把火箭的點火系統裝到拖拉機上,轟轟烈烈地點燃了拖拉機,它還是不能以宇宙第一速度脫離地球獲得自由一樣。Windows 系統維護消息隊列的時間遠遠多于消息到窗口那一彈指一揮間,我們再努力地擠時間出來也只是尋求心理上的安慰。所以在寫 GUI 框架時我盡量避免的是空間消耗而不是時間。
不過最佩服C++程序員們的一大優點就是,就算只有一點效率也是要打破腦袋擠出來的,有總比沒有好嘛。你們討論的我都認真看到,在效率和安全上 thunk 確實是很明顯的最佳選擇,我在考慮以后用這個了。在利益的誘惑下,心里的負罪感是可以克服的!
還是不敢選 GetWinowLongPtr 。它的好用是世人皆知的,就像一個大美女,人人都想染指一把,很難說在哪個月黑風高的晚上,哪個不愛看文檔的程序員就忍不住用了它,于是崩潰藍屏,整個世界清靜了。。。這樣的事一定會發生的,因為不愛看文檔的人太多了。
SetProp 雖然也有危險,但是那概率小得多。世上的 Windows 程序員有多少,這些 Windows 程序員當中寫 GUI 的又有多少,寫 GUI 的程序員們直接用 API 寫的又有多少,直接用 API 寫的用到 SetProp 的又有多少,用到 SetProp 偏偏又用到和我一樣參數的又有多少呢。我感覺遇到這樣的概率比走路時被不明飛行物砸中的概率還要小。
當然作為一個庫的作者,不能把完全安全性交給概率去解決。不像 GetWindowLongPtr 你只能眼睜等著崩潰,用 SetProp 為了增大安全性可以有很多手段。可以用一個 GUID 來 SetProp( guid .... ) ,可以用圓周率3.14159265。。。。,甚至可以用對女朋友的愛情宣言全文,愛是獨一無二的嘛!
MFC的窗口指針可以在線程間傳遞,只是除了 SendMessage 之外能干的事不多。這跟那個 TSS 表沒多大關系,GUI 很多 API 本身就是不能跨線程。真正不能在線程間傳遞的是 TSS 表本身,我們用 TSS 的目的就是避免線程間的牽扯,當然是不會在線程間傳來傳去的,而且這個表對 GUI 框架的客戶而言是看不到的,想傳也傳不了。TSS 映射表的速度也不如想像中的慢,一個再巨型的 GUI 軟件,能有多少窗口可供映射的呢。
這些方法我都用過。權衡起來,還是覺得 SetProp 是最簡單好用的一個,有興趣的同志可以測試一下在 SetProp 和 thunk 的實現效率差別有多大。我個人覺得在消息隊列吊車尾的情況下,差別不大。
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-19 17:48
@Loaden
thunk 完成的功能只是消息從系統到窗口類的很小一步,也是最需要完成的第一步。在這一步上我嘗試過很多方法,包括這種 thunk 技術,甚至還用過TLS做映射。我目前用的方法很簡單就是 SetProp,GetProp 兩個函數,有點重劍換木劍的感覺。效率上肯定沒有 thunk 的直接調用高,但是心里更踏實一點,在內存當中寫二進制代碼總有在犯罪的感覺。
“過早的優化是一切罪惡的根源”。基于這一步只是整個GUI框架當中是很微小的一步,幾乎不影響框架設計,可以先把框架搭好,再來從安全,效率,可移值性各個方面進行考慮。反正不要選擇 GetWindowLong ,GWLP_USERDATA 那一套,如果發布出去后客戶也使用這個東西就一切全完了,“過時的悲觀毫無益處”。
你的消息封裝看起來很舒服,肯定在 GUI 框架上也是下過很多功夫,喜歡重復制造車輪的的同志,我對這個興趣也比較大,希望以后能多與你多交流互相學習,革命路上并肩攜手一同進步!
thunk 完成的功能只是消息從系統到窗口類的很小一步,也是最需要完成的第一步。在這一步上我嘗試過很多方法,包括這種 thunk 技術,甚至還用過TLS做映射。我目前用的方法很簡單就是 SetProp,GetProp 兩個函數,有點重劍換木劍的感覺。效率上肯定沒有 thunk 的直接調用高,但是心里更踏實一點,在內存當中寫二進制代碼總有在犯罪的感覺。
“過早的優化是一切罪惡的根源”。基于這一步只是整個GUI框架當中是很微小的一步,幾乎不影響框架設計,可以先把框架搭好,再來從安全,效率,可移值性各個方面進行考慮。反正不要選擇 GetWindowLong ,GWLP_USERDATA 那一套,如果發布出去后客戶也使用這個東西就一切全完了,“過時的悲觀毫無益處”。
你的消息封裝看起來很舒服,肯定在 GUI 框架上也是下過很多功夫,喜歡重復制造車輪的的同志,我對這個興趣也比較大,希望以后能多與你多交流互相學習,革命路上并肩攜手一同進步!
re: 拋棄了上一個 GUI 消息機制,重寫了一個更靈活高效的 cexer 2009-11-17 17:14
@暗涌
嗯呵呵
嗯呵呵
re: 拋棄了上一個 GUI 消息機制,重寫了一個更靈活高效的 cexer 2009-11-17 17:13
@XML
那個代碼找不到了,不過實現還記得,以后會寫一下實現。
那個代碼找不到了,不過實現還記得,以后會寫一下實現。
re: 拋棄了上一個 GUI 消息機制,重寫了一個更靈活高效的 cexer 2009-11-17 17:13
@null
讀書千遍其義自現啊,最主要是悶著看代碼。
從示例代碼,最高層開始往底層追溯
讀書千遍其義自現啊,最主要是悶著看代碼。
從示例代碼,最高層開始往底層追溯
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-16 20:16
@OwnWaterloo
模板有一大優勢就是,不必在意類型是否已經存在,就能夠任意調用它的任意成員。這是用虛函數也達不到的,因為虛函數也至少需要提供接口聲明。
ATL這種方式,可以在不知道子類為何物的情況下調用它重寫或者覆蓋的成員。有時候可以完成用虛函數也無法達到的效果。
你試試不用虛函數,不用ATL的這種編譯時的多態手法,在不知道子類為何物的情況下,在基類當中調用子類的方法試試?
模板有一大優勢就是,不必在意類型是否已經存在,就能夠任意調用它的任意成員。這是用虛函數也達不到的,因為虛函數也至少需要提供接口聲明。
ATL這種方式,可以在不知道子類為何物的情況下調用它重寫或者覆蓋的成員。有時候可以完成用虛函數也無法達到的效果。
你試試不用虛函數,不用ATL的這種編譯時的多態手法,在不知道子類為何物的情況下,在基類當中調用子類的方法試試?
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-16 18:08
@OwnWaterloo
我的理解是所謂的ATL-Style,其實是用模板在編譯期手工模擬的一種多態,ATL 的實現當中大量地使用了這種方式,目的就是為了輕量級,幾乎沒用過虛函數。
我覺得這種手法的作用不僅僅限于此,因為可以結合其它的編譯期技術,實現很多虛函數難以達到的功能,我實現 GUI 框架的時候也用到很多這種東西,以后的說明中應該會遇到。
我的理解是所謂的ATL-Style,其實是用模板在編譯期手工模擬的一種多態,ATL 的實現當中大量地使用了這種方式,目的就是為了輕量級,幾乎沒用過虛函數。
我覺得這種手法的作用不僅僅限于此,因為可以結合其它的編譯期技術,實現很多虛函數難以達到的功能,我實現 GUI 框架的時候也用到很多這種東西,以后的說明中應該會遇到。
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-16 17:46
@OwnWaterloo
他少打一個字母!done
他少打一個字母!done
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-16 17:35
@陳梓瀚(vczh)
你說“我跟OwnWaterloo就借著你的地盤版聊了哈”
絕沒問題,歡迎有自己思考的同志來此版聊,如果能切緊GUI框架的主題就感謝了哈,你們的討論能使我的博文增色不少。聊完不要走,此處管飯。
你說“我跟OwnWaterloo就借著你的地盤版聊了哈”
絕沒問題,歡迎有自己思考的同志來此版聊,如果能切緊GUI框架的主題就感謝了哈,你們的討論能使我的博文增色不少。聊完不要走,此處管飯。
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-16 17:07
@俠客西風
呵呵謝謝你能喜歡,其實我對技術的探求不是很深,只是迷戀于一些更簡單更表面的東西。做技術的人其實這樣不是很好。
你就不要準備了,直接把我加進去吧。但我不知道怎么加友情鏈接,在后臺加過好像沒成功。
很高興認識你!
呵呵謝謝你能喜歡,其實我對技術的探求不是很深,只是迷戀于一些更簡單更表面的東西。做技術的人其實這樣不是很好。
你就不要準備了,直接把我加進去吧。但我不知道怎么加友情鏈接,在后臺加過好像沒成功。
很高興認識你!
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-16 17:03
@矩陣操作
謝謝,很高興又認識志同道合的朋友。以后請多指教!
謝謝,很高興又認識志同道合的朋友。以后請多指教!
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-16 17:01
@OwnWaterloo
@陳梓瀚(vczh)
討論了那么多,突然發現怎么兩位同志的觀點都扭轉了?
“C++中實現屬性”這個問題也是討論過千百遍的了,而且注定是誰都無法說服誰的問題,因為它不純粹是一個技術問題。很大程序上和性格喜歡相關。就好像實用主義點的程序員,肯定覺得這樣費盡力氣去模仿不值得,但藝術氣質一點的程序員,覺得屬性的語法看起來很漂亮。然后各自用自己的偏好去說服對方,肯定不能成功。
我個人的觀點是,有總比沒有好。存在即合理,要不然怎么會那么多的語言提供語言級的屬性支持了。C++當中比這個急迫要解決的問題還很多,但可以預見,屬性這東西在未來的某個C++標準當中一定會出現的,它確實有著不可磨滅的價值。
但你們的討論里各自的觀點都很有道理,里面包含的有技術含量的思考很多,我看過也很有收獲。所以請你們在友好和諧的氣氛當中繼續嘗試說服對方吧,無論是什么樣的討論都是思想的碰撞,也是學習的很好的方式。
@陳梓瀚(vczh)
討論了那么多,突然發現怎么兩位同志的觀點都扭轉了?
“C++中實現屬性”這個問題也是討論過千百遍的了,而且注定是誰都無法說服誰的問題,因為它不純粹是一個技術問題。很大程序上和性格喜歡相關。就好像實用主義點的程序員,肯定覺得這樣費盡力氣去模仿不值得,但藝術氣質一點的程序員,覺得屬性的語法看起來很漂亮。然后各自用自己的偏好去說服對方,肯定不能成功。
我個人的觀點是,有總比沒有好。存在即合理,要不然怎么會那么多的語言提供語言級的屬性支持了。C++當中比這個急迫要解決的問題還很多,但可以預見,屬性這東西在未來的某個C++標準當中一定會出現的,它確實有著不可磨滅的價值。
但你們的討論里各自的觀點都很有道理,里面包含的有技術含量的思考很多,我看過也很有收獲。所以請你們在友好和諧的氣氛當中繼續嘗試說服對方吧,無論是什么樣的討論都是思想的碰撞,也是學習的很好的方式。
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-16 13:45
@OwnWaterloo
謝謝你分享你的思考,真的很有創意。建議你可以把你的思考寫到你的博客里,讓更多的人看到。
@陳梓瀚(vczh)
高效的,不會制造麻煩的東西,也是從不高效的,會制造麻煩的東西進化來的。所以我覺得只要在思考都是有價值的。
謝謝你分享你的思考,真的很有創意。建議你可以把你的思考寫到你的博客里,讓更多的人看到。
@陳梓瀚(vczh)
高效的,不會制造麻煩的東西,也是從不高效的,會制造麻煩的東西進化來的。所以我覺得只要在思考都是有價值的。
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-15 22:08
@空明流轉
好的,是這樣的,《2012》說的是地球毀滅的故事,好了我說完了。
哈哈!
好的,是這樣的,《2012》說的是地球毀滅的故事,好了我說完了。
哈哈!
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-15 22:07
@OwnWaterloo
你說“我想到一個幾乎沒有消耗的方案……我再完善一下……”
加油,出來了別忘了寫出來大家分享。
你說“我想到一個幾乎沒有消耗的方案……我再完善一下……”
加油,出來了別忘了寫出來大家分享。
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-15 20:13
@OwnWaterloo
你說“我去看了看Imperfect C++。因為是英文的,以前只看了一部分就停了……我覺得前面都寫得不錯,ABI、mangling這些問題確實是很困擾……我繼續去看書中怎么實現的……”
在C++里面屬性只是看起來很美的東西,其實用性和想像的有差距。你說得對,用方法能實現所有的功能,所以我的GUI框架已經去掉了屬性支持。
你說“我以前了解的實現方式,每一個proxy至少得帶一個指針……這消耗還是蠻嚴重的……”
不一定得帶指針的。比如《C++ Imperfect》里實現的屬性是不需要帶指針的,但它不被C++標準支持,應用有限制。我也實現了不需要帶指針的屬性,同時也是跟C++標準相容的,以后會說一下這個實現。
你說“我去看了看Imperfect C++。因為是英文的,以前只看了一部分就停了……我覺得前面都寫得不錯,ABI、mangling這些問題確實是很困擾……我繼續去看書中怎么實現的……”
在C++里面屬性只是看起來很美的東西,其實用性和想像的有差距。你說得對,用方法能實現所有的功能,所以我的GUI框架已經去掉了屬性支持。
你說“我以前了解的實現方式,每一個proxy至少得帶一個指針……這消耗還是蠻嚴重的……”
不一定得帶指針的。比如《C++ Imperfect》里實現的屬性是不需要帶指針的,但它不被C++標準支持,應用有限制。我也實現了不需要帶指針的屬性,同時也是跟C++標準相容的,以后會說一下這個實現。
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-15 19:08
@OwnWaterloo
你說“沒有完整的,就是你blog上發的一些片段……”
我找找看,找到了也給你一分。那些片段隱藏了實現的,看不出什么有價值的東西。
你說“沒有完整的,就是你blog上發的一些片段……”
我找找看,找到了也給你一分。那些片段隱藏了實現的,看不出什么有價值的東西。
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-15 19:07
@WXX
你說“如果單就消息的派發,那么一個gui框架可以很容易實現,但是要很好的管理窗口之間的關系,很好的處理鍵盤加速鍵,鼠標等這些交互就麻煩了,考慮消息的過濾等。”
各有難處,但我覺得后者更容易一點,以前我也都做過一些。我覺得好的框架應該是在所有東西之前的。先有骨架,然后再說高矮胖瘦。長得是否高大健壯,陽光帥氣,就先看骨架如何了。
你說“如果單就消息的派發,那么一個gui框架可以很容易實現,但是要很好的管理窗口之間的關系,很好的處理鍵盤加速鍵,鼠標等這些交互就麻煩了,考慮消息的過濾等。”
各有難處,但我覺得后者更容易一點,以前我也都做過一些。我覺得好的框架應該是在所有東西之前的。先有骨架,然后再說高矮胖瘦。長得是否高大健壯,陽光帥氣,就先看骨架如何了。
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-15 19:01
@OwnWaterloo
你說“哦 原來是property模擬。”
嗯就是這樣的。
你說“這個代理對象也是要占空間的吧?”
理論上來說不要占空間的,但實際是占用一個字節的。因為C++標準規定不允許存在0空間占用的成員變量,因為那會造成 &object.member1,&object.memeber2 兩個地址完全相同的情況。
你說“哦 原來是property模擬。”
嗯就是這樣的。
你說“這個代理對象也是要占空間的吧?”
理論上來說不要占空間的,但實際是占用一個字節的。因為C++標準規定不允許存在0空間占用的成員變量,因為那會造成 &object.member1,&object.memeber2 兩個地址完全相同的情況。
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-15 18:53
@OwnWaterloo
你說的“接下來,框架將message 分派到onXXX之后,客戶再將onXXX轉發(forwarding)自己的handler這個過程,我相信是可以編譯時確定的。
——因為我看過你以前的一些實現~_~”
你說的這個是以前另一個版本的框架了,跟這個完全不一樣了哦。你看那份代碼,它的消息映射是編譯期自動進行的,映射者,檢查者,分解者三個角色都是由一個東西全部完成的。我將寫的這個版本不一樣,是完全分離的實現,沒有那種編譯期映射的功能,但運行時映射可以獲得更大的擴展性。
可惜啊,以前那個版本的框架代碼我已經找不到了。你那里有?
你說的“以我很好奇window是如何零成本完成映射與轉發,并且是一個空對象的。映射肯定需要在某個地方做,可能不是window。運行時可更改轉發目的地而不使用數據, 好像…… 太不可思議了……”
看來你有點誤會我的意思了,肯定內存當中是有一個 std:map 之類的映射數據存在的。我說的0成本指的是 window.onCreated 這個成員的實現。
你說的“接下來,框架將message 分派到onXXX之后,客戶再將onXXX轉發(forwarding)自己的handler這個過程,我相信是可以編譯時確定的。
——因為我看過你以前的一些實現~_~”
你說的這個是以前另一個版本的框架了,跟這個完全不一樣了哦。你看那份代碼,它的消息映射是編譯期自動進行的,映射者,檢查者,分解者三個角色都是由一個東西全部完成的。我將寫的這個版本不一樣,是完全分離的實現,沒有那種編譯期映射的功能,但運行時映射可以獲得更大的擴展性。
可惜啊,以前那個版本的框架代碼我已經找不到了。你那里有?
你說的“以我很好奇window是如何零成本完成映射與轉發,并且是一個空對象的。映射肯定需要在某個地方做,可能不是window。運行時可更改轉發目的地而不使用數據, 好像…… 太不可思議了……”
看來你有點誤會我的意思了,肯定內存當中是有一個 std:map 之類的映射數據存在的。我說的0成本指的是 window.onCreated 這個成員的實現。
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-15 18:48
@OwnWaterloo
這個消息映射者的實現沒有數據成員,沒有虛函數存在,它其實就是一個調用,所以它也是有時間成本的。是的,所以我說是接近0成本,而不是真正的0成本。畢竟世界上沒有那樣傳說的員工。但如果好的編譯期可以輕松優化掉這個小小調用。
你說不可思議,那倒沒到那個境界哈。你可以看看《Imperfect C++》當中的method_property的實現,跟那個很類似,不過他的實現不符合C++標準,應范圍有限。
用這種消息映射者的方式,我也實現了值主義的屬性,比如:
window.size = Size( 100,100 );
Size size = window.size;
從理論上來說,也接近0成本的。
這個消息映射者的實現沒有數據成員,沒有虛函數存在,它其實就是一個調用,所以它也是有時間成本的。是的,所以我說是接近0成本,而不是真正的0成本。畢竟世界上沒有那樣傳說的員工。但如果好的編譯期可以輕松優化掉這個小小調用。
你說不可思議,那倒沒到那個境界哈。你可以看看《Imperfect C++》當中的method_property的實現,跟那個很類似,不過他的實現不符合C++標準,應范圍有限。
用這種消息映射者的方式,我也實現了值主義的屬性,比如:
window.size = Size( 100,100 );
Size size = window.size;
從理論上來說,也接近0成本的。
re: GUI框架:談談框架,寫寫代碼 cexer 2009-11-15 18:24
@OwnWaterloo
謝謝沙發,后面會詳細說說這個消息映射者的實現
謝謝沙發,后面會詳細說說這個消息映射者的實現
re: 線程相關的單件模式(Thread-Specific Singelton) cexer 2009-09-01 12:15
@stidio
這個設計是設計給不跨線程的應用的,主要考慮在這種應用下,如果線程太多,都去查詢同一個全局的東西,大多數線程都一直處于等待資源的狀態,比較浪費CPU時間。
這是在公司時寫的哈,出來后倒沒寫了,感覺是人越來越懶了,寫程序越來越沒激情
這個設計是設計給不跨線程的應用的,主要考慮在這種應用下,如果線程太多,都去查詢同一個全局的東西,大多數線程都一直處于等待資源的狀態,比較浪費CPU時間。
這是在公司時寫的哈,出來后倒沒寫了,感覺是人越來越懶了,寫程序越來越沒激情
re: 給Windows的記事本添加上下翻頁功能(1)[原創][未登錄] cexer 2009-04-27 15:46
以前也研究過逆向,現在想來還真是有精力
整天在黑漆漆的反匯編里轉
還是C++的世界光明啊
http://www.pediy.com/bbshtml/bbs8/pediy8-266.htm
http://www.pediy.com/bbshtml/bbs8/pediy8-260.htm
整天在黑漆漆的反匯編里轉
還是C++的世界光明啊
http://www.pediy.com/bbshtml/bbs8/pediy8-266.htm
http://www.pediy.com/bbshtml/bbs8/pediy8-260.htm
re: 使用Gflags來檢測heap問題 cexer 2008-09-27 15:41
我覺得這種有點奇巧淫技的意思,不過調起BUG來真方便。多謝!
re: 垃圾收集的那點事(J) cexer 2008-09-23 17:40
@LOGOS
多謝了,我也研究研究。
多謝了,我也研究研究。
re: 垃圾收集的那點事(J) cexer 2008-09-23 10:32
哪里有下載的源碼
re: 狗,哈士奇,跳蚤,繼承,聚合,UpCast和DownCast cexer 2008-09-20 14:47
多重繼承的時候,使用C風格的轉換,可能會出亂子。
re: 甘特圖1.0.0β發布 cexer 2008-09-07 17:43
well done!
re: 用至少三種方法實現1+2+...+n cexer 2008-09-05 19:34
template<int i>
struct sum
{
enum{ result=sum<i-1>::result }
}
template<>
struct sum<1>
{
enum {result = 1 };
}
result = sum<n>::result;
struct sum
{
enum{ result=sum<i-1>::result }
}
template<>
struct sum<1>
{
enum {result = 1 };
}
result = sum<n>::result;
re: GUI Preview Demo完成! cexer 2008-08-26 13:35
@陳梓瀚(vczh)
是的,那東西還要再修改一下。
是的,那東西還要再修改一下。
re: GUI Preview Demo完成! cexer 2008-08-26 10:35
鑒于CPPBLOG上批判者多于探討者,炫耀者多于分享者,陳同學分享代碼是一個不容易的決定,謝謝并支持!!
re: KWinGUI的一個DEMO cexer 2008-08-26 10:34
我那個消息機制我自己已經放棄了,不過還是愿意與你探討探討。加我的QQ41086722
re: 自己寫的一個GUI框架的消息機制 cexer 2008-08-26 10:23
@proguru
最近就會寫的。
最近就會寫的。
re: 實現 GUI 消息映射的數據結構:消息的模板 cexer 2008-08-26 10:20
@陳梓瀚(vczh)
不過如果你不接受類成員指針的話,那么你還是接受interface吧。僅僅接受一般函數會喪失很多能力的。
我寫這個日志的主題在于實現一個通用的消息映射的數據結構,至于消息處理函數是是成員函數或自由函數,不在討論范圍內,并且那個很簡單,也不用單獨寫篇日志。
不過如果你不接受類成員指針的話,那么你還是接受interface吧。僅僅接受一般函數會喪失很多能力的。
我寫這個日志的主題在于實現一個通用的消息映射的數據結構,至于消息處理函數是是成員函數或自由函數,不在討論范圍內,并且那個很簡單,也不用單獨寫篇日志。
re: 實現 GUI 消息映射的數據結構:消息的模板 cexer 2008-08-26 10:14
@陳梓瀚(vczh)
現在只是封裝映射的前半部分,下一篇會封裝消息處理函數的類型。
現在只是封裝映射的前半部分,下一篇會封裝消息處理函數的類型。
re: 實現 GUI 消息映射的數據結構:消息的模板 cexer 2008-08-26 09:53
@LOGOS
為什么說用一個for是不行的呢?這兒只是個示范。不一定非得用map。
為什么說用一個for是不行的呢?這兒只是個示范。不一定非得用map。