windows程式設計-視窗控制元件
windows程式設計-視窗控制元件
Windows控制元件定義
控制元件是常見的視窗上的互動元素,當控制元件的特定功能被觸發後,會主動傳送訊息通知父視窗,父視窗可以通過傳送訊息給視窗控制控制元件的行為。控制元件的本質也是一個視窗。
控制元件就相當於一個專門用來發送訊息給視窗的視窗
Windows視窗風格
Windows視窗特點主要是分為兩大類
1 表明視窗和其他視窗關係的
比如:WS_OVERLAPED WS_POPPUP WS_CHILD
2 表明視窗自身外觀特徵的
比如:WS_BORDER WS_CAPITON等等
Windows控制元件
Windows標準控制元件
視窗類名 | 控制元件名稱 |
---|---|
WC_BUTTON | 按鈕 |
WC_STATIC | 靜態文字 |
WC_COMBOBOX | 複合框 |
WC_EDIT | 編輯框 |
WC_LISTBOX | 列表框 |
WC_SCROLLBAR | 滾動條 |
Windows通用控制元件
WC_LISTVIEW 列表框控制元件
WC_TREEVIEW 樹控制元件
WC_TABCONTROL Tab控制元件等等
控制元件的響應
子控制元件通知父視窗一些事件,例如子控制元件被點選,需要通過以下兩類訊息。標準控制元件訊息:WM_COMMAND 通用控制元件訊息WM_NOTIFY
控制元件的建立
windows的控制元件相當於就是windows自己寫的好視窗
//完整程式碼
#include<Windows.h>
#include<CommCtrl.h>
#include<iostream>
using namespace std;
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
static HINSTANCE hInstance = GetModuleHandle(NULL);
switch (uMsg)
{
case WM_LBUTTONDOWN:
{
int xPos = LOWORD(lParam);
int yPos = HIWORD(lParam);
WCHAR buf[1024];
wsprintf(buf, TEXT("x = %d,y = %d"), xPos, yPos);
MessageBox(hwnd, buf, TEXT("滑鼠左鍵摁下"), MB_OK);//彈出視窗
break;
}
case WM_CREATE:
// MessageBox(hwnd, L"視窗建立成功", L"建立視窗", MB_OK);
CreateWindow(WC_BUTTON, L"button1",WS_CHILD | WS_VISIBLE,50,50,100,100,hwnd,(HMENU)0x100,hInstance,NULL);
CreateWindow(WC_BUTTON, L"button2", WS_CHILD | WS_VISIBLE, 200, 200, 100, 100, hwnd, (HMENU)0x101, hInstance, NULL);
break;
case WM_CLOSE:
MessageBox(hwnd, L"視窗關閉成功", L"視窗關閉", MB_OK);
DestroyWindow(hwnd);
PostQuitMessage(0);
exit(0);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case 0x100:
{
MessageBox(hwnd, L"控制元件1被點選", L"控制元件資訊", MB_OK);
break;
}
case 0x101:
{
MessageBox(hwnd, L"控制元件2被點選", L"控制元件資訊", MB_OK);
break;
}
default:
break;
}
break;
default:
break;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd
)
{
//1 建立一個視窗類
WNDCLASS myclass = { 0 };
myclass.lpszClassName = L"sm7";
myclass.lpfnWndProc = WindowProc;
//2註冊視窗類
RegisterClass(&myclass);
//3建立視窗
HWND hMyWindow = CreateWindow(
myclass.lpszClassName,
L"sm7的視窗",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL
);
//4顯示視窗
ShowWindow(hMyWindow, SW_SHOW);
//5獲取訊息
MSG message;
LPMSG MESSAGE = &message;
while (1)
{
GetMessage(MESSAGE,hMyWindow,0,0);
DispatchMessage(MESSAGE);
}
return 0;
}