我用SDK创建了一个工具条,虽然可以显示出来,但显示不太正常,有两处不正常
1.工具条背景颜色变为白色(本来应为灰色),如果去除TBSTYLE_FLAT风格则恢复为灰色
2.窗体最大化后,工具条右端显示出主窗体背景颜色(正常情况应与菜单背景颜色相同,即使按工具条颜色,也应为白色),即使在WM_SIZE中调整工具栏尺寸也似乎无效。
研究了MFC的工具条代码后,修改了很多次依然无效,究竟该怎么搞法?特来请教各位。
部分代码如下//创建工具条
HWND CreateToolBar(HWND hWndParent)
{
    HWND hWndTB;
    TBBUTTON tbb[4];
    HIMAGELIST hImageList,hHotImageList,hDisableImageList;
    HBITMAP hBitmap;
    INITCOMMONCONTROLSEX icex;
    icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
    icex.dwICC  = ICC_BAR_CLASSES;
    InitCommonControlsEx(&icex);
    hWndTB = CreateWindowEx(0,
        TOOLBARCLASSNAME,TEXT(""),
        WS_CHILD|WS_VISIBLE|WS_BORDER|TBSTYLE_FLAT|TBSTYLE_LIST|TBSTYLE_AUTOSIZE,
        0,0,0,0,
        hWndParent,
        (HMENU)IDR_TOOLBAR,
        g_hInst,
        NULL);
    if(!hWndTB)
        return 0;
    SendMessage(hWndTB, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
    hImageList = ImageList_Create(20,20,ILC_COLOR24,3,1);
    hBitmap = LoadBitmap(g_hInst,MAKEINTRESOURCE(IDR_TOOLBAR));
    ImageList_Add(hImageList,hBitmap,NULL);
    DeleteObject (hBitmap);
    SendMessage(hWndTB,TB_SETIMAGELIST,0,(LPARAM)hImageList);    hHotImageList = ImageList_Create(20,20,ILC_COLOR24,3,1);
    hBitmap = LoadBitmap(g_hInst,MAKEINTRESOURCE(IDR_TOOLBARHOT));
    ImageList_Add(hHotImageList,hBitmap,NULL);
    DeleteObject (hBitmap);
    SendMessage(hWndTB,TB_SETHOTIMAGELIST,0,(LPARAM)hHotImageList);    hDisableImageList = ImageList_Create(20,20,ILC_COLOR24,3,1);
    hBitmap = LoadBitmap(g_hInst,MAKEINTRESOURCE(IDR_TOOLBARDISABLE));
    ImageList_Add(hDisableImageList,hBitmap,NULL);
    DeleteObject (hBitmap);
    SendMessage(hWndTB,TB_SETDISABLEDIMAGELIST,0,(LPARAM)hDisableImageList);    ZeroMemory(tbb, sizeof(tbb));
    tbb[0].iBitmap =MAKELONG(0,0) ;
    tbb[0].fsState = TBSTATE_ENABLED;
    tbb[0].fsStyle = TBSTYLE_BUTTON|BTNS_AUTOSIZE;
    tbb[0].idCommand = ID_MENU_NEW; 
    //tbb[0].iString = (INT_PTR)TEXT("查找");
    tbb[1].iBitmap =MAKELONG(1,0);
    tbb[1].fsState = TBSTATE_ENABLED;
    tbb[1].fsStyle = TBSTYLE_BUTTON|BTNS_AUTOSIZE;
    tbb[1].idCommand = ID_MENU_OPEN; 
    //tbb[1].iString = (INT_PTR)TEXT("后退");
    tbb[2].iBitmap =MAKELONG(2,0);
    tbb[2].fsState = TBSTATE_ENABLED;
    tbb[2].fsStyle = TBSTYLE_BUTTON|BTNS_AUTOSIZE;
    tbb[2].idCommand = ID_MENU_SAVE;
    //tbb[2].iString = (INT_PTR)TEXT("向前");
    tbb[3].iBitmap =MAKELONG(3,0);
    tbb[3].fsState = TBSTATE_ENABLED;
    tbb[3].fsStyle = TBSTYLE_BUTTON|BTNS_AUTOSIZE;
    tbb[3].idCommand = ID_MENU_EXIT;
    //tbb[3].iString = (INT_PTR)TEXT("视图");
    SendMessage(hWndTB, TB_ADDBUTTONS, sizeof(tbb)/sizeof(TBBUTTON), (LPARAM)&tbb);
    SendMessage(hWndTB,WM_SIZE,0,0);
    return hWndTB;
}

解决方案 »

  1.   

    图片:
    工程源代码:http://p.blog.csdn.net/images/p_blog_csdn_net/Y___Y/TestFrame.rar.jpg
    源代码下载后去掉.jpg扩展名解压即得。
      

  2.   

    工具条的实现过程  MFC对于工具条和状态栏分别提供了CToolBar和CStatusBar两个基本类库,但由于在实现时MFC对其做了过多的封装,以至无法了解内部的一些核心技术。因此本文在实现过程中放弃了相对比较方便的CToolBar和CStatusBar类的使用,而是通过SDK(Software Developers Kit,软件开发工具箱)式的WinAPI应用程序接口来实现的。在API函数中经常需要用到对话框的窗口句柄和当前的实例句柄,在SDK程序设计中以上两个句柄可以直接从入口函数WinMain()中引出,而在MFC下也对其做了封装,不能直接获取。但MFC也为其留有接口:CWnd窗口类提供的GetSafeHwnd()可以返回对话框的窗口句柄;函数AfxGetInstanceHandle()则可以获取当前应用程序的实例句柄。由于对话框和状态栏属于程序界面的一部分,需要程序启动时就显示出来,因此获取句柄的代码和后面创建显示工具条、状态栏的全部代码都应当放在对话框初始化消息WM_INITDIALOG的响应函数OnInitDialog()中进行:HWND hDlg=GetSafeHwnd();
    HINSTANCE hInstance=AfxGetInstanceHandle();   对于待添加的工具条按钮可以根据情况细分为两种:  一种是Windows标准的一些工具条按钮比如打开文件、打印预览、在线帮助等等,这类工具条按钮可以直接使用预定义好的按钮图标的ID号,在VC自带的CommCtrl.h头文件中有详细定义;  另一种就是用户自己添加的工具栏按钮,只能由用户在资源视图中为其指定相应的图标。不论是那种工具条按钮的创建都是通过对TBBUTTON结构的设置来决定每一个工具条按钮的状态,对于第一个填充好的工具条按钮可以用CreateToolbarEx()来直接将其加入到工具条上,并返回指向工具条的窗口句柄,而对于以后工具条按钮的添加则只能通过向工具条发送TB_ADDBUTTONS消息来实现:……
    //填充工具条按钮结构:
    TBBUTTON ptoolbar[30]={{STD_HELP, //指定Windows的标准帮助图标
    MU_ONE, //工具条按钮的ID
    TBSTATE_ENABLED, //可用状态
    TBSTYLE_BUTTON, //指定创建一个可以下按的按钮
    0, //保留,由应用程序定义该参数意义
    0}, //按钮字串索引
    //创建一个分割按钮用的竖线
    {0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0}};//在对话框上动态创建工具条,并添加工具条按钮:
    HWND hToolsWindow=::CreateToolbarEx(hDlg, //指定对话框为父窗口,将工具条创建在对话框上
    WS_CHILD|WS_VISIBLE|TBSTYLE_WRAPABLE|TBSTYLE_TOOLTIPS|
    TBSTYLE_FLAT|CCS_ADJUSTABLE,//指定工具条的创建风格
    IDB_TOOLBAR,//预定义的工具条资源ID
    30,HINST_COMMCTRL, //包含图片资源的可执行文件的实例句柄
    IDB_STD_SMALL_COLOR,//图片的资源ID
    ptoolbar, //待添加的按钮
    2, //加入到工具条的按钮的个数
    0,0,0,0,sizeof(TBBUTTON));
    ……
    //从IDR_TOOLBAR1资源中装载按钮图标到对话框的工具条上
    TBADDBITMAP tab;
    tab.hInst=hInstance;
    tab.nID=IDR_TOOLBAR1;
    iBmp=::SendMessage(hToolsWindow,TB_ADDBITMAP,(WPARAM)3,(LPARAM)&tab);   向工具条添加工具条按钮的关键在于对TBBUTTON数据结构的填充,该数据结构也是在CommCtrl.h头文件中定义的,原形为:typedef struct _TBBUTTON {
    int iBitmap; 
    int idCommand; 
    BYTE fsState; 
    BYTE fsStyle; 
    DWORD dwData; 
    int iString; 
    } TBBUTTON, NEAR* PTBBUTTON, FAR* LPTBBUTTON; 
      该结构的数据成员包含了处在工具条里的按钮的相关信息:成员iBitmap是从0开始记数的按钮图象的索引;idCommand标识了匹配的按钮,当按钮被按下产生WM_COMMAND消息的时候会用到该标识;fsState指定了按钮的状态标志,可以是以下8种标志的逻辑组合TBSTATE_CHECKED、TBSTATE_ELLIPSES、TBSTATE_ENABLED、TBSTATE_HIDDEN、TBSTATE_INDETERMINATE、TBSTATE_MARKED、TBSTATE_PRESSED、TBSTATE_WRAP。至于以上各标志的具体含义在MSDN的在线帮助中有详细说明;fsStyle成员指定了按钮的风格;dwData是应用程序定义的值,通常为0;iString为从0开始技术的按钮字串的索引。下面这段代码用于向工具条添加自定义的工具条按钮:TBBUTTON tb; 
    tb.iBitmap=iBmp+0;
    tb.idCommand=MU_TWO;
    tb.fsState=TBSTATE_ENABLED;
    tb.fsStyle=TBSTYLE_BUTTON;
    tb.dwData=0;
    tb.iString=0;    完成对TBBUTTON结构的设置后可以通过窗口句柄hToolsWindow向工具条发送TB_ADDBUTTONS消息来添加按钮到工具条,如想添加按钮之间的分割条,只需将TBBUTTON结构的fsStyle成员变量取值为TBSTYLE_SEP即可:::SendMessage(hToolsWindow,TB_ADDBUTTONS,(WPARAM)1,(LPARAM)&tb);
      

  3.   

    TBSTYLE_FLAT   Creates a flat toolbar where both the toolbar and the buttons are transparent. Button text appears under button bitmaps. When this style is used, the button underneath the cursor is automatically highlighted.
    TBSTYLE_TRANSPARENT   Creates a transparent toolbar. In a transparent toolbar, the toolbar is transparent but the buttons are not. Button text appears under button bitmaps.把TBSTYLE_FLAT换成TBSTYLE_TRANSPARENT式是看
      

  4.   

    http://p.blog.csdn.net/images/p_blog_csdn_net/Y___Y/TestFrame.rar.jpg 
      

  5.   


    LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        HDC hdc;
        PAINTSTRUCT ps;
        RECT rect;
        int nWidth;
        switch (message)
        {
        case WM_CREATE:
            hToolBar=CreateToolBar(hWnd);
            hStatusBar=CreateStatusToolBar(hWnd); // 注意这里
            hTreePanel=CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_DIALOG_TREE),hWnd,TreePanel_DialogFun);
            ShowWindow(hTreePanel,SW_SHOW);
            hCommandPanel=CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_DIALOG_COMMAND),hWnd,CommandPanel_DialogFun);
            ShowWindow(hCommandPanel,SW_SHOW);        return 0;
        case WM_SIZE:
            GetClientRect(hWnd,&rect);
            nWidth=rect.right-rect.left;
            MoveWindow(hTreePanel,0,30,Splitter_x,rect.bottom-rect.top-50,TRUE);
            MoveWindow(hCommandPanel,Splitter_x,30,rect.right-rect.left,150,TRUE);
            /*
            GetClientRect(hToolBar,&rect);
            MoveWindow(hToolBar,0,0,nWidth,rect.bottom-rect.top,TRUE);
    */
            SendMessage(hToolBar,WM_SIZE,0,0);
            SendMessage(hStatusBar,WM_SIZE,0,0);
            return 0;
        case WM_PAINT:
            hdc = BeginPaint (hWnd, &ps);
            GetClientRect(hWnd,&rect);
            SetBkColor(hdc, RGB(128,128,128));
            ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rect, NULL, 0, NULL);
            EndPaint (hWnd, &ps);
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
        case WM_COMMAND:
            switch (LOWORD(wParam))
            {
            case ID_MENU_NEW:
                MessageBox(hWnd,"Ok","Ok",MB_OK);
                return TRUE;
            case IDOK:
                return TRUE;
            }
    return FALSE;
            return 0;
        }
        return DefWindowProc (hWnd, message, wParam, lParam);
    }
      

  6.   

    谢谢 高手.高手.高高手
    狂汗!copy代码时没注意但背景颜色为白色这个问题仍然没解决,去掉TBSTYLE_FLAT|TBSTYLE_LIST风格才正常了
      

  7.   

    谢谢大家的回答,问题已经解决
    加CCS_NOMOVEY风格即可
      

  8.   

    我下了你的工程,也加了CCS_NOMOVEY风格可是还是没效果,不知道是哪里有问题