zoukankan      html  css  js  c++  java
  • 使用Win API创建工具栏

    作者:朱金灿

    来源:http://blog.csdn.net/clever101

     

         

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


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

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

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

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

           

    // 工具栏按钮的命令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;
    }
    
    

    效果图如下:

                                                             





  • 相关阅读:
    UVA
    UVA
    模板——扩展欧几里得算法(求ax+by=gcd的解)
    UVA
    模板——2.2 素数筛选和合数分解
    模板——素数筛选
    Educational Codeforces Round 46 (Rated for Div. 2)
    Educational Codeforces Round 46 (Rated for Div. 2) E. We Need More Bosses
    Educational Codeforces Round 46 (Rated for Div. 2) D. Yet Another Problem On a Subsequence
    Educational Codeforces Round 46 (Rated for Div. 2) C. Covered Points Count
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6470849.html
Copyright © 2011-2022 走看看