1. 程式人生 > >emWin實現BMP點陣圖面板之Button篇

emWin實現BMP點陣圖面板之Button篇

(1)emWin通過skinning方式實現控制元件點陣圖面板:

1)emWin傳統貼面板圖片的方法,是呼叫APP函式XXXX_SetBitmap()方式實現,但非常非常麻煩。

2)要想把控制元件顯示出來,emWin每種控制元件都有1個控制元件繪製函式,而把這個控制元件繪製函式改成我們自己編寫的"自定義繪製函式",這樣我們想把這個控制元件畫成什麼樣都行,emWin已經不參與這個控制元件的繪製工作了;在這個自定義繪製函式裡面我們什麼都不幹,只顯示出這個控制元件的圖片,這就是用skinning方式實現點陣圖面板。

3)支援整幅圖片貼圖,不需要對整幅圖片進行切片分解,非常便捷。

如上圖所示,

(x0,y0)為整幅圖片的顯示座標,(x1,y1)(x2,y2)emWin為控制元件自動生成的剪下顯示座標,我們只需要呼叫GUI_DrawBitmap()函式在(x0,y0)顯示整幅圖片即可,emWin會自動剪下顯示出該控制元件的點陣圖面板,功能非常強大。

(2)Button控制元件的自定義繪製函式

#include "DIALOG.h"
#include "GUI.h"
#include "skinning.h"

//獲取父視窗控制代碼,即主頁面控制代碼,儲存著頁面點陣圖的指標
static WM_HWIN WM_GetParent1C(WM_HWIN hChild) {return hChild;}
static WM_HWIN WM_GetParent2C(WM_HWIN hChild) {return WM_GetParent(hChild);}
static WM_HWIN WM_GetParent3C(WM_HWIN hChild) {return WM_GetParent(WM_GetParent(hChild));}
static WM_HWIN WM_GetParent4C(WM_HWIN hChild) {return WM_GetParent(WM_GetParent(WM_GetParent(hChild)));}
static WM_HWIN WM_GetParent5C(WM_HWIN hChild) {return WM_GetParent(WM_GetParent(WM_GetParent(WM_GetParent(hChild))));}
static WM_HWIN WM_GetParent6C(WM_HWIN hChild) {return WM_GetParent(WM_GetParent(WM_GetParent(WM_GetParent(WM_GetParent(hChild)))));}
static WM_HWIN WM_GetParent7C(WM_HWIN hChild) {return WM_GetParent(WM_GetParent(WM_GetParent(WM_GetParent(WM_GetParent(WM_GetParent(hChild))))));}
static WM_HWIN WM_GetParent8C(WM_HWIN hChild) {return WM_GetParent(WM_GetParent(WM_GetParent(WM_GetParent(WM_GetParent(WM_GetParent(WM_GetParent(hChild)))))));}
static WM_HWIN (*WM_GET_PARENT[])(WM_HWIN) = {WM_GetParent1C,WM_GetParent2C,WM_GetParent3C,WM_GetParent4C,WM_GetParent5C,WM_GetParent6C,WM_GetParent7C,WM_GetParent8C};

//Button控制元件的自定義繪製函式
static int SKIN_button(const WIDGET_ITEM_DRAW_INFO * pDrawItemInfo, unsigned char C)
{
   WM_HWIN hWin;
   int x0, y0;
   WINDOW_BMP *winBMP;

   switch (pDrawItemInfo->Cmd)
   {
   case WIDGET_ITEM_CREATE:
   //case WIDGET_ITEM_DRAW_BACKGROUND:
   case WIDGET_ITEM_DRAW_BITMAP:
   //case WIDGET_ITEM_DRAW_TEXT:
      break;
   default: return BUTTON_DrawSkinFlex(pDrawItemInfo);//emWin預設控制元件繪製函式

   case WIDGET_ITEM_DRAW_BACKGROUND:
      hWin = (WM_GET_PARENT[C-1])(pDrawItemInfo->hWin);//位於第幾層修改這裡(WM_GetParent數=層數-1)
      WM_GetUserData(hWin, &winBMP, sizeof(winBMP));//從使用者資料區讀出"頁面圖片結構體"指標
      //獲取此控制元件相對於主頁面(比如:WINDOW)位置偏移座標
      x0 = WM_GetWindowOrgX(hWin) - WM_GetWindowOrgX(pDrawItemInfo->hWin);
      y0 = WM_GetWindowOrgY(hWin) -WM_GetWindowOrgY(pDrawItemInfo->hWin);
      if(pDrawItemInfo->ItemIndex == BUTTON_SKINFLEX_PI_ENABLED)
         GUI_DrawBitmap(winBMP->normal, x0, y0);//從頁面座標顯示圖片,emWin會自己剪切出這個控制元件範圍的圖片
      else if(pDrawItemInfo->ItemIndex == BUTTON_SKINFLEX_PI_PRESSED)
         GUI_DrawBitmap(winBMP->mark, x0, y0);
      else if(pDrawItemInfo->ItemIndex == BUTTON_SKINFLEX_PI_FOCUSSED)
         GUI_DrawBitmap(winBMP->focus, x0, y0);
      else if(pDrawItemInfo->ItemIndex == BUTTON_SKINFLEX_PI_DISABLED)
         GUI_DrawBitmap(winBMP->disable, x0, y0);
      else BUTTON_DrawSkinFlex(pDrawItemInfo);
      break;
   case WIDGET_ITEM_DRAW_TEXT:
      return BUTTON_DrawSkinFlex(pDrawItemInfo);
   }
   return 0;
}

//Button控制元件的自定義繪製函式,位於第2層(比如:WINDOW->BUTTON)
int SKIN_button2C(const WIDGET_ITEM_DRAW_INFO * pDrawItemInfo){
   return SKIN_button(pDrawItemInfo, 2);
}
//Button控制元件的自定義繪製函式,位於第3層(比如:FRAMEWIN->CLIENT->BUTTON)
int SKIN_button3C(const WIDGET_ITEM_DRAW_INFO * pDrawItemInfo){
   return SKIN_button(pDrawItemInfo, 3);
}
//Button控制元件的自定義繪製函式,位於第4層(比如:WINDOW->FRAMEWIN->CLIENT->BUTTON)
int SKIN_button4C(const WIDGET_ITEM_DRAW_INFO * pDrawItemInfo){
   return SKIN_button(pDrawItemInfo, 4);
}
//Button控制元件的自定義繪製函式,位於第5層(比如:WINDOW->MULTIPAGE->CLIENT->WINDOW->BUTTON)
int SKIN_button5C(const WIDGET_ITEM_DRAW_INFO * pDrawItemInfo){
   return SKIN_button(pDrawItemInfo, 5);
}

(3)Skinning方式實現點陣圖面板的實施步驟:

1)建立窗體時,將"頁面圖片結構體指標"保存於窗體中:
  WINDOW_BMP *winBMP;
  static WINDOW_BMP BMP_WIN_main;//為"WIN_main"頁面定義1個"頁面圖片結構體"
  BMP_WIN_main.normal = &bmPage2_N;//將不同狀態的頁面BMP點陣圖賦值給"頁面圖片結構體"
  BMP_WIN_main.mark = &bmPage2_M;
  BMP_WIN_main.focus = &bmPage2_N;
  BMP_WIN_main.disable = &bmPage2_N;


  BMP_WIN_main.thumbN = &bmPage2_N;
  BMP_WIN_main.thumbM = &bmPage2_N;
  winBMP = &BMP_WIN_main;
  hWin = CreateWindow2(WM_HBKWIN);//建立WINmain頁面
  WM_SetUserData(hWin, &winBMP, sizeof(winBMP));//將"頁面圖片結構體"指標寫到使用者資料區
2)在窗體初始化WM_INIT_DIALOG訊息中,BUTTON控制元件的繪製函式改成自定義繪製函式:
  hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);//獲取控制代碼
  BUTTON_SetSkin(hItem, SKIN_button2C);//將這個BUTTON控制元件改成自定義繪製函式

(4)總結:

以整幅圖片實現emWin點陣圖面板應該是諾嵌光電業界首創的方法,可以大大減輕控制元件貼圖的工作量,保守估計貼圖工作效率至少提高10倍以上。如果把每個控制元件對應的圖片先切片分解下來,然後再轉換成C檔案,最後再貼圖到控制元件上面去,那樣工作量將是非常恐怖的!

相關推薦

emWin實現BMP點陣面板Button

(1)emWin通過skinning方式實現控制元件點陣圖面板: 1)emWin傳統貼面板圖片的方法,是呼叫APP函式XXXX_SetBitmap()方式實現,但非常非常麻煩。 2)要想把控制元件顯示出來,emWin每種控制元件都有1個控制元件繪製函式,而把這個控

STM32F103實現OV7725拍照儲存為BMP點陣

1.首先需要我們定義一下BMP的資料結構,需要定義幾個結構體型別:分別為:BITMAPINFOHEADER(BMP的資訊頭)、BITMAPFILEHEADER(BMP檔案的資訊頭)、RGBQUAD(彩色表,存放RGB565編碼)以及BITMAPINFO(綜合上面的三個結構體)

VC用ADO存取顯示jpg/bmp點陣檔案

 週六和今天兩天的時間,把資料庫關於圖片的儲存和顯示 實現了,雖然時間有點長,但是還是實現了。以下是網上找到的資料,很有用。 第一步:首先是要開啟一個位圖檔案,這裡使用的控制元件用Picture控制元件,就是控制元件圖示右邊最上面那個,改ID號為IDC_PICTURE,然

【數字影象】C++8位和24位BMP點陣的平滑、銳化、二值化處理,以及24位真彩圖的灰度化

BMP標頭檔案: #ifndef BMP_H//前處理器 #define BMP_H typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned int DWORD; typedef

使用GDI+實現24 點陣轉32位點陣

  今天利用修改影象的alpha通道實現了影象的倒影,但是在對影象進行測試的時候,發現24位的點陣圖不能實現倒影,究其原因是24位以下的影象沒有alpha通道,也就沒辦法利用修改alpha通道的方式去實現影象的倒影。於是就想辦法實現24點陣圖像轉成32點陣圖像。也就能具有al

【181126】VC++對BMP點陣進行影象平移例項原始碼

原始碼下載簡介 VC++平移影象的一個例項,以前有朋友讓找的,後來在一本書中發現了,雖然功能不太多,但正好是實現BMP點陣圖的平移,上下左右都可以移,被移動的區域用白色填充。   注:好像只能開啟BM

6.VC(ui)-MFC下實現透明點陣

 我們在進行程式的介面設計時,常常希望將點陣圖的前景顯示在介面上,而將點陣圖的背景隱藏起來,將點陣圖與介面很自然的融合在一起,本文介紹了透明點陣圖的製作知識,並將透明點陣圖在一個對話方塊中顯示了出來。 直接上圖:原圖:Demo效果圖: 步驟如下:   1、設定待顯示點陣圖的

將RGB資料寫入BMP點陣檔案

<span style="font-size:18px;">CFile file; //定義一個檔案物件 _ASSERTE(file.Open(CString("E:\\94.bmp"), CFi

bmp點陣檔案:讀取、寫入、24位真彩轉8位灰度、灰度的二值化

影象的二值化處理就是講影象上的點的灰度置為0或255,也就是講整個影象呈現出明顯的黑白效果。即將256個亮度等級的灰度影象通過適當的閥值選取而獲得仍然可以反映影象整體和區域性特徵的二值化影象。在數字影象處理中,二值影象佔有非常重要的地位,特別是在實用的影象處理中,以二值影象處理實現而構成的系統是很多的,要進行

二進位制圖片轉換成BMP點陣(C++)

void saveBitmap()  {   //一個586*586的二進位制圖片 const int height = 586;const int width = 586;//新生產bmp圖片資料塊總大小 (bmpWidth *biBitCount/8+3)/4*4*b

vc載入bmp點陣並顯示

方法一、顯示點陣圖檔案 HBITMAP hBitmap=(HBITMAP)LoadImage(NULL,_T(“xxx.bmp”),Image_Bitmap,0,0,Lr_CreateDibSection|Lr_DefaultSize|Lr_LoadFromFile)

VS的mfc中將點陣覆蓋到button按鈕上

1.在資源編輯器中新增一個button按鈕,把它的Bitmap屬性設為true; 2.在按鈕上點右鍵,新增變數,變數名為m_Btn(CButton型別的) 3.將圖片匯入到資源管理器中(資源檢視下右擊xx.rc,新增資源),ID為IDB_BITMAP1(其他也行,不過在程式

TkinkerButton

''' Created on 2017年8月30日 @author: Nick ''' #_*_coding:utf-8_*_ import tkinter as tk from tkinter import * #定義Button回撥函式 def helloButto

遠端控制編寫螢幕傳輸 MFC實現 螢幕截 傳送bmp資料 顯示bmp影象

遠端控制編寫之螢幕傳輸  MFC實現  螢幕截圖 傳送bmp資料 顯示bmp影象: 一 : 首先要了解bmp影象的結構 詳情請看我轉載的一篇文章http://blog.csdn.net/hnust_xiehonghao/article/details/37656281 二:

自己定義ViewChart標系列(1)——點陣

tint 發現 坐標軸 畫的 tracking androi mit def dot 近期要做一些圖表類的需求,一開始就去github上看了看,發現開源的圖表框架還是蠻多的。可是非常少有全然符合我的需求的。另外就是使用起來比較麻煩。所以就決定自己來造輪子

arcgis api for jsecharts開源js庫實現地圖統計分析

不能 rgba data ron 創建 apc att load reat 前面寫過一篇關於arcgis api for js實現地圖統計圖的,具體見:http://www.cnblogs.com/giserhome/p/6727593.html 那是基於dojo組件來實

《程式設計珠璣》程式碼路1:學習位操作的神器----點陣排序(附解決程式設計師心理問題的門路)

最近由於“閒書”讀太多,不少朋友以為我要轉當產品經理了,故想起來把最近讀的《程式設計珠璣》以及自己編寫的程式碼整理成部落格,用程式碼證明自己的清白。雖然自己比較菜不能和Google和ACM金牌大佬PK技術,作為一隻老年菜雞ACMer,經常一頓操作猛如虎,一看戰績0AC。 但相信對於剛入門的小夥伴

UML類關係 繼承、實現、依賴、關聯、聚合、組合

原文出自 https://www.cnblogs.com/jiqing9006/p/5915023.html 繼承 指的是一個類(稱為子類、子介面)繼承另外的一個類(稱為父類、父介面)的功能,並可以增加它自己的新功能的能力,繼承是類與類或者介面與介面之間最常見的關係;在Java

基於VC6.0的控制檯作圖--顯示點陣bmp

文章目錄 GDI是什麼? 用`LoadImage`讀取點陣圖bmp檔案 將點陣圖選入記憶體相容區 將記憶體相容區拷貝到螢幕區 恢復現場 銷燬臨時的記憶體DC 例項 ( showbmp.cpp) 進一步的改

Android學習筆記Bitmap點陣雖觸控點移動

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!