minigui常用介面美化方法,及常用函式使用
阿新 • • 發佈:2019-02-16
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); //②
}
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;
測試效果圖