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

自定义控件图表和进度条

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.35/5 (13投票s)

2006年6月2日

4分钟阅读

viewsIcon

95723

downloadIcon

6868

一篇关于 Win32 自定义图表控件和进度条创建的文章。

Sample Image

引言

在我的项目中,我需要一个图表来显示数据。我的同事建议我使用自定义图表控件。我在网上搜索,但没有找到任何关于在 Win32 中创建自己的自定义控件的好且有趣的资料。所以最终,我决定尝试一下并写了这篇文章。为了使事情更有趣,我创建了一个 DLL,以便在未来的项目中重用相同的控件。该控件是用 C 语言开发的。该项目的主要目标是可重用性。通过区分图表编号和自定义控件 ID,您可以绘制任意数量的图表/进度条。

描述

这是一个非常简单的应用程序,我提供了关于如何创建自定义控件的逐步说明。该项目包含两个应用程序。

  1. Graph_dll - 一个用于绘制图表和进度条的 DLL。
  2. Sun_Check_dll - 一个描述如何使用 DLL 的示例应用程序。

Graph_dll 应用程序

Graph_dll 是一个提供多种功能的 DLL。

图表创建例程

void DrawGraph(HDC hdc, RECT Rect);

DrawGraph 例程用于使用指定的设备上下文绘制图表。图表大小使用 Rect 参数指定。此外,图表的垂直移动也在此例程中实现。

void UpdateGraph(HDC hdc, RECT Rect, unsigned long RxValue,
                 unsigned long TxValue, int GraphNo);

UpdateGraph 例程将绘制 30 个水平点的图表。这只能绘制两条线。指定为“RxValue”的值将用绿色绘制,而“TxValue”值将用红色绘制。“GraphNo”参数只是图表 ID,用于标识图表并在指定的图表上绘制值。

进度条创建例程

void DrawBar(HDC hdc, RECT Rect, int Process_Value);

DrawBar 例程用于以百分比 (%) 为基础设计进度条。第二个参数“Process_Value”包含百分比值。基于此,进度条将填充为绿色。

注册全局类

void InitCustGraph();

此例程将使用 RegisterClassEx API 全局注册一个名为“Custom_Control”的类名,并带有名为 CustGraphWindowProc 的回调函数。此回调函数包含两个用户定义的消息,WM_USER_GRAPHWM_USER_PROCESS_BAR。如果要绘制图表,则必须发送 WM_USER_GRAPH 消息。当我们需要绘制进度条时,必须发送 WM_USER_PROCESS_BAR 消息。

Sun_Check_dll 应用程序

Sun_Check_dll 是一个简单的演示应用程序,它解释了自定义图表控件和进度条 DLL 的使用。在此演示应用程序中,随机选择一些垃圾值以显示动画图表和进度条。在此应用程序中,两个自定义控件(IDC_CUSTOM1IDC_CUSTOM2)放置在对话框中,并给出相同的类名“Custom_Control”。对于 IDC_CUSTOM1WM_USER_GRAPH 消息与数据结构 (User_Data) 作为参考以及 LPARAM 参数一起发送。对于 IDC_CUSTOM2,发送 WM_USER_PROCESS_BAR 消息以使用百分比值更新进度条。此消息以 1000 毫秒的定时器间隔发送。

Using the Code

要使用上述功能(DLL),首先复制 DLL 并将其放置在您的工作区文件夹中。然后,创建一个对话框,从控件工具栏中选择自定义控件,并将其放置在对话框中。选择自定义控件的属性,并将“class”属性更改为“Custom_Control”。

现在,使用 SendDlgItemMessage API 发送用户定义的消息 WM_USER_GRAPH / WM_USER_PROCESS_BAR

用于绘制图表的消息

SendDlgItemMessage(hdlg,(int)IDC_CUSTOM1,WM_USER_GRAPH,
                  (WPARAM) NULL, (LPARAM) &User_Data);

在发送上述消息之前,必须使用以下显示的数据结构格式化数据

struct lp
{
    Unsigned long RxValue;
    Unsigned long TxValue;
    Unsigned int  GraphNo;
}User_Data;
  • RxValue - 用绿色绘制图表。
  • TxValue - 用红色绘制图表。
  • GraphNo - 图表 ID(标识要绘制当前数据的图表)。

示例

//(Specified the current value for Graph No : 0)
User_Data.GraphNo = 0;
//(Dynamically changeable)
User_Data.RxValue = 10;
//(Dynamically changeable)
User_Data.TxValue = 100;

此数据必须作为参考与 LPARAM 参数一起发送。

用于绘制进度条的消息

SendDlgItemMessage(hdlg, (int) IDC_CUSTOM1, WM_USER_PROCESS_BAR ,
                  (WPARAM) NULL, (LPARAM) Process_Value);

Process_Value 是用于绘制进度条的数据。这还应该与 LPARAM 一起发送。由于它是一个“int”值,我们可以直接发送数据,而不是引用。

  • 注意 1:要重绘/重新绘制自定义控件,必须再次发送带有最新值的消息。
  • 注意 2:也可以使用“CreateWindow”API 通过使用“Custom_Contol”类名来绘制自定义控件。
© . All rights reserved.