图案自定义的按钮创建
一、工程创建和控件配置
-
新建文件夹,作为工程文件夹,选择自己喜欢的两张图片,分别为 bmp 格式和 ico 格式,也放入该文件夹。
-
打开VS,左上角
文件
-新建
-项目
。 -
筛选语言为
C++
,平台为Windows
,项目类型为桌面
,选择Windows桌面向导
,下一步。
![](https://img-blog.csdnimg.cn/420ae1b5c04a4fe49b14ab6a5847f450.png#pic_center)
Windows桌面向导
- 对项目命名,选定项目路径为先前的文件夹,创建。
- 在应用程序类型中选择
桌面应用程序(.exe)
,勾选空项目,确定。
![](https://img-blog.csdnimg.cn/a99c28550ad24b8b872d9535375faddc.png#pic_center)
应用程序类型
- 在解决方案资源管理器窗口中,选中创建的项目,右击,
添加
-新建项
,选择C++文件(.cpp)
,改名,添加。
![](https://img-blog.csdnimg.cn/a624df501eda416da6263a275a91ed75.png#pic_center)
添加C++文件
- 选中
资源文件
,右击,添加
-资源文件
-Bitmap
-导入
,导入自己喜欢的 bmp 文件。同理,导入自己喜欢的 ico 文件。
![](https://img-blog.csdnimg.cn/044f031bad7141cd963efb388c6b2928.png#pic_center)
添加资源
- 我们需要在窗口创建三个按钮,分别为普通按钮、图标按钮和位图按钮。首先,在 resource.h 文件中添加这三个控件的声明。
- 打开resource.h 文件,此时可以看见,上一步添加图片文件的操作,已经在resource.h 文件中反映出来了,即
#define IDB_BITMAP1 101 #define IDI_ICON1 102
- 我们就在此处,添加三个控件的声明
#define IDC_PUSHBUTTON 1000 #define IDC_ICONBUTTON 1001 #define IDC_BITMAPBUTTON 1002
- 打开resource.h 文件,此时可以看见,上一步添加图片文件的操作,已经在resource.h 文件中反映出来了,即
二、完整代码
1、<.cpp> 文件:
#include <Windows.h>
#include <tchar.h>
#include <strsafe.h>
#include "resource.h"
// 函数声明
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
// WinMain 函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// 定义窗口类
WNDCLASSEX wndclass;
TCHAR szAppName[] = TEXT("喜羊羊"); // 窗口类名; 标题"喜羊羊"
HWND hwnd;
MSG msg;
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WindowProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
wndclass.hIconSm = NULL;
RegisterClassEx(&wndclass);
hwnd = CreateWindowEx(0, szAppName, szAppName, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 300, 300, NULL, NULL, hInstance, NULL); //在此修改窗口尺寸
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0) != 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
// 控件结构体定义
struct{int m_nStyle;PTSTR m_pText;}Buttons[] =
{
BS_PUSHBUTTON | BS_NOTIFY | WS_TABSTOP, (PTSTR)TEXT("普通按钮"), //
BS_ICON | BS_NOTIFY | WS_TABSTOP, (PTSTR)TEXT("图标按钮"), // BS_ICON 图标
BS_BITMAP | BS_NOTIFY | WS_TABSTOP, (PTSTR)TEXT("位图按钮"), // BS_BITMAP 位图
};
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static HWND hwndButton[3]; // 子窗口控件句柄数组
int arrPos[3] = { 5, 60, 130}; // 各控件的y向位置
LPDRAWITEMSTRUCT lpDIS;
switch (uMsg)
{
case WM_CREATE:
// 创建3个子窗口控件
hwndButton[0] = CreateWindowEx(0, TEXT("Button"), Buttons[0].m_pText,
WS_CHILD | WS_VISIBLE | Buttons[0].m_nStyle, 60, arrPos[0], // x坐标
150, 45, hwnd, (HMENU)(1000 + 0), // 宽 和 高
((LPCREATESTRUCT)lParam)->hInstance, NULL);
hwndButton[1] = CreateWindowEx(0, TEXT("Button"), Buttons[1].m_pText,
WS_CHILD | WS_VISIBLE | Buttons[1].m_nStyle, 110, arrPos[1],
50, 50, hwnd, (HMENU)(1000 + 1),
((LPCREATESTRUCT)lParam)->hInstance, NULL);
hwndButton[2] = CreateWindowEx(0, TEXT("Button"), Buttons[2].m_pText,
WS_CHILD | WS_VISIBLE | Buttons[2].m_nStyle, 50, arrPos[2],
176, 86, hwnd, (HMENU)(1000 + 2),
((LPCREATESTRUCT)lParam)->hInstance, NULL);
// 为图标按钮、位图按钮设置图标、位图
SendDlgItemMessage(hwnd, IDC_ICONBUTTON, BM_SETIMAGE, IMAGE_ICON,
(LPARAM)LoadImage(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDI_ICON1),
IMAGE_ICON, 45, 45, LR_DEFAULTCOLOR)); // 尺寸
SendDlgItemMessage(hwnd, IDC_BITMAPBUTTON, BM_SETIMAGE, IMAGE_BITMAP,
(LPARAM)LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDB_BITMAP1)));
case WM_DRAWITEM:
lpDIS = (LPDRAWITEMSTRUCT)lParam;
return TRUE;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
2、<resource.h> 文件:
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 Project1.rc 使用
//
#define IDB_BITMAP1 101
#define IDI_ICON1 102
#define IDC_PUSHBUTTON 1000
#define IDC_ICONBUTTON 1001
#define IDC_BITMAPBUTTON 1002
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 103
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
三、相关解释
- 在
.h
文件里,对各个资源及控件都有了声明和定义。
#define IDB_BITMAP1 101
#define IDI_ICON1 102
#define IDC_PUSHBUTTON 1000
#define IDC_ICONBUTTON 1001
#define IDC_BITMAPBUTTON 1002
- 在
WindowProc
-case WM_CREATE
里的以下语句,完成了嵌入图片
// 为图标按钮、位图按钮设置图标、位图
SendDlgItemMessage(hwnd, IDC_ICONBUTTON, BM_SETIMAGE, IMAGE_ICON,
(LPARAM)LoadImage(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDI_ICON1),
IMAGE_ICON, 45, 45, LR_DEFAULTCOLOR)); // 尺寸
SendDlgItemMessage(hwnd, IDC_BITMAPBUTTON, BM_SETIMAGE, IMAGE_BITMAP,
(LPARAM)LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDB_BITMAP1)));
四、运行结果
![](https://img-blog.csdnimg.cn/a3a8b2294c884a9495c5bcbd4a53625e.gif#pic_center)
结果