2D 多参数饼图控件






4.25/5 (4投票s)
2003 年 1 月 8 日
2分钟阅读

64018

2426
一个简单的 2D 饼图控件。
引言
Code Project 是一个令人兴奋的网站,具有出色的教学和专业交流能力。 我从中学习了很多,也决定贡献我的成果。 我偶尔参与一个项目,以检查实验数据的一致性。 这些数据被收集在几个二进制文件中,其中也包含“漏洞”,即缺失的数据段。 为了简化快速检查报告,主要想法是将此报告嵌入到进度控件中。 因此,首先我找到了
我感谢这些作者的启发。 这只是一个起点,因为我需要一个更复杂的进度控件结构来显示报告数据。
解决问题
考虑到二维饼图,可以很容易地看出它包含 4 个参数,这些参数能够显示 4 个独立的变量。 这些参数是角度扇形的宽度、半径、从水平线的初始偏移量(初始相位)以及每个角度扇形的颜色。 转换为几何表示的一个小限制是,角度扇形的半径和宽度需要正定的输入数据,这有时会自动满足(例如,计算迭代次数或循环通过次数)。 您可以考虑图示的示例,将其视为已处理文件的报告,这些文件具有自己的长度(宽度)、“漏洞”总长度相对于文件长度 (%)(半径)、最大“漏洞”长度相对于文件长度 (%)(颜色),以及处理时间与平均值的偏差 (%)(相位)。 (我从未在最后一个选项中使用过,始终假设它为零,但我相信它可以在其他任务中使用)。
编程问题
所有必要的操作都包含在从 CStatic
派生的 Cpcontrol
类中,该类将处理后的数据转换为其几何表示形式并在适当的窗口框架中显示它们。 Cpcontrol
类嵌入在标准的对话框应用程序中,该应用程序负责一般数据处理和收集用于饼图进度控件的数据。 控件的内部标签可以在对话框初始化过程中自定义。
BOOL CPieProgressCtrlDlg::OnInitDialog() { CDialog::OnInitDialog(); // some useful code here //setting for progress pie control m_pWnd=GetDlgItem(IDC_PROGRESS); m_control.m_pWnd=m_pWnd; CRect rect; m_pWnd->GetClientRect(&rect); m_control.m_rect=rect; int lenx=rect.right-rect.left; int leny=rect.bottom-rect.top; m_control.m_w=lenx; m_control.m_h=leny; // keep ratio 2/3 for the control if(2*lenx>3*leny) m_control.m_w=(int)floor(1.5*leny); else if(2*lenx<3*leny) m_control.m_h=(int)floor(2.0*lenx/3); m_control.m_top=rect.top; m_control.m_left=rect.left; strcpy(m_control.m_bottom,"total"); strcpy(m_control.m_color,"Max bad segments"); strcpy(m_control.m_ctitle,"Current processing info"); int fsize=8; if(m_control.m_h>80 && m_control.m_h<150) fsize=10; else if(m_control.m_h>=150) fsize=12; LOGFONT lf; // Used to create the CFont. memset(&lf, 0, sizeof(LOGFONT)); // Clear out structure. lf.lfHeight = fsize; // Request a 12-pixel-high font strcpy(lf.lfFaceName, "Arial"); // with face name "Arial". m_control.m_SmallFont.CreateFontIndirect(&lf); // Create the small font. lf.lfHeight = fsize+2; m_control.m_MiddleFont.CreateFontIndirect(&lf); lf.lfHeight = fsize+4; lf.lfWeight=FW_BOLD; m_control.m_BigFont.CreateFontIndirect(&lf); m_control.m_cur=-1; // some other code }
饼图进度控件中的几何转换过程非常快,并且与一般数据处理相比,不会消耗太多时间。 在上述示例中,使用了一个额外的延迟函数 Sleep(500)
,以给人留下这个示例正在视觉上运行的印象。