GacUI原始碼簡析(一)

2021-07-07 02:34:37 字數 2540 閱讀 7571

gacui原始碼簡析(一)

本文中介紹的 gacui 源**來自於

在 gacui 中,`winmain` 開始後,第乙個執行的函式為 `setupwindowsdirect2drenderer` :

int setupwindowsdirect2drenderer()

int winmaindirect2d(hinstance hinstance, void(*renderermain)())

// destroy controller

destroywindowsnativecontroller(controller);

return

0;}

可以注意到,首先它呼叫了`createwindowsnativecontroller` 得到了乙個 controller,這個 controller 真可謂是 gacui 的核心!但是先不急,我們先來看看 `setcurrentcontroller` 幹了什麼:

inativecontroller* currentcontroller=0;

inativecontroller* getcurrentcontroller()

void setcurrentcontroller(inativecontroller* controller)

可以看出,在 gacui 中有乙個全域性變數 `currentcontroller` 。現在看看這個 controller 到底是何方神聖:

class windowscontroller : public object, public

virtual inativecontroller, public

virtual inativewindowservice

}return defwindowproc(hwnd, umsg, wparam, lparam);

}

也就是說,當訊息來到時,先獲取上文提到的,全域性儲存的 controller,再將真正的訊息處理轉交給 controller。而在 controller 中就可以看到,最後將訊息**給了 `winform`:

windowsform* window=windows.values().get(index);

skipdefaultprocedure=window->handlemessage(hwnd, umsg, wparam, lparam, result);

`winform` 拿到訊息後,會**給 listener:

case wm_mbuttondblclk:

}break;

訊息就這樣**出去了!

direct2dwindowsnativecontrollerlistener則儲存了direct2d、3d需要的一些 factory:

class direct2dwindowsnativecontrollerlistener : public object, public inativecontrollerlistener

else

else}}

getcurrentcontroller()->inputservice()->starttimer();

getpluginmanager()->load();

getglobaltypemanager()->load();

theme::setcurrenttheme(theme.obj());

guimain();

theme::setcurrenttheme(0);

destroypluginmanager();

destroyglobaltypemanager();

threadlocalstorage::disposestorages();}}

}}void windowsinputservice::starttimer()

}void windowsinputservice::stoptimer()

}

timer訊息的處理又由callbackservice負責:

void windowscallbackservice::invokeglobaltimer()

}

順便說一句,gacui 的渲染不是在wm_paint中完成的,是使用這個timer,每 16ms 觸發一次。

執行guimain。通常在guimain中,會出現:

這個run十分直白:}

接著會呼叫 controller 的run

void run(inativewindow* window)

}

呼,程式終於run了起來。

Sample BSP原始碼簡析

ifndef bsp h define bsp h include sdksample.h include filesystemlayer.h filesystemlayer.h 用來處理檔案系統的目錄 路徑等資訊 後面的mfslayer getconfigfilepath就是用了該檔案中定義的類。...

libc hashtable 原始碼簡析

本文分析的是 中截止至 2016 年 1 月 30 日最新的libc libc 中,hashtable的實現為鏈式結構。在教科書 introduction to algorithm 3rd edition 中,介紹的實現是由乙個陣列作為buckets,每個陣列中儲存乙個鍊錶。但是libc 中,使用乙...

HashMap原始碼簡析

hashmap 基於map介面實現的,允許使用null值和null鍵,但資料無序的.劃重點 執行緒不安全.若是想獲取乙個執行緒安全的hashmap,可用下面方法 map map collections.synchronizedmap new hashmap hashmap的主幹是entry陣列,每乙...