使用Win API创建工具栏

        到网上查了下资料,初步实现了使用WinAPI创建工具栏。


        下面是创建一个标准工具栏的函数,(这里所谓标准工具栏是指工具栏按钮图片是WinSDK内置的)

  1. BOOL CreateStandardToolbar(HWND hParent)  
  2. {  
  3.     // 首先需要先调用InitCommonControls函数,否则不能创建工具栏。   
  4.     InitCommonControls();  
  5.   
  6.     HWND hTool;  
  7.     TBBUTTON tbb[3];  
  8.     TBADDBITMAP tbab;  
  9.   
  10.     HINSTANCE hThisInstance = GetModuleHandle(NULL);  
  11.   
  12.     hTool = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE|CCS_ADJUSTABLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN, 0, 0, 0, 0,  
  13.                            hParent,(HMENU)IDC_MAIN_TOOL,hThisInstance, NULL);  
  14.   
  15.     if(hTool == NULL)  
  16.     {  
  17.         ::MessageBox(hParent, "Could not create tool bar.""Error", MB_OK | MB_ICONERROR);  
  18.         return FALSE;  
  19.     }  
  20.     // 发送 TB_BUTTONSTRUCTSIZE 消息, 出于向后兼容的考虑.   
  21.     SendMessage(hTool, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);  
  22.   
  23.     tbab.hInst = HINST_COMMCTRL;  
  24.     tbab.nID = IDB_STD_SMALL_COLOR;  
  25.     SendMessage(hTool, TB_ADDBITMAP, 0, (LPARAM)&tbab);  
  26.   
  27.     ZeroMemory(tbb, sizeof(tbb));  
  28.     tbb[0].iBitmap = STD_FILENEW;  
  29.     tbb[0].fsState = TBSTATE_ENABLED;  
  30.     tbb[0].fsStyle = TBSTYLE_BUTTON;  
  31.     tbb[0].idCommand = ID_FILE_NEW;  
  32.   
  33.     tbb[1].iBitmap = STD_FILEOPEN;  
  34.     tbb[1].fsState = TBSTATE_ENABLED;  
  35.     tbb[1].fsStyle = TBSTYLE_BUTTON;  
  36.     tbb[1].idCommand = ID_FILE_OPEN;  
  37.   
  38.     tbb[2].iBitmap = STD_FILESAVE;  
  39.     tbb[2].fsState = TBSTATE_ENABLED;  
  40.     tbb[2].fsStyle = TBSTYLE_BUTTON;  
  41.     tbb[2].idCommand = ID_FILE_SAVEAS;  
  42.   
  43.     // 发送添加按钮的消息   
  44.     SendMessage(hTool, TB_ADDBUTTONS, sizeof(tbb)/sizeof(TBBUTTON), (LPARAM)&tbb);  
  45.     return TRUE;  
  46. }  
BOOL CreateStandardToolbar(HWND hParent)
{
    // 首先需要先调用InitCommonControls函数,否则不能创建工具栏。
    InitCommonControls();

    HWND hTool;
    TBBUTTON tbb[3];
    TBADDBITMAP tbab;

    HINSTANCE hThisInstance = GetModuleHandle(NULL);

    hTool = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE|CCS_ADJUSTABLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN, 0, 0, 0, 0,
                           hParent,(HMENU)IDC_MAIN_TOOL,hThisInstance, NULL);

    if(hTool == NULL)
    {
        ::MessageBox(hParent, "Could not create tool bar.", "Error", MB_OK | MB_ICONERROR);
        return FALSE;
    }
    // 发送 TB_BUTTONSTRUCTSIZE 消息, 出于向后兼容的考虑.
    SendMessage(hTool, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);

    tbab.hInst = HINST_COMMCTRL;
    tbab.nID = IDB_STD_SMALL_COLOR;
    SendMessage(hTool, TB_ADDBITMAP, 0, (LPARAM)&tbab);

    ZeroMemory(tbb, sizeof(tbb));
    tbb[0].iBitmap = STD_FILENEW;
    tbb[0].fsState = TBSTATE_ENABLED;
    tbb[0].fsStyle = TBSTYLE_BUTTON;
    tbb[0].idCommand = ID_FILE_NEW;

    tbb[1].iBitmap = STD_FILEOPEN;
    tbb[1].fsState = TBSTATE_ENABLED;
    tbb[1].fsStyle = TBSTYLE_BUTTON;
    tbb[1].idCommand = ID_FILE_OPEN;

    tbb[2].iBitmap = STD_FILESAVE;
    tbb[2].fsState = TBSTATE_ENABLED;
    tbb[2].fsStyle = TBSTYLE_BUTTON;
    tbb[2].idCommand = ID_FILE_SAVEAS;

    // 发送添加按钮的消息
    SendMessage(hTool, TB_ADDBUTTONS, sizeof(tbb)/sizeof(TBBUTTON), (LPARAM)&tbb);
    return TRUE;
}

然后在消息处理函数中调用:

  1. LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)  
  2. {  
  3.   
  4.     case WM_CREATE:  
  5.     {  
  6.         CreateToolbar(hwnd);  
  7.         break;  
  8. }  
  9. // 下面是消息响应部分   
  10.   case WM_COMMAND:  
  11.     {  
  12.         switch(LOWORD(wParam))  
  13.         {  
  14.         case ID_FILE_NEW:  
  15.             ::MessageBox(hwnd, "新建文件""提示", MB_OK);  
  16.             break;  
  17.         case ID_FILE_OPEN:  
  18.             ::MessageBox(hwnd, "打开文件""提示", MB_OK);  
  19.             break;  
  20.         case ID_FILE_SAVEAS:  
  21.             ::MessageBox(hwnd, "另存文件""提示", MB_OK);  
  22.             break;  
  23.         default:  
  24.             break;  
  25.         }  
  26.     }  
  27. }  
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

    case WM_CREATE:
    {
        CreateToolbar(hwnd);
        break;
}
// 下面是消息响应部分
  case WM_COMMAND:
    {
        switch(LOWORD(wParam))
        {
        case ID_FILE_NEW:
            ::MessageBox(hwnd, "新建文件", "提示", MB_OK);
            break;
        case ID_FILE_OPEN:
            ::MessageBox(hwnd, "打开文件", "提示", MB_OK);
            break;
        case ID_FILE_SAVEAS:
            ::MessageBox(hwnd, "另存文件", "提示", MB_OK);
            break;
        default:
            break;
        }
    }
}

效果图如下:

                                          

    但是我们一般是不会SDK内置的资源图片。现在流行界面配置,具体就是我想利用磁盘上位图图片,然后把它作为工具栏按钮图片动态加载到工具栏里去。于是我写了一个函数,实现了这个功能,代码如下:

       

  1. // 工具栏按钮的命令ID   
  2. #define  ID_ENTIRE     1028   
  3. #define  ID_GRID       1029   
  4.   
  5. BOOL CreateCoolToolbar(HWND hParent)  
  6. {  
  7.     InitCommonControls();  
  8.     // 创建工具栏窗口   
  9.     HWND hTool;  
  10.     HINSTANCE hThisInstance = GetModuleHandle(NULL);  
  11.     hTool = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE|CCS_ADJUSTABLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN, 0, 0, 0, 0,  
  12.                            hParent,(HMENU)IDC_MAIN_TOOL,hThisInstance, NULL);  
  13.   
  14.     if(hTool == NULL)  
  15.     {  
  16.         ::MessageBox(hParent, "Could not create tool bar.""Error", MB_OK | MB_ICONERROR);  
  17.         return FALSE;  
  18.     }  
  19.     // 发送 TB_BUTTONSTRUCTSIZE 消息, 出于向后兼容的考虑.   
  20.     SendMessage(hTool, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);  
  21.   
  22.     // 创建图像列表   
  23.     HIMAGELIST  hImgList = ImageList_Create(16,16, ILC_COLOR32|ILC_MASK, 0, 0);  
  24.   
  25.     // 为工具栏设置图像列表   
  26.     ::SendMessage(hTool, TB_SETIMAGELIST, 0, (LPARAM)hImgList);  
  27.   
  28.     // 打开位图,将其加进图像列表   
  29.     TCHAR szModulePath[_MAX_PATH];  
  30.     ::GetModuleFileName(NULL,szModulePath,_MAX_PATH);  
  31.     std::string strBinPath = szModulePath;  
  32.   
  33.     int ImgID[2];  
  34.     // 获取位图文件路径   
  35.     strBinPath = strBinPath.substr(0,strBinPath.rfind('\\')+1);  
  36.     std::string strBmpPath = strBinPath + std::string(_T("Toolbar\\entire.bmp"));  
  37.     HBITMAP     hBitmap             = NULL;  
  38.     hBitmap = (HBITMAP)LoadImage(hThisInstance,strBmpPath.c_str(), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR|LR_LOADFROMFILE);  
  39.     ImgID[0] = ImageList_Add(hImgList,hBitmap,NULL);  
  40.   
  41.     strBmpPath = strBinPath + std::string(_T("Toolbar\\Grid.bmp"));  
  42.     hBitmap             = NULL;  
  43.     hBitmap = (HBITMAP)LoadImage(hThisInstance,strBmpPath.c_str(), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR|LR_LOADFROMFILE);  
  44.     ImgID[1] = ImageList_Add(hImgList,hBitmap,NULL);  
  45.   
  46.     // 初始化工具栏按钮数组   
  47.     TBBUTTON tbb[2];  
  48.     tbb[0].iBitmap = ImgID[0];  
  49.     tbb[0].fsState = TBSTATE_ENABLED;  
  50.     tbb[0].fsStyle = TBSTYLE_BUTTON;  
  51.     tbb[0].idCommand = ID_ENTIRE;  
  52.   
  53.     tbb[1].iBitmap = ImgID[1];  
  54.     tbb[1].fsState = TBSTATE_ENABLED;  
  55.     tbb[1].fsStyle = TBSTYLE_BUTTON;  
  56.     tbb[1].idCommand = ID_GRID;  
  57.   
  58.     // 发送添加工具栏按钮的消息   
  59.     TBADDBITMAP tbab;  
  60.    ::SendMessage(hTool, TB_ADDBUTTONS, sizeof(tbb)/sizeof(TBBUTTON),(LPARAM)&tbb);  
  61.   
  62.     // 设置工具栏按钮大小:16*16   
  63.     ::SendMessage(hTool, TB_SETBUTTONSIZE,NULL,(LPARAM) MAKELONG(16,16));  
  64.     return TRUE;  
  65. }  
// 工具栏按钮的命令ID
#define  ID_ENTIRE     1028
#define  ID_GRID       1029

BOOL CreateCoolToolbar(HWND hParent)
{
    InitCommonControls();
    // 创建工具栏窗口
    HWND hTool;
    HINSTANCE hThisInstance = GetModuleHandle(NULL);
    hTool = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE|CCS_ADJUSTABLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN, 0, 0, 0, 0,
                           hParent,(HMENU)IDC_MAIN_TOOL,hThisInstance, NULL);

    if(hTool == NULL)
    {
        ::MessageBox(hParent, "Could not create tool bar.", "Error", MB_OK | MB_ICONERROR);
        return FALSE;
    }
    // 发送 TB_BUTTONSTRUCTSIZE 消息, 出于向后兼容的考虑.
    SendMessage(hTool, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);

    // 创建图像列表
    HIMAGELIST  hImgList = ImageList_Create(16,16, ILC_COLOR32|ILC_MASK, 0, 0);

    // 为工具栏设置图像列表
    ::SendMessage(hTool, TB_SETIMAGELIST, 0, (LPARAM)hImgList);

    // 打开位图,将其加进图像列表
    TCHAR szModulePath[_MAX_PATH];
	::GetModuleFileName(NULL,szModulePath,_MAX_PATH);
	std::string strBinPath = szModulePath;

    int ImgID[2];
    // 获取位图文件路径
    strBinPath = strBinPath.substr(0,strBinPath.rfind('\\')+1);
    std::string strBmpPath = strBinPath + std::string(_T("Toolbar\\entire.bmp"));
    HBITMAP		hBitmap				= NULL;
    hBitmap = (HBITMAP)LoadImage(hThisInstance,strBmpPath.c_str(), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR|LR_LOADFROMFILE);
    ImgID[0] = ImageList_Add(hImgList,hBitmap,NULL);

    strBmpPath = strBinPath + std::string(_T("Toolbar\\Grid.bmp"));
    hBitmap				= NULL;
    hBitmap = (HBITMAP)LoadImage(hThisInstance,strBmpPath.c_str(), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR|LR_LOADFROMFILE);
    ImgID[1] = ImageList_Add(hImgList,hBitmap,NULL);

    // 初始化工具栏按钮数组
    TBBUTTON tbb[2];
    tbb[0].iBitmap = ImgID[0];
    tbb[0].fsState = TBSTATE_ENABLED;
    tbb[0].fsStyle = TBSTYLE_BUTTON;
    tbb[0].idCommand = ID_ENTIRE;

    tbb[1].iBitmap = ImgID[1];
    tbb[1].fsState = TBSTATE_ENABLED;
    tbb[1].fsStyle = TBSTYLE_BUTTON;
    tbb[1].idCommand = ID_GRID;

    // 发送添加工具栏按钮的消息
    TBADDBITMAP tbab;
   ::SendMessage(hTool, TB_ADDBUTTONS, sizeof(tbb)/sizeof(TBBUTTON),(LPARAM)&tbb);

    // 设置工具栏按钮大小:16*16
    ::SendMessage(hTool, TB_SETBUTTONSIZE,NULL,(LPARAM) MAKELONG(16,16));
    return TRUE;
}


效果图如下:

                                                         



文章地址: http://blog.csdn.net/clever101/article/details/7308224
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值