按鈕控件允許用戶通過單擊來執行操作,其功能可以顯示文本,又可以顯示圖像,當按鈕被單擊的時候,它看起來被按下,然後被釋放。按鈕是Windows标準控件。也是子窗口,其窗口類名為button。
其主要分為如下:
對于我們操作按鈕,同樣會産生消息。一般按鈕控件會向父窗口發送命令消息“WM_COMMAND”消息。即我們如果需要處理按鈕控件,可以匹配“WM_COMMAND”消息。其他簡單消息如下:
BN_CLICKED用戶在按鈕上單擊鼠标時,會向父窗口發送BN_CLICKED消息
BN_DOUBLECLICKED雙擊鼠标時會向父窗口發送BN_DOUBLECLICKED消息。
3;位圖按鈕對于我們操作按鈕,除了使用操作系統自帶的外觀,同樣可以使用圖片來修飾按鈕。參考代碼:
程序邏輯如下:
case WM_CREATE:
{
LPCREATESTRUCT pcs = (LPCREATESTRUCT)LPARAM;
//創建位圖按鈕
HWND hBtn = CreateWindow(L"BuTtOn" /*不區分大小寫*/,
L"XXX", WS_CHILD | WS_VISIBLE | BS_BITMAP,//指定為圖片
30, 30, 217, 46, hWnd, (HMENU)1000, pcs->hInstance, NULL);
//加載位圖
HBITMAP hBmp=(HBITMAP)LoadImage(NULL, L"C:\\Users\\35497\\Desktop\\code\\016\\Debug\\btn1.bmp",
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
//向控件發送BM_SETIMAGE消息設置按鈕圖片
LRESULT ret=SendMessage(hBtn, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBmp);
return 0;
}
N:案例
程序注釋
#include <Windows.h>
#include <windowsx.h>
#include <stdio.h>
//自定義窗口過程
LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT MSG, WPARAM wParam, LPARAM IParam)
{
switch (Msg)
{
//////////////////////////// 創建按鈕控件 //////////////////////////////////
case WM_CREATE:
{
/*LPCREATESTRUCT定義傳遞給應用程序的窗口過程的初始化參數。這些成員與CreateWindowEx函數的參數相同。*/
LPCREATESTRUCT pcs = (LPCREATESTRUCT)IParam;
//創建控件或者子窗口
//普通按鈕BS_PUSHBUTTON
HWND hBtn = CreateWindow(L"Button", L"普通按鈕", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 30, 30, 80, 30, hWnd,
(HMENU)1000,//控件ID,需要唯一
pcs->hInstance, //父窗口句柄
NULL);
//單選按鈕
HWND hBtn1 = CreateWindow(L"Button", L"單選按鈕", WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 30, 60, 80, 30, hWnd,
(HMENU)1001,//控件ID,需要唯一
pcs->hInstance, //父窗口句柄
NULL);
//複選按鈕
HWND hBtn2 = CreateWindow(L"Button", L"複選按鈕", WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 30, 90, 80, 30, hWnd,
(HMENU)1002,//控件ID,需要唯一
pcs->hInstance, //父窗口句柄
NULL);
return 0;
}
case WM_COMMAND:
{
WORD id = LOWORD(wParam);
WORD code = HIWORD(wParam);
HWND hCtrl = (HWND)IParam;
if (id == 1000 && code == BN_CLICKED)
{
MessageBox(hWnd, L"普通按鈕被單擊!", L"提示", MB_OK);
}
else if (id == 1001)
{
MessageBox(hWnd, L"單選按鈕被單擊!", L"提示", MB_OK);
if (SendMessage(hCtrl, BM_GETCHECK, 0, 0) == BST_CHECKED)
{
MessageBox(hWnd, L"被選中!", L"提示", MB_OK);
}
else if (SendMessage(hCtrl, BM_GETCHECK, 0, 0) == BST_UNCHECKED)
{
MessageBox(hWnd, L"未選中!", L"提示", MB_OK);
}
}
else if (id == 1002)
{
MessageBox(hWnd, L"複選按鈕被單擊!", L"提示", MB_OK);
if (Button_GetCheck(hCtrl) == BST_CHECKED)
{
MessageBox(hWnd, L"被選中!", L"提示", MB_OK);
}
else if (Button_GetCheck(hCtrl) == BST_UNCHECKED)
{
MessageBox(hWnd, L"未選中!", L"提示", MB_OK);
}
}
}break;
default:
return DefWindowProcW(hWnd, Msg, wParam, IParam);
}
return 0;
}
//主函數
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow)
//int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
//注冊窗口類
WNDCLASS wind;
wind.cbClsExtra = 0;
wind.cbWndExtra = 0;
wind.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));// 設定背景色
wind.hCursor = LoadCursor(NULL, IDC_ARROW); //光标
wind.hIcon = LoadCursor(NULL, IDI_APPLICATION);//圖标
wind.lpfnWndProc = MyWindowProc; //自定義的窗口過程函數
wind.lpszClassName = L"Aaron.xu"; //窗口類名
wind.lpszMenuName = NULL; // 菜單資源名稱
wind.style = CS_HREDRAW;//窗口類,樣式
wind.hInstance = hInstance;//實例句柄
RegisterClass(&wind); //注冊窗口類
//創建窗口
HWND hWnd = CreateWindow(L"Aaron.xu", L"天象獨行",
WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL);
//顯示窗口
//ShowWindow(hWnd, nShowCmd);
ShowWindow(hWnd, nCmdShow);
//更新窗口
UpdateWindow(hWnd);
//消息循環(收到WM_QUIT消息退出)
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) //GetMessage()從消息隊列取出消息
{
TranslateMessage(&msg); //将虛拟鍵消息轉換為字符消息
DispatchMessage(&msg); //将WM_AAA消息分配窗口過程MyWindowProc
}
}
靜态文本控件是一種最簡單的控件,它主要用來顯示文本消息,不能接受用戶輸入,一般不需要處理消息。靜态文本框控件既是Windows标準控件,也是子窗口,它的窗口類名是static
一個靜态控件用來顯示一個文本字符串,框,矩形,圖标,光标,位圖,或增強的圖元文件。它可以用來作為标簽,框,或用來分隔其他的控件。一個靜态控件不接受輸入,也不提供輸出;但是如果是由“SS_NOTIFY”風格創建的,則它可以通知其父關系設備點擊消息。
2.1;靜态文本控制發送消息
可以向靜态文本控件發送消息來設置圖标,位圖等
靜态文本控件向父窗口發送命令消息“WM_COMMAND”。消息種類如下:
2;舉例:
其中僅包含窗口過程部分
case WM_CREATE:
{ //CreateWindow函數在窗口創建成功并且在返回之前直接發送WM_CREATE消息給窗口過程函數。
LPCREATESTRUCT pcs = (LPCREATESTRUCT)IParam;
//創建靜态文本控件
HWND hStatic = CreateWindow(L"Static", L"靜态文本", WS_CHILD | WS_VISIBLE | WS_BORDER|SS_NOTIFY, 30, 30, 200, 30,
hWnd, (HMENU)111, pcs->hInstance, NULL);
//更改窗口标題
SetWindowText(hWnd, L"123123");
//設置控件(子窗口)内容
SetWindowText(hStatic, L"更改後的内容!");
//加載位圖
HBITMAP hBmp = LoadBitmap(pcs->hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
//向孔健發送STM_SETIMAGE消息設置靜态控件的位圖
SendMessage(hStatic, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBmp);
return 0;
}
case WM_COMMAND:
{
WORD id = LOWORD(wParam);//控件ID
WORD code = HIWORD(wParam); //消息類型
HWND hCtrl = (HWND)IParam;//窗口句柄
//父窗口接收到子控件發的消息
if (id == 111 && code == STN_CLICKED) {
MessageBox(NULL, L"靜态文本被點擊!", L"提示", MB_OK);
}
break;
演示代碼(僅包含窗口過程代碼部分):
case WM_CREATE:
{
//LPCREATESTRUCT定義傳遞給應用程序的窗口過程的初始化參數。這些成員與CreateWindowEx函數的參數相同。
LPCREATESTRUCT pcs = (LPCREATESTRUCT)IParam;
//創建編程框控件
HWND hEdit = CreateWindow(L"ediT", L"編輯框", WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_NOHIDESEL,
30, 30, 200, 100, hWnd, (HMENU)111, pcs->hInstance, NULL);
//向編輯框發送選擇字符串得消息
SendMessage(hEdit, EM_SETSEL, 2, 6);
//剪切剛剛選擇的文字
//SendMessage(hEdit, WM_CUT, 0, 0);
//撤銷
//SendMessage(hEdit, EM_UNDO, 0, 0);
return 0;
}
case WM_COMMAND:
{
WORD id = LOWORD(wParam); //控件ID
WORD code = HIWORD(wParam);//消息類型
HWND hCtrl = (HWND)IParam;//窗口句柄
//父窗口接收到子控件發得通知代碼
//EN_CHANGE 當用戶執行的操作可能更改了編輯控件中的文本時發送。
if (id == 111 && code == EN_CHANGE)
{
//MessageBox(NULL, L"編輯框的文本被改變", L"提示", MB_OK);
TCHAR buf[64] = { 0 };
GetWindowText(hCtrl, buf, sizeof(buf));
MessageBox(NULL, buf, L"提示", MB_OK);
}
}
演示代碼(僅包含窗口過程代碼部分):
case WM_CREATE:
{
LPCREATESTRUCT pcs = (LPCREATESTRUCT)IParam;
//創建列表框控件
HWND hListBox = CreateWindow(L"listBOX", L"XXX", WS_CHILD | WS_VISIBLE | LBS_SORT | LBS_NOTIFY,
30, 30, 200, 100, hWnd, (HMENU)111, GetModuleHandle(NULL), NULL);
//向末尾添加選項
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"B音樂");
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"A啤酒");
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"C啤酒");
//插入字符串
SendMessage(hListBox, LB_ADDSTRING, 1, (LPARAM)L"C炸雞");
//選擇其中一項,選擇索引為2的,單選模式才有效
SendMessage(hListBox, LB_SETCURSEL, 2, 0);
return 0;
}
case WM_COMMAND:
{
WORD id = LOWORD(wParam);//控件ID
WORD code = HIWORD(wParam);//消息類型
HWND hCtrl = (HWND)IParam;//窗口句柄
//父窗口接收到子控件發的消息
//LBN_SELCHANGE 通知應用程序列表框中的選定内容已因用戶輸入而發生更改。
if (id == 111 && code == LBN_SELCHANGE)//創建時需指定LBS_NOTIFY樣式
{
// 獲取當前選擇的索引
int index = SendMessage(hCtrl, LB_GETCURSEL, 0, 0);
//獲取索引對應的字符串
TCHAR buf[64] = { 0 };
//LB_GETTEXT從列表框中獲取一個字符串。
SendMessage(hCtrl, LB_GETTEXT, index, (LPARAM)buf);
MessageBox(NULL, buf, L"提示", MB_OK);
}
}break;
演示代碼(僅包含窗口過程代碼部分):
case WM_CREATE:
{
LPCREATESTRUCT pcs = (LPCREATESTRUCT)IParam;
//創建組合框
HWND hComboBox = CreateWindow(L"comboBOX", L"XXX", WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | CBS_SORT,
30, 30, 200, 100, hWnd, (HMENU)111, pcs->hInstance, NULL);
//向組合框添加選項
SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)L"C音樂");
SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)L"A啤酒");
SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)L"B炸雞");
//插入選項
SendMessage(hComboBox, CB_INSERTSTRING, 2, (LPARAM)L"編程");
//選擇某一項
SendMessage(hComboBox, CB_SETCURSEL, 3, 0);
return 0;
}
case WM_COMMAND:
{
WORD id = LOWORD(wParam);//控件ID
WORD code = HIWORD(wParam);//消息類型
HWND hCtrl = (HWND)IParam;//窗口句柄
//父窗口接收到子控件發的消息
if (id == 111 && code == CBN_SELCHANGE)
{
//獲取當前選擇的索引
int index = SendMessage(hCtrl, CB_GETCURSEL, 0, 0);
//獲取索引對應的文本
TCHAR buf[64] = { 0 };
SendMessage(hCtrl, CB_GETLBTEXT, index, (LPARAM)buf);
MessageBox(hWnd, buf, L"提示", MB_OK);
}
}break;
演示代碼(僅包含窗口過程代碼部分):
case WM_CREATE:
{
/*
* 發送 SBM _ SETRANGE 消息,以設置滾動條控件的最小和最大位置值。
* 發送 SBM _ SETPOS 消息以便 (thumb) 設置滾動框位置,并在請求時重新繪制滾動條以反映滾動框的新位置。
*/
LPCREATESTRUCT pcs = (LPCREATESTRUCT)IParam;
//創建滾動條控件
HWND hScrollBar = CreateWindow(L"scrollBAR", L"XXX", WS_CHILD | WS_VISIBLE | SBS_HORZ,
30, 30, 200, 30, hWnd, (HMENU)111, pcs->hInstance, NULL);
//設置滾動條的範圍
SendMessage(hScrollBar, SBM_SETRANGE, 0, 100);
//設置滾動條的滑塊位置
SendMessage(hScrollBar, SBM_SETPOS, 40, 1);
return 0;
}
//水平滾動條發送的消息
case WM_HSCROLL:
{
WORD code = LOWORD(wParam);//操作碼
HWND hCtrl = (HWND)IParam;//控件句柄
//獲取滾動條的滑塊位置
//發送 SBM _ GETPOS 消息以檢索滾動條控件的滾動框的當前位置。 當前位置是依賴于當前滾動範圍的相對值。
int pos = SendMessage(hCtrl, SBM_GETPOS, 0, 0);
switch (code)
{
//點擊左邊箭頭
case SB_LINELEFT:
OutputDebugString(L"SB_LINELEFT\n");
pos -= 1;
break;
//點擊右邊箭頭
case SB_LINERIGHT:
OutputDebugString(L"SB_LINERIGHT\n");
pos = 1;
break;
//點擊左空白區
case SB_PAGELEFT:
OutputDebugString(L"SB_PAGELEFT\n");
pos -= 10;
break;
//點擊右空白區
case SB_PAGERIGHT:
OutputDebugString(L"SB_PAGERIGHT\n");
pos = 10;
break;
//拖動滑塊時的消息
case SB_THUMBPOSITION:
pos = HIWORD(wParam);//拖拽位置,僅當SB_THUMBPOSITION有用
char str[64];
sprintf_s(str, "SB_THUMBPOSITION %d\n", pos);
OutputDebugStringA(str);
break;
}
//設置滾動條的滑塊位置
SendMessage(hCtrl, SBM_SETPOS, pos, 1);
}break;
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!