CMFCRibbonGallery 中的默认按钮数是6,SetIconsInRow 方法可以设置下拉框中的按钮列数,正常显示框中的按钮数确是固定为6,不能改变,google以后建立一个新类继承于这个类,把默认列数设为100,而 CMFCRibbonGallery 会根据窗口宽度自动调整实际列数,效果极好。原代码如下。
#pragma once
// TTMv8RibbonGallery 命令目标
class TTMv8RibbonGallery : public CMFCRibbonGallery
{
DECLARE_DYNCREATE(TTMv8RibbonGallery)
public:
TTMv8RibbonGallery();
virtual ~TTMv8RibbonGallery();
//Methods
public:
void SetMaxColums(int nColums);
//Properties
protected:
int m_nMaxColumns;
//Override
public:
virtual CSize GetRegularSize(CDC* pDC);
};
// TTMv8RibbonGallery.cpp : 实现文件
// 增加功能,重定显示框的最大列数。
#include "stdafx.h"
#include "TTMv8.h"
#include "TTMv8RibbonGallery.h"
// 从基类源码中自制过来的
const int nImageMargin = 4;
const int nBorderMarginY = 3;
IMPLEMENT_DYNCREATE(TTMv8RibbonGallery, CMFCRibbonGallery)
// TTMv8RibbonGallery
TTMv8RibbonGallery::TTMv8RibbonGallery()
{
m_nMaxColumns = 100;
m_nPanelColumns = m_nMaxColumns;
}
TTMv8RibbonGallery::~TTMv8RibbonGallery()
{
}
// 设置显示框(区别于下拉框)的最大列数
void TTMv8RibbonGallery::SetMaxColums(int nColums)
{
m_nMaxColumns = nColums;
}
// 复制基类代码,修改最大列数。
CSize TTMv8RibbonGallery::GetRegularSize(CDC* pDC)
{
ASSERT_VALID(this);
const CSize sizeImage = GetIconSize();
CSize sizePanelSmallImage(16, 16);
if (m_pParent != NULL)
{
ASSERT_VALID(m_pParent);
sizePanelSmallImage = m_pParent->GetImageSize(FALSE);
}
m_bSmallIcons = (sizeImage.cy <= sizePanelSmallImage.cy * 3 / 2);
if (m_bResetColumns && !m_bSmallIcons)
{
m_nPanelColumns = m_nMaxColumns;
if (m_pParentMenu != NULL && m_pParentMenu->GetCategory() == NULL)
{
// From the default panel button
m_nPanelColumns = 3;
}
}
m_bResetColumns = FALSE;
if (IsButtonLook())
{
return CMFCRibbonButton::GetRegularSize(pDC);
}
if (m_arIcons.GetSize() == 0)
{
CreateIcons();
}
ASSERT_VALID(m_pParent);
const CSize sizePanelLargeImage = m_pParent == NULL ?
CSize (0, 0) : m_pParent->GetImageSize(TRUE);
CSize size(0, 0);
if (m_bSmallIcons)
{
size.cx = sizeImage.cx * m_nPanelColumns;
int nRows = 3;
if (sizePanelLargeImage != CSize(0, 0) && sizeImage.cy != 0)
{
nRows = max(nRows, sizePanelLargeImage.cy * 2 / sizeImage.cy);
}
size.cy = nRows * sizeImage.cy + 2 * nBorderMarginY;
}
else
{
size.cx = (sizeImage.cx + 2 * nImageMargin) * m_nPanelColumns;
size.cy = sizeImage.cy + 3 * nImageMargin + 2 * nBorderMarginY;
}
//---------------------------------------
// Add space for menu and scroll buttons:
//---------------------------------------
size.cx += GetDropDownImageWidth() + 3 * nImageMargin;
return size;
}
效果图: