65.9K
CodeProject 正在变化。 阅读更多。
Home

CPercentageCtrl

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.47/5 (9投票s)

2002年3月12日

CPOL

2分钟阅读

viewsIcon

82201

downloadIcon

1471

一个用于显示和修改百分比的简单控件

Sample Image - PercentageCtrl.gif

引言

CPercentageCtrl 是一个简单的控件,用于显示多个实体之间的比例,例如已用空间和可用空间,或者鸡尾酒的配比 :)

显然,用户可以通过拖动块的边缘来修改比例。

使用控件

将控件的实例作为成员数据添加到您的对话框中;
class CMyDialog : public CDialog
{
    ...
    CPercentageCtrl m_percentage;
    ...
}

然后在OnInitDialog()中使用Create(...)函数初始化控件

BOOL CMyDialog::OnInitDialog()
{
    ...
    CRect r(10,10, 200, 50);
    m_percentage.Create(NULL, NULL, WS_VISIBLE | WS_BORDER, r, 
                           this, ID_PERCENTAGE);
    ...
}

添加一个块非常容易,您只需要指定它的权重

m_percentage.AddBlock(250);

在任何一个块中,您可以选择颜色和要显示的文本:文本可以使用 CString::Format(...) (或 printf) 风格进行格式化,颜色是通常的 RGB 值

m_percentage.AddBlock(250, "%0.1f%%", RGB(200,255,255));

块的尺寸必须是一个整数值,但您可以设置一个double乘数,用于显示文本。例如,如果您想将值显示为 "25.1",您应该插入一个 251 的尺寸并将乘数设置为 0.1

m_percentage.AddBlock(251);
m_percentage.SetMultiplier(0.1);

一些选项可用

  • PC_HORIZONTAL (默认) 或 PC_VERTICAL
  • PC_VERTICALTEXT (默认) 或 PC_HORIZONTALTEXT
  • PC_READONLY
  • PC_ALWAYSSHOWTEXT:即使文本未完全包含在块中,控件也会显示文本;否则,控件仅在文本完全包含在其块中时才显示文本。
  • PC_TEXTELLIPSIS:如果需要,控件会进行文本省略,以缩短文本,使其可以包含在块中。
您可以使用命令SetOptions(int)设置这些选项
m_percentage.SetOptions(PC_HORIZONTAL | PC_ALWAYSSHOWTEXT);

每当用户修改块的尺寸时,控件都会发送一条消息。您可以在消息映射中插入宏来截获此消息

<code>ON_REGISTERED_MESSAGE(PERCENTAGE_CHANGED,FunctionName)

例如

BEGIN_MESSAGE_MAP(CPercentageCtrlDemoDlg, CDialog)
    //{{AFX_MSG_MAP(CPercentageCtrlDemoDlg)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
    ON_REGISTERED_MESSAGE(PERCENTAGE_CHANGED,OnPercentageChanged)
END_MESSAGE_MAP()
在这种情况下,请记住以这种方式声明消息PERCENTAGE_CHANGED
extern const UINT PERCENTAGE_CHANGED;
被调用的函数将在 WPARAM 中接收调用控件的句柄,在 LPARAM 中接收第一个被修改块的索引(当用户修改一个块时,也会修改其右侧的块)。OnPercentageChanged函数可以是
LRESULT MyDialog::OnPercentageChanged(WPARAM WParam, LPARAM LParam)
{
    if ((HWND)WParam == m_percentage.m_hWnd)
    {
        int data1 = m_percentage.GetData((int)LParam);
        int data2 = m_percentage.GetData((int)LParam+1);
        ....
    }
}

开发笔记

我选择允许插入具有乘数的整个值,以避免在文本可视化中出现近似错误
(例如 99 = 24 + 24 + 24 + 27 = 24.4 + 24.4 + 24.4 + 26.8 = 100 = 24.6 + 24.6 + 24.6 + 26.2 = 25 + 25 + 25 + 26 = 101)

我使用了 Keith Rule 的 CMemDC 来避免闪烁。您可以在 codeproject 上找到他的类和一篇文章 :)

显然,代码在警告级别 4 下干净地编译 :)

历史

2002 年 3 月 21 日 - 修复了严重的 GDI 资源泄漏。

© . All rights reserved.