先簡單回顧一下。到目前為止,我們已經介紹了:
這裡需要解釋乙個細節。上面提到的兩個視窗類(windows視窗類和sw系統的視窗類)概念有細節差異,不能完全等同。前者是windows sdk中的概念,後者指的是c++視窗類(實現某一類視窗邏輯的c++類)。不過,由於c++視窗類最終也提供registerclass函式,因此把它可以理解為是windows sdk中的視窗類之c++表現。後文除非特殊情況下兩者均簡稱視窗類,不做細節差異上的深究。
winx一直強調簡單易用,視覺化開發。前文我亦已經給過在winx中進行視覺化開發的例子:
那麼,現在就讓我們開始剖析一下,winx是如何做到視覺化介面開發的?
為特定的介面庫製作專用的視覺化編輯工具,這種方式看起來雖然是一種高代價的方式,但幾乎所有的介面庫無一例外地走了這一步。如:vcl,mfc,wxwidgets,qt,**artwin,等等。winx未來亦可能提供專用的視覺化編輯工具。
在沒有專用的視覺化編輯工具時,使用通用的windows資源編輯工具是乙個不錯的主意。這種編輯工具不少,如visual c++的資源編輯器(mfc的視覺化編輯環境依附於它),borland的workshop等等。特點:
winx是有介面庫以來,第乙個支援這種方式開發控制項的庫。通過它你可以讓你的控制項象windows標準控制項(static、edit、listbox、combobox等等)一樣使用。最為關鍵的是,這種控制項比之activex控制項容易理解很多,也輕量很多。通過我下面的解釋你將迅速理解並掌握它。
無論是mfc,atl/wtl,還是我之前寫的sw系統,無一例外地在視窗的create函式上加點東西。
建立視窗**:
呼叫createwindow建立視窗,並將視窗物件pwnd通過附加引數lpparam傳遞;
bool cwnd::createex(dword dwexstyle, lpctstr lpszclassname,
lpctstr lpszwindowname, dword dwstyle,
intx,
inty,
intnwidth,
intnheight,
hwnd hwndparent, hmenu nidorhmenu, lpvoid lpparam)
afxhookwindowcreate(
this
);hwnd hwnd
=::createwindowex(cs.dwexstyle, cs.lpszclass,
cs.lpszname, cs.style, cs.x, cs.y, cs.cx, cs.cy,
cs.hwndparent, cs.hmenu, cs.hinstance, cs.lpcreateparams);if(
!afxunhookwindowcreate())
postncdestroy();
//cleanup if createwindowex fails too soon
...}
template
<
class
tbase,
class
twintraits
>
hwnd cwindowimplbaset
<
tbase, twintraits
>
::create(hwnd hwndparent, rect
&rcpos, lpctstr szwindowname,
dword dwstyle, dword dwexstyle, uint nid, atom atom, lpvoid lpcreateparam)
這意味著,通過程式**動態建立的視窗,與通過對話方塊資源中建立建立子視窗的流程並不一致。所以,通過這些介面庫實現的視窗類,如果不是activex控制項,將不能直接插入到對話方塊中。而在winx中,create視窗物件的過程,直接就是createwindow這個windows api。那麼,問題的關鍵在於,createwindow這個api(或者換句話說對話方塊)為什麼居然可以知道winx中c++視窗類,並且把它new出來?這的確是winx讓人感到magic的地方。我們下面來撥開這個謎團。
對話方塊createdialog初始化流程大概如下:
根據對話方塊資源id,取得對話方塊資源資料。
由對話方塊資源資料,取得對話方塊各個子控制項的初始化資料(詳細參見createwindowex),大概如下:
呼叫createwindowex函式建立子控制項。
createwindowex流程如下:
根據視窗類名,取得視窗類資訊(如視窗過程等)。這一步要求該視窗類已經registerclass。通過視窗類資訊,建立windows核心視窗物件。
傳送wm_nccreate, wm_create等訊息給視窗過程。
返回windows核心視窗物件的控制代碼(hwnd)。
這所有的過程中,除了視窗過程獲得了wm_nccreate, wm_create等訊息外,所有的流程都不受干預。所以關鍵在於winx的視窗過程了。我們看看**:
template
<
class
windowclass,
class
handleclass
=defaultwindowhandle
>
class
window
else
else
}windowmap::setwindow(hwnd, pwnd);
}return
pwnd
->
proces**essage(hwnd, message, wparam, lparam);}};
注:關於其中的windowmap、stackwindowobject等,要了解詳細的資訊,請參見《剖析winx的hello程式》一文。
分析一下,你會覺得很有意思,因為winx支援兩種視窗物件的建立方式:
和mfc、atl/wtl、sw系統類似,c++視窗物件(pwnd)先於windows核心視窗物件(hwnd)生成。首先我們生成視窗物件pwnd,並通過createwindowex附加引數lpparam傳遞。在wm_nccreate訊息中取得pwnd,並將其與視窗控制代碼hwnd關聯。
c++視窗物件(pwnd)後於windows核心視窗物件(hwnd)生成。createwindowex附加引數lpparam傳入null(對話方塊就是這樣做),此時winx會主動new出乙個視窗物件,並將其與視窗控制代碼hwnd關聯。
哈哈,看到這裡你可能會心一笑。現在,你無疑已經知道winx是如何製作windows控制項了。你得承認,沒有比這更容易實現的控制項了。—— 那麼,請始終牢牢記住一點:在winx中,所有視窗類都可以直接放入對話方塊。甚至包括對話方塊,你亦可以將他插入到另乙個對話方塊中(**參考:tutorials/winx/step004-user-ctrl/3.superdialog/hello.cpp
)。
視覺化介面 視覺化互動智慧型辦公介面
在短短乙個月內,小袋已經又和大家分享了如何用m.build搭建具有劃時代意義的智慧型城市以及智慧型建築平台,聊完了城市和建築,今天給大家介紹一下如何通過m.build利用數字孿生技術來優化現在已有的智慧型辦公場景和已有辦公室系統。針對現在在辦公室運營環節中,已有管理系統中,雖然是圍繞三維空間運維所產...
未來我們如何做好資料視覺化?
我們在學資料分析的過程中會接觸很多的知識,比如資料探勘 資料分析等。其中資料分析中最後乙個工作就是資料視覺化,而資料視覺化是資料分析工作中最簡單也是最為重要的一道最後工序,如果資料視覺化做不好,就無法很好地表達資料分析的結果,那麼資料分析做的再好也是無用的,因為無法讓別人理解。由此我們看出資料視覺化...
Redis 視覺化介面工具
現在比較出名的跨平台視覺化介面有兩款,web上的就比較多,但功能不是很強大,沒有native版本的強大。官網地扯 傳送門 原始碼方式安裝 git clone recursive redisdesktopmanager.git b 0.9 rdm cd rdm ubuntu cd src config...