Windows API应用程序开发——图案自定义的按钮的创建

图案自定义的按钮创建

一、工程创建和控件配置

  • 新建文件夹,作为工程文件夹,选择自己喜欢的两张图片,分别为 bmp 格式和 ico 格式,也放入该文件夹。

  • 打开VS,左上角文件-新建-项目

  • 筛选语言为C++,平台为Windows,项目类型为桌面,选择Windows桌面向导,下一步。


Windows桌面向导

  • 对项目命名,选定项目路径为先前的文件夹,创建。
  • 在应用程序类型中选择桌面应用程序(.exe),勾选空项目,确定。

应用程序类型

  • 在解决方案资源管理器窗口中,选中创建的项目,右击,添加-新建项,选择C++文件(.cpp),改名,添加。

添加C++文件

  • 选中资源文件,右击,添加-资源文件-Bitmap-导入,导入自己喜欢的 bmp 文件。同理,导入自己喜欢的 ico 文件。

添加资源

  • 我们需要在窗口创建三个按钮,分别为普通按钮、图标按钮和位图按钮。首先,在 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
      

二、完整代码

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)));

四、运行结果


结果

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

frozendure

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值