Win32编程之ToolBar的使用

今天使用win32编程创建ToolBar, 由于对这块不熟, 所以今天特意写一下,怕以后忘了, 也没啥技术含量, 大牛飘过~~~

创建ToolBar可以使用CreateToolBar和CreateWindowEx, 由于微软不提倡使用CreateToolBar, 所以这里使用的是后者。

用CreateWindowEx需要指定窗口类为TOOLBARCLASSNAME,这里就直接上代码了

(1)使用commctl中的标准位图

HWND CreateAToolBar(HWND hwnDlg)  // hwnDlg为窗口的句柄

{

  const int BUTTONNUMS = 2;      //工具栏上按钮的数目
     TBBUTTON tbb[2];                    //按钮 
     ZeroMemory(tbb, sizeof(tbb));  
     tbb[0].iBitmap = STD_FILENEW;  
     tbb[0].fsState = TBSTATE_ENABLED;  
     tbb[0].fsStyle = TBSTYLE_BUTTON;  
     tbb[1].iBitmap = STD_REDOW;  
     tbb[1].fsState = TBSTATE_ENABLED;  
     tbb[1].fsStyle = TBSTYLE_BUTTON;

//位图,commctl中的标准位图  
    TBADDBITMAP tbBitmap;  
    tbBitmap.hInst = HINST_COMMCTRL;  
    tbBitmap.nID = IDB_STD_SMALL_COLOR;  
 
    RECT windowRect;  
    GetWindowRect(hwndParent,&windowRect);  
    hwndToolbar = CreateWindowEx(0L,TOOLBARCLASSNAME,NULL,WS_CHILD|WS_VISIBLE|WS_BORDER,0,0,0,0,  
        hwndParent,(HMENU)ID_TOOLBAR,hInst,NULL);  
    //将位图添加到工具栏  
    SendMessage(hwndToolbar,TB_ADDBITMAP,0,(LPARAM)&tbBitmap);  
    //计算工具栏大小  
    SendMessage(hwndToolbar,TB_BUTTONSTRUCTSIZE,(WPARAM)sizeof(TBBUTTON),0);  
    //添加按钮到工具栏  
    SendMessage(hwndToolbar,TB_ADDBUTTONS,(WPARAM)BUTTONNUMS,(LPARAM)&tbb);  
 
    return hwndToolbar;

}

(2)  另一种就是使用自己定位的位图(这里我是一个一个位图添加的, 不是一个位图里面包含很多的图片)

BOOL CreateAToolBar(HWND hwnDlg)
{

HWND hToolBar = CreateWindowEx(NULL, TOOLBARCLASSNAME, " ", WS_CHILD | WS_VISIBLE | TBSTYLE_TOOLTIPS,
                        0, 0, 0, 0, hwnDlg, /*NULL*/(HMENU)1111, hInst, NULL);   //  创建工具栏
    TBBUTTON tbb[13];
    ZeroMemory(tbb, sizeof(tbb));

HIMAGELIST hInmageList = ImageList_Create(32, 32, ILC_COLOR24/*ILC_COLOR16 | ILC_MASK*/, 13, 0);  // 创阿位图列表, 13表示我创建了13个这样的

int iBitmap[13] = {0};
    WORD Id[13] = { IDB_FileManage, IDB_ScreenControl, IDB_Cmd, IDB_KeyRecord, IDB_ProcessManage, IDB_Regedit, IDB_ServiceManage,
        IDB_WindowsManage, IDB_AudioMomonitor, IDB_DownLoad, IDB_FlushIP, IDB_ParameterSet,IDB_ProduceClient };

for (int i = 0; i < 13; i++)
    {
        iBitmap[i] = ImageList_Add(hInmageList, LoadBitmap(hInst, MAKEINTRESOURCE(Id[i])), 0);
    }
    
    SendMessage(hToolBar, TB_SETIMAGELIST, 0, (LPARAM)hInmageList);   //将位图添加到工具栏

TCHAR *szBitMAp[] = { "文件管理", "屏幕监控", "超级终端", "键盘记录", "进程管理", "注册表管理", "服务管理", "窗口管理",
        "音视频监控","下载管理","刷新IP", "参数设置", "创建客户"};
    for (int j = 0; j < 13; j++)
    {
        tbb[j].iBitmap = MAKELONG(iBitmap[j], 0);
        tbb[j].fsState = TBSTATE_ENABLED;
        tbb[j].fsStyle = TBSTYLE_BUTTON;
        tbb[j].iString = (INT_PTR)szBitMAp[j];
    }

SendMessage(hToolBar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);   //计算工具栏大小
    SendMessage(hToolBar, TB_ADDBUTTONS, sizeof(tbb) / sizeof(TBBUTTON), (LPARAM)&tbb);     //添加按钮到工具栏 
    //SendMessage(hToolBar, TB_SETBUTTONSIZE, 0, (LPARAM)MAKELONG(60, 60));  
    SendMessage(hToolBar, TB_AUTOSIZE, 0, 0);    //调整工具栏大小

//ShowWindow(hToolBar, TRUE);
    
    return TRUE;
}

时间: 2024-10-17 22:32:23

Win32编程之ToolBar的使用的相关文章

C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo

在文章开始之前,首先简单介绍一下什么是MEF,MEF,全称Managed Extensibility Framework(托管可扩展框架).单从名字我们不难发现:MEF是专门致力于解决扩展性问题的框架,MSDN中对MEF有这样一段说明: Managed Extensibility Framework 或 MEF 是一个用于创建可扩展的轻型应用程序的库. 应用程序开发人员可利用该库发现并使用扩展,而无需进行配置. 扩展开发人员还可以利用该库轻松地封装代码,避免生成脆弱的硬依赖项. 通过 MEF,不

学习编程之Python篇(一)

第一次接触编程,你将面对两大难题: 1.  对所要使用的编程语言的语法和语义不甚了了. 2.  不知道如何通过编程来解决问题. 作为一名新手,你会尝试同时来解决这两个难题:一边熟悉编程语言的语法语义,一边考虑如何靠编程解决问题.这是一个循序渐进的过程,万事开头难,务必保持耐心,切勿操之过急. 学习编程其实没有什么捷径可走,最好的方法就是反复操练,聆听规则,讨论方法,都不如真正做点什么. 在掌握了一些编程语言的语法语义之后,接下来的难题就是怎样才能写出好的程序.那么,我们首先来看看什么是好的程序.

linux网络编程之shutdown() 与 close()函数详解

linux网络编程之shutdown() 与 close()函数详解 参考TCPIP网络编程和UNP: shutdown函数不能关闭套接字,只能关闭输入和输出流,然后发送EOF,假设套接字为A,那么这个函数会关闭所有和A相关的套接字,包括复制的:而close能直接关闭套接字. 1.close()函数 [cpp] view plain copy print? <span style="font-size:13px;">#include<unistd.h> int 

C++混合编程之idlcpp教程Python篇(8)

上一篇在这 C++混合编程之idlcpp教程Python篇(7) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial6中,同样加入了四个文件:PythonTutorial6.cpp, Tutorial6.cpp, Tutorial6.i, tutorial6.py.其中PythonTutorial6.cpp的内容基本和PythonTutorial5.cpp雷同,不再赘述.首先看一下Tutorial6.i的内容: #import "../../p

QT核心编程之Qt线程 (c)

QT核心编程之Qt线程是本节要介绍的内容,QT核心编程我们要分几个部分来介绍,想参考更多内容,请看末尾的编辑推荐进行详细阅读,先来看本篇内容. Qt对线程提供了支持,它引入了一些基本与平台无关的线程类.线程安全传递事件的方式和全局Qt库互斥量允许你从不同的线程调用Qt的方法.Qt中与线程应用相关的类如表6所示. 表6 Qt中与线程相关的类 使用线程需要Qt提供相应的线程库的支持,因此,在编译安装Qt时,需要加上线程支持选项. 当在Windows操作系统上编译Qt时,线程支持是在一些编译器上的一个

C++混合编程之idlcpp教程Python篇(4)

上一篇在这 C++混合编程之idlcpp教程Python篇(3) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial2中,同样加入了三个文件 PythonTutorial2.cpp, Tutorial2.i, tutorial2.py.其中PythonTutorial2.cpp的内容基本和PythonTutorial1.cpp雷同,不再赘述.首先看一下Tutorial2.i的内容: namespace tutorial { struct Poi

C++混合编程之idlcpp教程Lua篇(4)

上一篇在这  C++混合编程之idlcpp教程Lua篇(3) 与前面的工程相似,工程LuaTutorial2中,同样加入了三个文件 LuaTutorial2.cpp, Tutorial2.i, tutorial2.lua.其中LuaTutorial2.cpp的内容基本和LuaTutorial1.cpp雷同,不再赘述. 首先看一下Tutorial2.i的内容: namespace tutorial { struct Point { float x; float y; meta: Point();

C++混合编程之idlcpp教程Python篇(3)

上一篇 C++混合编程之idlcpp教程Python篇(2) 是一个 hello world 的例子,仅仅涉及了静态函数的调用.这一篇会有新的内容. 与PythonTutorial0相似,工程PythonTutorial1中,同样加入了三个文件 PythonTutorial1.cpp, Tutorial1.i, tutorial1.py 其中PythonTutorial1.cpp的内容基本和PythonTutorial0.cpp雷同,不再赘述. 首先看一下Tutorial1.i的内容: name

Linux/Unix C编程之的perror函数,strerror函数,errno

#include <stdio.h> // void perror(const char *msg); #include <string.h> // char *strerror(int errnum); #include <errno.h> //errno ? errno 是错误代码,在 errno.h头文件中: perror是错误输出函数,输出格式为:msg:errno对应的错误信息(加上一个换行符): strerror?是通过参数 errnum (就是errno)