自已實現乙個UI庫 實現Windows的乙個模擬器

2021-07-03 14:30:44 字數 3602 閱讀 2915

實現windows的乙個模擬器

接上一節的實現的介面,在windows裡面寫乙個簡單的模擬器,在上面能操作上一節裡面的介面動作。

開啟vs,建立乙個解決方案,把ui的**作了乙個單獨的lib庫,再建立乙個帶窗體的工程,ui的畫圖就畫在乙個窗體的客戶區dc中.

首先定義乙個對dc的畫圖操作,對應上一節的ui_drivedrawapi 介面. 如果直接操作窗體的dc畫圖是很慢的,會看到繪圖的過程,所以需要用到雙快取,在乙個快取畫好以後,再把畫好的貼到dc中,基本完整的定義如下:

如定義在 uiwindrawapi.cpp 和實檔案 uiwindrawapi.h中

hwnd g_hwnd; /*窗體的控制代碼*/

hdc g_hdc;

hdc hmemdc; /*記憶體dc*/

hdc holddc;

hbitmap hmembitmap;

extern tuiscreen screen;

static ui_drivedrawapi _driverdrawapiwin = ;

hbrush hbrush = createsolidbrush(screen.pixelcolor);

fillrect(hmemdc,&rect, hbrush);

int win_getscreenx()

rect rect;

getwindowrect(g_hwnd, &rect);

return rect.right - rect.left + 1;

int win_getscreeny()

rect rect;

getwindowrect(g_hwnd, &rect);

return rect.bottom - rect.top + 1;

screen 是ui裡用來記錄一些基本的變數值的,如上面用到的解析度的大小.

int apientry _twinmain(hinstance hinstance,

hinstance hprevinstance,

lptstr lpcmdline,

int ncmdshow)

unreferenced_parameter(hprevinstance);

unreferenced_parameter(lpcmdline);

msg msg;

haccel hacceltable;

loadstring(hinstance, idc_t1, szwindowclass, max_loadstring);

myregisterclass(hinstance);

if (!initinstance (hinstance, ncmdshow))

return false;

hacceltable = loadaccelerators(hinstance, makeintresource(idc_t1));

win_init();

uimain();

while (getmessage(&msg, null, 0, 0))

if (!translateaccelerator(msg.hwnd, hacceltable, &msg))

translatemessage(&msg);

dispatchmessage(&msg);

win_refresh();

return (int) msg.wparam;

上面vs工程裡的主過程看起來是這樣的:

win_init(), uimain(), win_refresh() 方法是加進去的。

win_init()方法是對環境的初始化,如上面的畫圖api的初始化,

uimain是ui畫圖的操作。

win_refresh ui介面的重新整理操作,這個會在後面實現。

還需要在窗體中的initinstance裡的加一些**:

bool initinstance(hinstance hinstance, int ncmdshow)

hwnd hwnd;

hinst = hinstance; // 將?實害?例句?柄括?存?儲洹?在ú全?局?變?量?中d

cw_usedefault, 0, cw_usedefault, 0, null, null, hinstance, null);

if (!hwnd)

return false;

#if 1

showwindow(hwnd, ncmdshow);

#else

showwindow(hwnd, sw_showmaximized);

setmenu(hwnd, null);

setwindowlong(hwnd, gwl_style,

getwindowlong(hwnd, gwl_style) &

ws_maximizebox); // 去ǎ?掉?ws_maximizebox風?格?

showwindow(hwnd, sw_maximize); // 最?大洙?化ˉ顯?式?窗洹?口ú

#endif

updatewindow(hwnd);

g_hwnd = hwnd;

return true;

如上面的執行時把窗體最大化,隱藏選單,工具欄等.

g_hwnd 是在前面在 uiwindrawapi.cpp中定義的,這裡需要初始化它.

再看 win_init,這個如我們放在乙個 uiwinadapter.cpp的裡面實現:

void win_init()

win_initdrawapi();

ui_init();

win_initdrawapi就是前面定義的,ui_init是初始化ui庫里的一些東西,後面再說到實現。

前面的uimain()可以看成是ui執行畫圖的乙個起點,如放在乙個uitest.cpp裡面完成:

void uimain()

這樣乙個簡單的模擬器就ok了,工程現在看起來是這樣的:

現在執行起來像是這樣的:

還只是一塊白板,什麼也沒有,我們可認用前一節定義的基本的ui操作來畫一些簡單的東西,如在 uimain 裡的**如下:

ui_setcolor(0xff0000);

ui_hline(40,40,100);

ui_vline(40,40,200);

ui_setcolor(0x00ff00);

ui_fillrect(250,250,100,100);

ui_setcolor 就是設定畫素的填充值

效果如下:

所以借助前面的api的定義,現在可以畫一些點線,面的東西,但ui的所有的基本的東西都是在這些基本的api上操作上來完成的,當然ui也決不是這一點點東西。

後面我們會說到ui的核心 畫布的管理。

自已實現乙個UI庫

2014年寫乙個ui庫時寫的幾個文章,發布出來 幾年前的乙個嵌入式的ui開發,使自己有機會接觸到了ui的一些底層知識,雖然之前也開發過很多windows下的資訊應用系統,也做很多的介面開發,但一直卻對ui的一些運作卻不了解。boss決定使用ucgui做為ui的基本庫來開發ui介面的一些應用。用ucg...

如何實現乙個UI系統

如何為我的遊戲實現乙個ui系統,這個問題我想了很久,不過我現在可不像開始的時候那樣一點思路也沒有。如果你也被這個問題所困擾,我十分樂意與你分享這幾天來的學習成果。嘿嘿,我是不是有點得意忘形了?在開始之前,我要提醒你,學而不思則惘。在看這篇文章的時候,請時刻保持頭腦清醒,如果有什麼不太明白的話,請停下...

利用QtQuick實現UI的乙個Demo

利用qtquick實現ui的乙個demo demo主頁面 二級頁面分類電影集合,可滑動動態載入 第 介面,具體的電影資訊 2,介面的設計。這個demo介面設計很簡單,分為 介面,第一級介面是主頁,顯示電影型別。使用者選擇某乙個分類,進入第二級介面,攤開顯示該分類下的電影集合,當然這些電影相關資訊是已...