'wabc'庫用作開發windows桌面程式,若你很擅長windows sdk程式設計的方式,會發現,'wabc'很適合你,它很小巧,但很高效,裡面封裝了一套訊息處理框架,能極大減少訊息處理的工作量。此系列文章主要介紹如何利用wabc庫提供的功能開發桌面程式。
新建乙個.exe的空win32專案,命名example1,然後新建'winmain.h'和『winmain.cpp'檔案,將下面的內容拷貝到裡面去。
winmain.**件
#pragma once
#include "wabc.h"
class main_wnd :public wabc::wndbase
bool on_destroy(wabc::msg_destroy &msg)
bool on_paint(wabc::dcclass &dc, const rect &rtclip, wabc::msg_paint &msg)
};
winmain.cpp檔案
#include "winmain.h"
int winapi winmain(hinstance hinstance, hinstance hprevinstance,
pstr szcmdline, int icmdshow)
return int(msg.wparam);
}main_wnd::main_wnd()
編譯執行,將會看到如下的介面:
wnd.create()用作建立視窗,當wnd物件生成時候,其對應的視窗並沒有建立,必須顯式的呼叫其成員函式create才會建立。
wabc::wndbase派生的class,都能使用wabc庫的訊息對映框架。注意,wabc::wndbase的派生類,必須是單根繼承,不能多重繼承。下面以main_wnd為例,說明做訊息對映的步驟和關鍵點。首先要先宣告乙個對映槽(mapslot):
class main_wnd : public wabc::wndbase
;
這裡只宣告了乙個對映槽,若想宣告多個對映槽,請用wabc_declare_msg_mapex巨集。
在main_wnd預設的建構函式裡,構造訊息對映。wabc_begin_msg_map和wabc_end_msg_map必須成對出現,中間,是對映的函式。訊息對映的實質,是定義乙個static陣列,在wabc_end_msg_map的時候,將定義的陣列加入到main_wnd的對映鍊錶。
wabc_begin_msg_map裡的引數不是多餘,它確保了所對映函式的物件,其型別是一樣的。
wabc_end_msg_map使用第乙個對映槽,並假設this是乙個wndbase物件(這意味著能接收訊息)。除了wabc_end_msg_map,還有wabc_end_msg_mapex,起的作用和wabc_end_msg_map一樣,但可以做更多的控制。
在main_wnd::on_paint裡,用一把黑色的刷子填充視窗:
dc.fill(rtclip, dc.black_brush());
black_brush是dc的屬性,dc.black_brush()相當於呼叫hbrush(::getstockobject(int(black_brush)))。由於這實現很簡單,所以,編譯器能將dc.black_brush() inline化,從而去掉呼叫函式的開銷。關於wabc庫里屬性實現的原理,請檢視「用c++模擬屬性」一文。
dcclass有許多屬性,這裡不一一枚舉,具體請看"w_dc.h"
對於wm_create和wm_destroy訊息,wabc庫會確保其對映的函式都會被呼叫,其它訊息則不是這樣。對於wm_create訊息,最先對映的函式會最先呼叫,而wm_destroy訊息,最後對映的最先呼叫。具體原因請看「win32訊息對映7-視窗的建立和登出」一文。
在wabc庫,其對映函式的型別基本都是如下所示:
bool on_***(wabc::msg_*** &msg);
但偶爾也有例外,如wm_paint對應的函式型別:
bool on_paint(dcclass &dc, wabc::rect &rtclip, wabc::msg_paint &msg);
對映訊息的時候,對映的巨集基本都會和相應的訊息名稱對應。如wm_create對應wabc_on_create,wm_destroy對應wabc_on_destroy等等。
對映的訊息,其本質是乙個static陣列,必須保證,這陣列按訊息從小到大排序。在上面的例子裡,因為wm_destroyrelease版本的.exe檔案,在筆者機器上大小為22k,這足以證明wabc庫的小巧,發布的時候,並不需要另外的執行庫。當windows程式設計入門以後,會發現,越簡單的東西越好,很多時候,並不需要龐大的第三方庫支援。用第三庫,很多時候,只是需要它的訊息對映機制,其它的,並不重要。『wabc'庫產生的原因在於此。訊息對映的處理佔了wabc庫原始碼的一大部分,其它部分,都是為了方便的呼叫api。
wabc庫編譯說明
wabc 庫用作開發windows桌面程式,使用c 語言,以最小化的集合封裝了常用的windows api,幷包含一套訊息處理框架。它源 很小,不到500k,但很高效,使用的時候完全可以包含在自己的工程裡。wabc 庫的目錄結構如下 wabc dlib include lib src wabc 其中...
初學Linux及其程式設計1 HelloWorld
今日打算開始學習linux,就以此作為學習記錄的平台吧。今日之小小白,明日的小白,後日的牛牛 一 序言 1.工欲善其事,必先利其器。安裝了ubuntu13.04,安裝了vim編輯器,可以 開始小小白之旅了。打字的這個時候超級懷念windows下的sogo的輸入 法,ubuntu下的sunpinyin...
程式設計 函式庫 動態庫 靜態庫
通常被認為是函式庫,說白了就是乙個檔案,檔案中包含大量的函式實現的二進位制 指令 比如我們所使用printf函式 動態庫 鏈結動態庫生成可執行程式,並沒有把庫中函式的實現指令直接拿過來寫入可執行程式中,而是在可執行程式中記錄了庫中函式的符號資訊。優缺點 生成可執行程式比較小,執行時動態庫被載入到記憶...