1. 程式人生 > >minigui常用介面美化方法,及常用函式使用

minigui常用介面美化方法,及常用函式使用

1.獲得子窗體的文字內容
char buff[100];
HWND parent = GetParent(hwnd);   //通過子控制元件控制代碼獲得父窗體控制代碼
SendDlgItemMessage(parent,IDC_STRING,MSG_GETTEXT,99,(LPARAM)buffer);
IDC_STRING為字窗體id值,MSG_GETTEXT為獲得文字的訊息,99為最大接收字串
長度,buffer為儲存接收到的字元


也可通過SendMessage(hWnd,MSG_GETTEXT,99,(LPARAM)buffer);來設定控制元件字型
也可用封裝好的GetWindowText(hWnd,buff,maxlen);來得到字型


2.給窗體控制元件設定文字內容
char str[100];
sprintf(str,"%s","test text");
SetDlgItemText(hWnd,IDC_SELECTED,str);  其中hWnd為窗體控制代碼,IDC_SELECTED
為控制元件的id,str為要給空間新增的文字


也可通過SendMessage(hWnd,MSG_SETEXT,0,(LPARAM)buff);來設定控制元件字型
也可用封裝好的SetWindowText(hWnd,buff);來設定控制元件字型


3.使用定時器
可在MSG_CREATE中通過  SetTimer(hWnd,IDC_TIMER,10);來建立和啟動定時器,其中
hWnd為接收定時器的窗體,IDC_TIMER為定時器的id,10為定時器的定時時間,單位為10ms
在hWnd的過程回撥函式中可通過MSG_TIMER:來處理定時器到達事件,最後在MSG_DESTROY
中呼叫KillTimer(hWnd,IDC_TIMER)來登出定時器


4.通過獲得圖片中某個位置的顏色值,來給控制元件設定背景色。
gal_pixel pixel;     //儲存獲得的顏色值
pixel = GetPixelInBitmap(&bitmap,0,0);  //獲得bitmap圖片中的(0,0)畫素位的顏色值
SetWindowBkColor(hWnd,pixel);  //給窗體或則控制元件設定背景色
InvalidateRect (hWnd, NULL, TRUE);   //啟動重繪窗體


5.設定編輯框只能輸入數字或只能輸入字母
#define IDC_CTRL1     100
#define IDC_CTRL2     110
static WNDPROC old_edit_proc;
以下可在MSG_CREATE中設定
HWND hWnd1, hWnd2
hWnd1 = CreateWindow (CTRL_EDIT, "", WS_CHILD | WS_VISIBLE | WS_BORDER, IDC_CTRL1, 
                    200, 10, 180, 24, hWnd, MY_ES_DIGIT_ONLY);
hWnd2 = CreateWindow (CTRL_EDIT, "", WS_CHILD | WS_BORDER | WS_VISIBLE, IDC_CTRL2, 
                    200, 40, 180, 24, hWnd, MY_ES_ALPHA_ONLY);
 old_edit_proc = SetWindowCallbackProc (hWnd1, RestrictedEditBox);
        SetWindowCallbackProc (hWnd2, RestrictedEditBox);
以下為限制輸入的回撥函式
static int RestrictedEditBox (HWND hwnd, int message, WPARAM wParam, LPARAM lParam)
{
    if (message == MSG_CHAR) {
        DWORD my_style = GetWindowAdditionalData (hwnd);
        if ((my_style & MY_ES_DIGIT_ONLY) && (wParam < '0' || wParam > '9'))
            return 0;
        else if (my_style & MY_ES_ALPHA_ONLY)
            if (!((wParam >= 'A' && wParam <= 'Z') || (wParam >= 'a' && wParam <= 'z')))
                return 0;
    }


    return (*old_edit_proc) (hwnd, message, wParam, lParam);
}


6.設定滑鼠移到控制元件上時,顯示控制元件提示資訊
static WNDPROC old_btn_proc;    //為全域性靜態
static HWND g_hTooltip;         //提示框的控制代碼


static HWND s_hStart;           //區域性靜態
g_hTooltip = CreateToolTipWin (hWnd, 0, 0, 1000, "");  //hWnd為主窗體控制代碼,0,0為ToolTip顯示的位置,1000為ToolTip顯示的時間單位為ms,""為文字顯示的的格式,成功返回提示框的控制代碼
SetWindowElementAttr (g_hTooltip, WE_LFSKIN_WND_BKGND, 0L);   //設定提示框顯示屬性
SetWindowBkColor (g_hTooltip, PIXEL_green);                   //設定背景提示框顏色
ShowWindow (g_hTooltip, SW_HIDE);                             //開始隱藏


s_hStart = CreateWindowEx (CTRL_BUTTON, "",                   //建立一個提示框的按鈕
                        WS_VISIBLE | BS_PUSHBUTTON, WS_EX_NONE, 
                        IDC_START,
                        20, 96, 24, 24, 
                        hWnd, (DWORD)"Start/Pause");                   //最後的"Start/Pause"為提示的內容
old_btn_proc = SetWindowCallbackProc (s_hStart, DefButtonProc);        //設定回到函式


//回撥函式
static int DefButtonProc (HWND hwnd, int message, WPARAM wParam, LPARAM lParam)
{
    if (message == MSG_ERASEBKGND) {
        return 0;
    }
    else if (message == MSG_MOUSEMOVEIN) {
        RECT rc;
        BOOL in_out = (BOOL)wParam;
        char *tip = (char *)GetWindowAdditionalData (hwnd);          //獲得"Start/Pause"提示字串
       
        if (NULL != tip && in_out) {
            GetClientRect (hwnd, &rc); 
            ClientToScreen (hwnd, &rc.right, &rc.bottom);
            ResetToolTipWin (g_hTooltip, rc.right, rc.bottom, tip);
        }
    }


    return (*old_btn_proc) (hwnd, message, wParam, lParam);
}


7.註冊工程所用圖片和釋放工程所用圖片。可在MiniGuiMain主函式中註冊,在迴圈突出結束時釋放


#define NUM_48                  "num_48.bmp"       //定義圖片名


#define ARRAY_LEN(array) \      //計算數字中存放的圖片張數
    (sizeof(array)/sizeof(array[0]))


static char* all_pic[] = {      //存放圖片路徑的陣列
    NUM_48,
};


BOOL register_all_pic (void)    //註冊圖片資源
{
    int i;


    SetResPath ("./img/");


    for (i = 0; i < ARRAY_LEN(all_pic); i++)
    {
        if (RegisterResFromFile (HDC_SCREEN, all_pic[i]) == FALSE)
        {
            fprintf (stderr, "can't register %s\n", all_pic[i]);
            return FALSE;
        }
    }
    return TRUE;
}


SetDefaultWindowElementRenderer ("skin");        //在註冊完圖片後要呼叫這句函式來初始初始化全域性圖片,使其可以用


void unregister_all_pic (void)  //釋放圖片資源
{
    int i;


    for (i = 0; i < ARRAY_LEN(all_pic); i++)
    {
        UnregisterRes(all_pic[i]);
    }
}


8.使用自定義bmp圖片字型


#define NUM_48_BMP                  "../KepBackMinigui/img/num_48.bmp"    //①數字圖片
#define DOT_48_BMP                  "../KepBackMinigui/img/dot_48.bmp"    //①點圖片


static BITMAP g_stBMPNumber;                                              //①黑色數字圖片
static BITMAP g_stBMPInsert;                                              //①插入的黑色字元圖片
static DEVFONT  *s_bmpDevFont;                                            //①bmp字型裝置
static LOGFONT  *s_bmpLogFont;                                            //①bmp字型控制代碼
static int  s_nTMin = 12;                                                 //①顯示的數字1
static int  s_nTSec = 20;                                                 //①顯示的數字2


在MSG_CREATE:中
LoadBitmap (HDC_SCREEN, &g_stBMPNumber, NUM_48_BMP);               //①載入數字圖片
LoadBitmap (HDC_SCREEN, &g_stBMPInsert, DOT_48_BMP);               //①載入小數點圖片

s_bmpDevFont = CreateBMPDevFont ("bmp-led-rrncnn-20-48-ISO8859-1", //①建立一個BITMAP圖片數字,數字畫素為20*48
               &g_stBMPNumber, "0", 10, 25);                      //①"0"表示從第“0”個字元開始,取10字元,由於我們給的num_48.bmp圖片
                                                                  //①畫素為275*48的,裡面又有11個字元,所以每個字元長度為 275/11 = 25

AddGlyphsToBMPFont (s_bmpDevFont, &g_stBMPInsert, ".", 1, 25);     //①將新的bmp圖片中的字元插入到s_bmpDevFont中
                                                                  //①g_stBMPInsert為含有.字元的圖片,"."代表插入
                                                                  //①插入的第一個字元,1代表只有一個,25代表字元圖片
                                                                  //①畫素寬度

s_bmpLogFont = CreateLogFont (FONT_TYPE_NAME_BITMAP_BMP, "led",    //①通過前兩步的設定,就可建立具體的bmp圖片中字元操作
       "ISO8859-1",                                               //①控制代碼s_bmpLogFont了
       FONT_WEIGHT_BOLD, FONT_SLANT_ITALIC,
       FONT_SETWIDTH_NORMAL, FONT_SPACING_CHARCELL,
       FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE,
       48, 0);
在MSG_PAINT:中
HDC hdc;
char cBuff[6];
hdc = BeginPaint (hWnd);
sprintf (cBuff, "%.2d.%.2d", s_nTMin, s_nTSec);                   //①②
cBuff [5] = '\0';                                                 //①②
SelectFont (hdc, s_bmpLogFont);                                   //①②設定hdc字型格式
TextOut (hdc, TIME_POS_X, TIME_POS_Y, cBuff);                     //①②顯示出自定義的字型
EndPaint (hWnd, hdc);
return 0;

最後在MSG_DESTROY:中 
UnloadBitmap(&g_stBMPNumber);                                      //①解除安裝數字圖片
UnloadBitmap(&g_stBMPInsert);                                      //①解除安裝小數點圖片
DestroyBMPFont (s_bmpDevFont);                                     //①bmp字型資源回收


9.使按鈕實現三態背景,即常態,滑鼠懸停態,滑鼠按下態


//圖片要求,圖片畫素的寬要和按鈕寬一樣,圖片豎值高度要為按鈕高度的五倍,且豎值排放五種狀態的按鈕,第一張為正常狀態的圖片,第二張為滑鼠懸停是的圖片,第三張為按鈕按下時的圖片,第四五張不知幹什麼的,但位置要保留出來
#define LFSKIN_VOLUME               "lfskin_Volume.gif"                   //②聲音圖片
#define LFSKIN_DISVOLUME            "lfskin_DisVolume.gif"                //②靜音圖片


#define IDC_VOLUME                  100                                   //②聲音按鈕ID
#define MSG_CHANGE_SKINS            (MSG_USER + 10)                       //②自定義訊息


#define ARRAY_LEN(array) \
    (sizeof(array)/sizeof(array[0]))                                      //②計算陣列長度的巨集




static char* all_pic[] = {                                                //②④圖片陣列
    LFSKIN_VOLUME,
    LFSKIN_DISVOLUME,
    LFSKIN_MAIN,
};


static HWND s_hVolume;                                                    //②聲音按鈕控制代碼
static BOOL s_bVolume;                                                    //②聲音按鍵按下彈起標誌


在主函式內註冊圖片和銷燬圖片
register_all_pic();                                                      //②④註冊背景圖片
SetDefaultWindowElementRenderer ("skin");                                //②④預設背景風格
unregister_all_pic();                                                   //②④登出背景圖片


在MSG_CREATE中:
s_bVolume   = TRUE;                                                //②聲音按鍵標誌初始化為真
s_hVolume = CreateWindowEx (CTRL_BUTTON, "",                       //②建立測試的按鈕
       WS_VISIBLE | BS_PUSHBUTTON, WS_EX_NONE,
       IDC_VOLUME,
       150, 20, 40, 42,
       hWnd, 0L);
SendMessage (hWnd, MSG_CHANGE_SKINS, 0, 0);                        //②傳送自定義的訊息設定按鈕背景圖片
在MSG_CHANGE_SKINS訊息處理中
  if (s_bVolume)                                                     //②
   SetWindowElementAttr (s_hVolume,                               //②設定可用聲音按鈕背景,通過改引數WE_LFSKIN_PUSHBUTTON確定是可以三態選擇的按鈕
           WE_LFSKIN_PUSHBUTTON, (DWORD)LFSKIN_VOLUME);           //②
else
   SetWindowElementAttr (s_hVolume,                               //②
           WE_LFSKIN_PUSHBUTTON, (DWORD)LFSKIN_DISVOLUME);        //②設定不可用聲音按鈕背景,通過改引數WE_LFSKIN_PUSHBUTTON確定是可以三態選擇的按鈕
InvalidateRect (s_hVolume, NULL, FALSE);                           //②只重新整理聲音按鈕
UpdateWindow (hWnd, TRUE);
在MSG_COMMAD:中
int id = LOWORD(wParam);
  switch(id)
  {
  case IDC_VOLUME:                                                  //②聲音按鈕處理
      if (!s_bVolume) {
          s_bVolume = TRUE;                                         //②
          SetWindowElementAttr (s_hVolume,                          //②
                      WE_LFSKIN_PUSHBUTTON, (DWORD)LFSKIN_VOLUME);  //②設定三態背景圖片
          InvalidateRect (s_hVolume, NULL, FALSE);                  //②
      }
      else {
          s_bVolume = FALSE;                                        //②
          SetWindowElementAttr (s_hVolume,                          //②
                      WE_LFSKIN_PUSHBUTTON, (DWORD)LFSKIN_DISVOLUME);//②設定三態背景圖片
          InvalidateRect (s_hVolume, NULL, FALSE);                   //②
      }

      break;

測試效果圖