Windows图形界面(GUI)-SDK-C/C++ - 按钮(button)

目录

按钮(button)

按钮样式

创建控件

初始控件

消息处理

示例代码


按钮(button)

按钮样式
  • 推按钮(Push Button)
    • 推按钮是最常见的按钮控件,用于触发某个动作。常见的推按钮类型有普通按钮、默认按钮、关闭按钮等。
  • 复选框(Check Box)
    • 复选框允许用户在多个选项中进行选择,每个选项可以独立地被选中或取消选中。
  • 单选按钮(Radio Button)
    • 单选按钮用于在一组互斥选项中进行选择,用户只能选择其中一个选项。
创建控件
  • 使用CreateWindowCreateWindowEx函数创建推按钮控件。
初始控件
  • 设置控件属性,初始状态。
消息处理
  • 在窗口过程函数中处理WM_COMMAND消息。
示例代码
#include <Windows.h>
#include "resource.h"

#define ID_BUTTON_PUSH1					1
#define ID_BUTTON_PUSH2					11
#define ID_BUTTON_PUSH3					111
#define ID_BUTTON_PUSH4					222
#define ID_BUTTON_PUSH5					333
#define ID_BUTTON_CHECKBOX1				2
#define ID_BUTTON_RADIOBUTTON1			3
#define ID_BUTTON_RADIOBUTTON2			4

HINSTANCE ghInstance = 0;

LRESULT CALLBACK MainWindowProc (HWND, UINT, WPARAM, LPARAM);

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	ghInstance = hInstance;

	// 注册窗口
	WNDCLASSEX wndclass = { 0 };
	wndclass.cbSize = sizeof(WNDCLASSEX);
	wndclass.style = NULL;
	wndclass.lpfnWndProc = MainWindowProc;
	wndclass.cbClsExtra = NULL;
	wndclass.cbWndExtra = NULL;
	wndclass.hInstance = hInstance;
	wndclass.hIcon = NULL;
	wndclass.hCursor = NULL;
	wndclass.hbrBackground = (HBRUSH)COLOR_WINDOW;
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = TEXT("0xCC");
	wndclass.hIconSm = NULL;

	if (!RegisterClassEx(&wndclass))
	{
		MessageBox(NULL, TEXT("RegisterClassEx Failed"), TEXT("Error"), MB_OK);
		return 1;
	}

	// 创建窗口
	HWND hwnd = CreateWindowEx(
		WS_EX_CLIENTEDGE,
		TEXT("0xCC"),
		TEXT("CreateWindowEx"),
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		960,
		540,
		NULL,
		NULL,
		hInstance,
		NULL
	);

	if (hwnd == NULL)
	{
		MessageBox(NULL, TEXT("CreateWindowEx Failed"), TEXT("Error"), MB_OK);
		return 1;
	}

	// 显示窗口
	ShowWindow(hwnd, SW_SHOWDEFAULT);

	// 更新窗口
	UpdateWindow(hwnd);

	// 消息处理
	MSG msg = { 0 };
	while (GetMessage(&msg, 0, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	

	return 0;
}

// 窗口过程
LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	static HWND hButton1, hButton2, hButton3, hButton4, hButton5, hCheck, hRADIOBUTTON1, hRADIOBUTTON2;

	switch (uMsg)
	{
	case WM_CREATE:
	{
		//创建控件

		hButton1 = CreateWindow(
			TEXT("BUTTON"),
			TEXT("BS_PUSHBUTTON1"),
			WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON ,
			10, 10,
			150, 40,
			hwnd,
			(HMENU)ID_BUTTON_PUSH1,
			ghInstance,
			NULL);

		hButton2 = CreateWindow(
			TEXT("BUTTON"),
			TEXT("BS_PUSHBUTTON2"),
			WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
			170, 10,
			150, 40,
			hwnd,
			(HMENU)ID_BUTTON_PUSH2,
			ghInstance,
			NULL);

		hButton3 = CreateWindow(
			TEXT("BUTTON"),
			TEXT("BS_PUSHBUTTON3"),
			WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_BITMAP,
			330, 10,
			150, 40,
			hwnd,
			(HMENU)ID_BUTTON_PUSH3,
			ghInstance,
			NULL);

		hButton4 = CreateWindow(
			TEXT("BUTTON"),
			TEXT("BS_PUSHBUTTON4"),
			WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
			170, 60,
			150, 40,
			hwnd,
			(HMENU)ID_BUTTON_PUSH4,
			ghInstance,
			NULL);

		hButton5 = CreateWindow(
			TEXT("BUTTON"),
			TEXT("BS_PUSHBUTTON5"),
			WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
			330, 60,
			150, 40,
			hwnd,
			(HMENU)ID_BUTTON_PUSH5,
			ghInstance,
			NULL);

		hCheck = CreateWindow(
			TEXT("BUTTON"),
			TEXT("CHECKBOX"),
			WS_CHILD | WS_VISIBLE | BS_CHECKBOX,
			10, 60,
			150, 40,
			hwnd,
			(HMENU)ID_BUTTON_CHECKBOX1,
			ghInstance,
			NULL);

		hRADIOBUTTON1 = CreateWindow(
			TEXT("BUTTON"),
			TEXT("RADIOBUTTON1"),
			WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON,
			10, 110,
			150, 40,
			hwnd,
			(HMENU)ID_BUTTON_RADIOBUTTON1,
			ghInstance,
			NULL);

		hRADIOBUTTON2 = CreateWindow(
			TEXT("BUTTON"),
			TEXT("RADIOBUTTON2"),
			WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON,
			10, 160,
			150, 40,
			hwnd,
			(HMENU)ID_BUTTON_RADIOBUTTON2,
			ghInstance,
			NULL);

		//初始控件
		SendMessage(hCheck, BM_SETCHECK, BST_CHECKED, 0);
		SendMessage(hRADIOBUTTON1, BM_SETCHECK, BST_CHECKED, 0);

		HBITMAP hBitmap = LoadBitmap((HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE), MAKEINTRESOURCE(IDB_BITMAP1));
		if (hBitmap != NULL)
		{
			SendMessage(hButton3, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBitmap);
		}
		break;
	}
	case WM_DESTROY:
	{
		PostQuitMessage(0);
		break;
	}
	case WM_COMMAND:
	{
		switch (LOWORD(wParam))
		{
			case ID_BUTTON_PUSH1:
			{
				MessageBox(NULL, TEXT("ID_BUTTON_PUSH1"), NULL, NULL);
				break;
			}
			case ID_BUTTON_PUSH2:
			{
				SendMessage(hButton1, BM_CLICK, 0, 0);
				break;
			}
			case ID_BUTTON_CHECKBOX1:
			{
				BOOL ret = SendMessage(hCheck, BM_GETCHECK, 0, 0) == BST_CHECKED;
				HWND hChe = GetDlgItem(hwnd, ID_BUTTON_CHECKBOX1);
				SendMessage(hChe, BM_SETCHECK, ret ? BST_UNCHECKED : BST_CHECKED, 0);
				break;
			}
			case ID_BUTTON_RADIOBUTTON1:
			case ID_BUTTON_RADIOBUTTON2:
			{
				SendMessage(hRADIOBUTTON1, BM_SETCHECK, BST_UNCHECKED, 0);
				SendMessage(hRADIOBUTTON2, BM_SETCHECK, BST_UNCHECKED, 0);
				SendMessage((HWND)lParam, BM_SETCHECK, BST_CHECKED, 0);
				//SendMessage(GetDlgItem(hwnd, LOWORD(wParam)), BM_SETCHECK, BST_CHECKED, 0);
				break;
			}
			case ID_BUTTON_PUSH5:
			{
				SendMessage(hButton4, BM_SETSTYLE, BS_CHECKBOX, TRUE);
				break;
			}

		}
	}
	default:
		return DefWindowProc(hwnd, uMsg, wParam, lParam);
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值