CPercentageCtrl






4.47/5 (9投票s)
一个用于显示和修改百分比的简单控件
引言
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 资源泄漏。