首页 > Visual C++, 程序设计 > ToolBar的一个奇怪现象

ToolBar的一个奇怪现象


ToolBar的一个奇怪现象

将CyberArticle Express工具栏修改成标准的Windows工具栏(使用CToolBarCtrl),结果发现一个奇怪的现象:

如果工具栏按钮包含下拉按钮BTNS_DROPDOWN,而且工具栏具有TBSTYLE_EX_DRAWDDARROWS和TBSTYLE_FLAT风格,则工具栏按钮在某些情况下,会变得很大(例如更改Theme,或者某些系统下面,锁定计算机,然后再恢复)。

经过检查,原来这是COMCTL32的一个问题:在MFC的CToolBar这个类里面,修复了这个问题,但是CToolBarCtrl没有修复这个问题。

下面是bartool.cpp里面的一段说明

//  In comctl32 version 6.00 when using XP Look combined with TBSTYLE_EX_DRAWDDARROWS
// style minimal sizing policy was changed to be
//   button.height >= image.height + 13
//   button.width >= image.width + 16
// this force buttons to be bigger then usual
// To override this behavior we should remove TBSTYLE_EX_DRAWDDARROWS prior to sizing operations
//

在CToolBarCtrl派生类里面,增加消息处理。下面的代码,是从bartool.cpp里面找到的。

ON_MESSAGE(WM_SETTINGCHANGE, OnPreserveZeroBorderHelper)
ON_MESSAGE(WM_SETFONT, OnPreserveZeroBorderHelper)
 
LRESULT CWizToolBarCtrlEx::OnPreserveZeroBorderHelper(WPARAM, LPARAM)
{
    int _afxComCtlVersion = _AfxGetComCtlVersion();
    //
    BOOL bModify = FALSE;
    ASSERT(_afxComCtlVersion != -1);
    DWORD dwStyle = 0;
    DWORD dwStyleEx = 0;
    if (_afxComCtlVersion >= VERSION_IE4)
    {
        dwStyle = GetStyle();
        bModify = ModifyStyle(0, TBSTYLE_TRANSPARENT|TBSTYLE_FLAT);
        if ((_afxComCtlVersion >= VERSION_6) && ::IsWindow(m_hWnd))
        {
            dwStyleEx = SetExtendedStyle(GetExtendedStyle() &~ TBSTYLE_EX_DRAWDDARROWS);
        }
    }
    LRESULT lResult = Default();
    if (bModify)
    {
        SetWindowLong(m_hWnd, GWL_STYLE, dwStyle);
    }
    if (dwStyleEx & TBSTYLE_EX_DRAWDDARROWS)
    {
        SetExtendedStyle(dwStyleEx);
    }
    return lResult;
}
 
处理后可以解决这个问题


分类: Visual C++, 程序设计 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.

Spam Protection by WP-SpamFree