/* * Create By : 李紹良[lsl](zyzx)
* Create Time : 2015-03-14
*/
如圖,繪圖模塊基本上是一些圖形運算方面的接口。
繪圖模塊圍繞的中心的是畫布:
typedef struct LUI_CANVAS
{
int_t cx; //畫布寬
int_t cy; //畫布高
int_t bpp; //像素位寬 RGB1555 2字節;RGB8888 4字節
int_t pitch; //行跨距, = cx * bpp
int_t len; //*pData數據長度 = pitch * cy
unsigned char *pData; //申請的內存
}LUI_CANVAS;
其實表征的就是一個bmp圖片。像素的格式一般采用RGB1555,與RGB8888格式,兩這都可以將透明度信息表示出來。采用RGB1555格式即可以剩下不少內存,也可以降低CPU開銷,同時UI設計師也可以相對寬松的選擇圖片色彩。我們做的幾代產品都沒有逃脫選用RGB1555格式的命運,在需要支持全屏1920*1080P的分辨率甚至4K界面的分辨率、ARM硬件(甚至很低端)這種條件下,想使用RGB8888簡直就是一種奢望。
至于如何繪制基礎圖形,這個網絡上很多。實際項目中也不是我們寫的模擬代碼,海斯圖形處理芯片中有相關的圖形加速模塊,比這個模擬代碼效率高多了。
創建和銷毀畫布在這里負責,主要是防止某些嵌入式設備圖形部分需要使用設備專屬內存,而不是隨意new出來的。
繪制圖片這一塊還需要圖片打包模塊的支持,后面作為一個專題。
繪制文字,有些難度,我們一直使用的是柵格字庫(基于效率、使用便利上考慮),也可以擴展使用矢量字庫。國際化的界面估計是整個UI體系的最大難點了,我們也只是盡量兼容更多的語言。這部分也后面作為一個專題。
到這里,基礎理論差不多了。我們需要在Windows上建立調試環境,則還需要創建一個Win32的demo工程。
demo程序使用的是vs2005直接生成的WIN32程序,也僅僅添加了一個類CWinGraph,插入到了Win32流程中。主要的使用WIN窗口把我們的界面顯示出來
主要是在窗口消息處理中簡單的加入了這些代碼
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意繪圖代碼...
int_t cx, cy;
g_pGraph->ScreenSize(&cx, &cy);
g_pGraph->Refresh(0, 0, cx, cy);
EndPaint(hWnd, &ps);
case WM_CREATE:
g_pGraph->Initial(hWnd, DLG_WIDTH, DLG_HEIGHT);
break;
case WM_DESTROY:
g_pGraph->Quit();
PostQuitMessage(0);
break;
代碼本身沒有使用比較嚴謹的風格,很多參數和做法后面還會響應的調整,僅以此來表達對接模塊需要做的事情。
如下圖demo程序跑起來的效果圖,雖然簡單,但卻是基礎。