實現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介面設計很簡單,分為 介面,第一級介面是主頁,顯示電影型別。使用者選擇某乙個分類,進入第二級介面,攤開顯示該分類下的電影集合,當然這些電影相關資訊是已...