自定义控件图表和进度条






4.35/5 (13投票s)
2006年6月2日
4分钟阅读

95723

6868
一篇关于 Win32 自定义图表控件和进度条创建的文章。
引言
在我的项目中,我需要一个图表来显示数据。我的同事建议我使用自定义图表控件。我在网上搜索,但没有找到任何关于在 Win32 中创建自己的自定义控件的好且有趣的资料。所以最终,我决定尝试一下并写了这篇文章。为了使事情更有趣,我创建了一个 DLL,以便在未来的项目中重用相同的控件。该控件是用 C 语言开发的。该项目的主要目标是可重用性。通过区分图表编号和自定义控件 ID,您可以绘制任意数量的图表/进度条。
描述
这是一个非常简单的应用程序,我提供了关于如何创建自定义控件的逐步说明。该项目包含两个应用程序。
- Graph_dll - 一个用于绘制图表和进度条的 DLL。
- 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_GRAPH
和 WM_USER_PROCESS_BAR
。如果要绘制图表,则必须发送 WM_USER_GRAPH
消息。当我们需要绘制进度条时,必须发送 WM_USER_PROCESS_BAR
消息。
Sun_Check_dll 应用程序
Sun_Check_dll 是一个简单的演示应用程序,它解释了自定义图表控件和进度条 DLL 的使用。在此演示应用程序中,随机选择一些垃圾值以显示动画图表和进度条。在此应用程序中,两个自定义控件(IDC_CUSTOM1
和 IDC_CUSTOM2
)放置在对话框中,并给出相同的类名“Custom_Control
”。对于 IDC_CUSTOM1
,WM_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
”类名来绘制自定义控件。