1. 程式人生 > 實用技巧 >windows程式設計-視窗控制元件

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自己寫的好視窗

同樣需要建立視窗的流程。只是windows已經自己建立和註冊好視窗類的,需要的是自己來拿用。通常是把控制元件拿來在自己的視窗上當做子視窗來使用。所以在建立的時候呼叫CreateWindow函式需要指定父視窗的值,然後再把建立的視窗風格改為子視窗WS_CHILD風格新增,再給Windows的控制元件新增子視窗的編號來方便呼叫訊息處理函式來處理控制元件訊息,這裡需要修改建立視窗的hMenu的值,這個值是一個選單的控制代碼,對於子視窗,hMenu指定子視窗識別符號,該值是對話方塊控制元件用來通知其父項事件的整數值。應用程式確定子視窗識別符號;對於具有相同父視窗的所有子視窗,它必須是唯一的。也就是說在建立windows控制元件的時候對於hMenu這個值是作為子視窗的唯一的標識值,而且存在wParam的低空間中
可以用LOWORD(wParam)來取這個值。

//完整程式碼
#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;
}