首页 > 其他分享 >Win32 API从磁盘文件图片创建工具栏图标

Win32 API从磁盘文件图片创建工具栏图标

时间:2023-04-28 22:57:41浏览次数:38  
标签:wc hWnd WM Win32 API 消息 hInstance 工具栏 NULL

关键字:Win32 API从磁盘,文件,图片创建工具栏图标,包含提示文字。

编译命令:g++ demo01.cpp -mwindows -lcomctl32 -ldwmapi -o demo01 -static -Wall -std=c++11

#define UNICODE

#include <Windows.h>
#include <strsafe.h>
#include <commctrl.h>

/*****
 * CALLBACK代表__stdcall 参数的传递顺序 从右到左 依次入栈 并且在函数返回前 依次出栈
 * HWND UINT WPARAM LPARAM
 * 消息所属的窗口句柄
 * 消息名称 WM_XXX消息名
 * 键盘附加消息
 * 鼠标附加消息
 */
HINSTANCE g_hInstance;
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_CREATE:
    {
        HIMAGELIST hImageList = ImageList_Create(48, 48, ILC_COLOR32 | ILC_MASK, 3, 1);

        // HICON hIcon = LoadIcon(GetModuleHandle(NULL),
        //                        MAKEINTRESOURCE(IDI_ICON1 + i));
        for (int i = 11; i < 14; i++)
        {
            HICON hIcon = (HICON)::LoadImage(NULL, TEXT("D:\\code\\AUtils\\cpp\\winframe\\icon\\000.ico"), IMAGE_ICON, 48, 48, LR_LOADFROMFILE);
            ImageList_AddIcon(hImageList, hIcon);
            DestroyIcon(hIcon);
        }

        //创建工具条控件
        HWND hToolBar = CreateWindow(TOOLBARCLASSNAME, NULL,
                                     WS_CHILD | WS_VISIBLE | TBSTYLE_WRAPABLE, 0, 0, 0, 0, hWnd, (HMENU)1,
                                     g_hInstance, NULL);

        //设置工具条的图片列表
        ::SendMessage(hToolBar, TB_SETIMAGELIST, 0, (LPARAM)hImageList);

        //添加一些按钮到工具条上去
        TBBUTTON tbButtons[3] = {
            {0, NULL, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, {0}, 0, (INT_PTR)TEXT("按钮1")},
            {1, NULL, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, {0}, 0, (INT_PTR)TEXT("按钮2")},
            {2, NULL, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, {0}, 0, (INT_PTR)TEXT("按钮3")}};

        ::SendMessage(hToolBar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
        ::SendMessage(hToolBar, TB_ADDBUTTONS, (WPARAM)3, (LPARAM)&tbButtons);

        //自动调整工具条的大小并显示
        ::SendMessage(hToolBar, TB_AUTOSIZE, 0, 0);
        ::ShowWindow(hToolBar, true);
    }
    break;
    case WM_PAINT:
    {
    }
    break;
    case WM_SIZE:
    {
    }
    break;
    case WM_COMMAND:
    {
    }
    break;
    case WM_LBUTTONDOWN:
    {
        int xPos = LOWORD(lParam);
        int yPos = HIWORD(lParam);
        TCHAR buffer[256];
        StringCchPrintf(buffer, 256, TEXT("xPos: %d, yPos: %d"), xPos, yPos);
        MessageBox(hWnd, buffer, TEXT("WM_LBUTTONDOWN"), MB_OK);
    }
    break;
    case WM_KEYDOWN:
    {
    }
    break;
    case WM_CLOSE:
    {
        DestroyWindow(hWnd);
    }
    break;
    case WM_DESTROY:
    {
        PostQuitMessage(0);
    }
    break;
    default:
    {
    }
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

// WINAPI代表__stdcall 参数的传递顺序 从右到左 依次入栈 并且在函数返回前 依次出栈
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASS wc;
    wc.cbClsExtra = 0;                                      // 类的额外内存
    wc.cbWndExtra = 0;                                      // 窗口额外内存
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 背景
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);               // 光标 第一个为NULL代表使用系统提供的光标
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);             // 图标 第一个为NULL代表使用系统提供的图标
    wc.hInstance = hInstance;                               // 应用程序实例句柄
    wc.lpfnWndProc = WindowProc;                            // 回调函数
    wc.lpszClassName = TEXT("main");                        // 窗口类名称
    wc.lpszMenuName = NULL;                                 // 菜单名称
    wc.style = CS_HREDRAW | CS_VREDRAW;                     // 显示风格
    g_hInstance = hInstance;
    RegisterClass(&wc);

    /*****
     * CreateWindow()
     * lpClassName,lpWindowName,dwStyle,x,y,nWidth,nHeight,hWndParent,hMenu,hInstance,lpParam
     * 类名
     * 标题名
     * WS_OVERLAPPEDWINDOW 混合风格
     * x坐标 CW_USEDEFAULT
     * y坐标
     * 宽
     * 高
     * 父窗口 NULL
     * 菜单 NULL
     * 实例句柄 hInstance
     * 附加值
     */
    HWND hWnd = CreateWindow(wc.lpszClassName, TEXT("Windows"), WS_OVERLAPPEDWINDOW,
                             CW_USEDEFAULT,
                             CW_USEDEFAULT,
                             CW_USEDEFAULT,
                             CW_USEDEFAULT,
                             NULL, NULL, hInstance, NULL);
    if (hWnd == NULL)
    {
        return 0;
    }
    ShowWindow(hWnd, SW_SHOWNORMAL);
    UpdateWindow(hWnd);

    /*****
     * HWND hwnd; 主窗口句柄
     * UINT message; 具体消息名称
     * WPARAM wParam; 附加消息 键盘消息
     * LPARAM lParam; 附加消息 鼠标消息
     * DWORD time; 消息产生时间
     * POINT pt; 附加消息 鼠标消息 x y
     */
    MSG msg;

    /*****
     * LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax
     * 消息
     * 捕获窗口 NULL代表捕获所有窗口
     * 最小的过滤消息 0代表捕获所有消息
     * 最大的过滤消息 0代表捕获所有消息
     */
    while (GetMessage(&msg, NULL, 0, 0))
    {
        // 如果按的是组合键 需要翻译
        TranslateMessage(&msg);
        // 单按一个键盘就直接分发消息
        DispatchMessage(&msg);
    }
    return 0;
}

运行结果:

标签:wc,hWnd,WM,Win32,API,消息,hInstance,工具栏,NULL
From: https://www.cnblogs.com/codebai/p/17363335.html

相关文章

  • BAPI_ACC_DOCUMENT_POST 解决多行一次性供应商凭证导入问题
     POST函数将一次性供应商的信息放在抬头入参上,业务需要多个一次性供应商一起做凭证时,就满足不了。抬头入参会把所有行的一次性给一样的名称。想起之前做的 IF_EX_ACC_DOCUMENT~CHANGE,于是尝试了一下,发现可以解决IF_EX_ACC_DOCUMENT~CHANGE  "add by itl_csw 28.04.......
  • kubernetes api访问权限控制体验之一
    1.简介目前想实现通过python脚本,实时获取k8s的service信息,然后写成nginx.conf脚本,并且也让chatgpt写了代码。运行的时候提示401权限不够:root@gateway-7576bf68bb-cf55t:/usr/local/openresty#python3gen_nginx_conf.pyTraceback(mostrecentcalllast):File"g......
  • Unity中Android API 28之后无法HTTP请求
    本文节选自洪流学堂公众号技术专栏《大话Unity2019》,未经允许不可转载。洪流学堂公众号回复log,获取最新版运行时查看日志的工具。小新:“最近我升级到AndroidAPILevel28之后,发现发布的安卓包,网络请求都不通了,这是咋回事啊?”大智:“遇到这种问题,调试的时候首先去看日志,你研究运行日......
  • Java获取1688商品详情API接口示例说明
    ​ 在使用JavaWeb类的时候,如果我们需要获取一个网站中某个商品的详细信息,我们可以使用JavaScript来获取。我们可以用JavaScript来实现一个获取商品详情的API接口,来获取一个网站中某个商品的详细信息。在使用JavaScript进行接口请求时,可以使用下面的方法:通过javascript获......
  • 淘宝店铺商品详情接口代码-获取淘宝商品详情 API 接口返回值说明示例
    ​现在某宝的规则越来越严,想要入驻某宝需要审核的特别严格,不然就会被封店,那么大家知道某宝店铺商品详情接口吗?下面是我整理的关于某宝店铺商品详情接口的相关内容,大家可以来了解下! 目前提供的接口有:商品详情、商品详情原数据、商品评论、商品快递费用、淘宝分类详情、关键字搜......
  • Fastapi之微服务Consul应用注册发现
    importuvicornfromfastapiimportFastAPIapp=FastAPI()defregister(server_name,ip,port):c=consul.Consul(host="127.0.0.1",port=8500)#consul服务器信息print(f"开始注册服务{server_name}")check=consul.Check.tcp(ip,po......
  • Fastapi之OAuth2认证
    1.基于用户名密码认证fromtypingimportOptionalfromfastapiimportAPIRouter,Depends,HTTPExceptionfromfastapi.securityimportOAuth2PasswordBearer,OAuth2PasswordRequestFormfrompydanticimportBaseModelfromstarletteimportstatustokens=APIRout......
  • 基于台风信息查询 API 设计台风预警系统的基本思路
    引言在过去的几十年中,由于全球气候变化等因素的影响,台风的强度和频率都有所增加,给人类社会带来了极大的威胁。在这种背景下,一个高效可靠的台风预警和监测系统显得尤为重要。这种系统可以通过获取、存储、处理和分析各种相关数据,来实现对台风的实时监测、预测和预警,并向相关部门和......
  • API 架构风格演化史:CORBA-XMLRPC(SOAP)-REST-JSONRPC-GraphQL-gRPC
    我们先来看一张 TwitterArchitecture2022CodeFirstv.sAPIFirst软件开发理念的改变下图显示了代码优先开发和API优先开发之间的差异。为什么我们要考虑API优先设计?微服务增加了系统的复杂性。我们有单独的服务来服务系统的不同功能。尽管这种体系结构促进了职责的脱钩和分......
  • 基于机器学习的纠错系统技术 - 智能文本纠错 API
    引言在过去的几十年里,文本纠错技术已经取得了巨大的进展,从最初的基于规则的纠错系统到现在的基于机器学习的纠错系统,技术的发展已经帮助人们解决了大量的文本纠错问题,随着机器学习技术的发展,文本纠错技术也发生了重大变化。本文将介绍一款新的基于机器学习的纠错技术,并详细列出......