返回首页

 60; 简介
的文章解释了如何与您的应用程序集成我的图形状态显示​​控制(CStatusGraphCtrl)。许多实时应用将有一个与该应用程序相关的一些关键参数的当前值更新用户的要求; CStatusGraphCtrl不仅显示值,但也显示了作为图形的参数的变化进度。目前,它支持条形图和线图显示。支持你自己的图形方式,如果需要的话,你可以自定义代码。控制是完全类似于在Windows任务管理器中看到一个显示CPU和内存使用。使用代码
CStatusGraphCtrl源(ZIP)将包括下列文件:CGraphData.hCGraphData.cppCStatusGraphCtrl.hCStatusGraphCtrl.cpp
这四个文件是为控制核心文件。添加这四个文件到您的VC应用程序项目。
CGraphData类行为作为持有人,目前控制的视口显示的数据。内为线性单链表的数据。
CStatusGraphCtrl类的核心是从CWnd MFC类派生的控件类。要创建一个到您的对话框CStatusGraphCtrl控制,呼叫CStatusGraphCtrl:创建对话框的CDialog的::OnCreate中如下:m_ctrlStatusGraph.Create("演示Controlquot;,/ *标题 - ofcourse不使用* / WS_CHILD | WS_VISIBLE,/ * Windows样式* /   ; CRECT(10,10,350,200),/ *位置,大小* /  0; static_castlt的CWnd * GT(本),/ *父进程* / GRAPH_CTRL_ID / * ID ü此控制分配* / );
这将创建一个所需的位置StatusGraphCtrl。一旦控制被创建时,您需要指定使用控制一些属性值:SetMinValueSetMaxValueSetSamplingInterval
SetMinValue被称为指定控制的视口的最底层的价值。 SetMaxValue被称为指定在最上面的线控制的视口的价值。 SetSamplingInterval被称为指定连续地块之间的水平距离(以像素为单位)。当一切准备就绪后,调用CStatusGraphCtrl:StartUpdate付诸行动的控制。一旦StartUpdate,任何CStatusGraphCtrl调用:SetCurrentValue将在控制的视口看到图中反映。
图不断滚动从右到左。每个滚动之间的延迟可以控制通过调用CStatusGraphCtrl::SetRefreshDelay所需的延迟时间作为参数毫秒。
下面的代码块是从我这个控制DemoApp,将举一个简单的的代码,以使application.void DataGenerator(LPVOID参数)中使用的CStatusGraphCtrl控制CStatusGraphCtrl * pCtrl =(CStatusGraphCtrl *)参数; (真实) { INT nRand = RAND(); (nRand GT; pCtrl - GT; GetMaxValue()) nRand / = 10; pCtrl - GT; SetCurrentValue(nRand);   ; / *此值将反映在 & #160;在控制的视口的图形* / 睡眠(50); }}INT CDemoDialog::在OnCreate(LPCREATESTRUCT lpCreateStruct){ / / m_ctrlStatusGraph CStatusGraphCtrl类型的成员 m_ctrlStatusGraph.Create("演示Controlquot; WS_CHILD | WS_VISIBLE,CRECT(10,10,350,200), static_castlt的CWnd * GT(本),GRAPH_CTRL_ID); m_ctrlStatusGraph.SetMaxValue(100); m_ctrlStatusGraph.SetMinValue(0); m_ctrlStatusGraph.StartUpdate(); AfxBeginThread((AFX_THREADPROC)DataGenerator  60; (LPVOID)放大器; m_ctrlStatusGraph);  60; 返回CDialog的:在OnCreate(lpCreateStruct);}自CStatusGraphCtrl
CStatusGraphCtrl的每一个方面几乎是定制的。以下是您可以按您的要求定制的属性列表:SamplingInterval - 呼叫SetSamplingInterval(短) - 在连续的地块之间的像素水平距离RefreshDelay - SetRefreshDelay调用(INT) - 以毫秒为单位的连续滚动之间的延迟背景颜色 - 访问市民的COLORREF m_BackColor前景色 - 访问市民的COLORREF m_ForeColor添加自定义GraphModes
要添加您自己的的GraphMode,所有你需要做的只是两个步骤。更新枚举StatusGraphType你在CStatusGraphCtrl.h头文件中添加新GraphType条目。然后添加代码来绘制图形,DrawPoint CStatusGraphCtrl.cpp文件的功能。这个代码片断:无效DrawPoint(CStatusGraphCtrl * TheCtrl,长整型cury,BOOL更新){ / /控制特定的代码将出现在这里... / / .. / / .. 开关(TheCtrl - GT; GetGraphMode()) { 案件BAR_GRAPH:  ; PDC - GT; MOVETO(rcBounds.right sSamplingInterval,rcBounds.bottom); PDC - GT的LineTo(rcBounds.right sSamplingInterval,rcBounds.bottom cury);  0; 打破; 案件LINE_GRAPH: &# 160; MOVETO(rcBounds.right - 2 * sSamplingInterval,PDC - GT; & #160; rcBounds.bottom - TheCtrl - GT; m_lPreviousY); PDC - GT的LineTo(rcBounds.right sSamplingInterval,rcBounds.bottom cury);  0; 打破; //************************************************ **************************// / / TODO:& #160; / /相应的更新在头的枚举类型(CStatusGraphCtrl.h)文件 / /添加额外的case块来支持你自己的图形模式 / / cury - 积电流值  60;/ / TheCtrl - GT; m_lPreviousY - 代表以前的点绘制。 &# 160; / / rcBounds - 代表CStatusGraphCtrl控制的范围。 //************************************************ *************************// 案件CUSTOM_GRAPH: &# 160; / /做一些事情,TheCtrl - GT与cury; m_lPreviousY,rcBounds需要。 打破; } &# 160; / /控制特定的代码将出现在这里... / / .. &# 160; / / ..}活动
CStatusGraphCtrl是写在这样一种方式,它发送一个WM_COMMAND消息,当鼠标点击控制。申请书应当利用这一需要。例如,在我DemoApp,我已经加入CStatusGraphCtrl图模式改变的ON_COMMAND处理程序的控制功能。处理程序代码:BEGIN_MESSAGE_MAP(CDemoDialog,CDialog的) / / ..其他消息映射.. / / .. ON_COMMAND(GRAPH_CTRL_ID,OnClickGraph)END_MESSAGE_MAP()布尔CDemoDialog:OnClickGraph(){ / /切换图形模式之间BAR_GRAPH(0)和LINE_GRAPH(1) m_ctrlStatusGraph.SetGraphMode((StatusGraphType)  60; (INT)m_ctrlStatusGraph.GetGraphMode()); 返回TRUE;兴趣点
,我会告诉你,我提出了这个代码。我是编码一个网络工具,监控网络流量和控制从单一的来源,其中,我想这样的控制的过量交通。我开始用的按钮BS_OWNERDRAW功能,并愉快地与CDC编码的要求。此代码使用CDC::BitBlt将执行图的滚动,所以非常快,无闪烁。我已接近完成,并检查控制的各种功能。至此,我没有试过我的应用程序运行时的应用程序之间切换。而且,问题就来了,当应用程序之间交换... ...当我切换回我的应用程序,整个图形了!!!!!抱歉,我没有必要的信息,在我的记忆中留下重绘图形。这是当我添加新的类CGraphData存储控制当前视口相关的数据。数据结构存储点的序列,而不是整个视口像素矩阵。事实上,滚动发生过的数据结构。对于每一个新的价值在右,左边的值将被删除,从而保持窗口的大小。
感谢CodeProject上成员:我有我的代码的反馈信息,提交这篇文章的第一天,我从我能感觉到,CButton的使用这种控制并不是在所有必要的,我立即修改了代码,我张贴在这里。现在的控制不再使用CButton的。它只是一个窗口。历史CStatusGraphCtrl的第一个版本是从CButton的派生。CodeProject上成员反馈的基础上,我修改了代码,从CWnd派生。

回答

评论会员:游客 时间:2011/12/02
会员7891535:喜纳温,感谢很多伟大提交我想使用CStatusGraphCtrl的对象从TabCtrl窗口内调用(而不是主窗口)。特别是,我有一个TabCtrl上的主窗口。TabCtrl有2个标签:标签1对话窗口1,表2,对话窗口2。我想对话窗口1加载CStatusGraphCtrl的对象。出于某种原因,对话窗口1总是背后Tabctrl隐藏你有任何想法,以解决此问题提前感谢,{BR}威利
bhargav_j
评论会员:游客 时间:2011/12/02
喜纳温,能否请你这个代码指定一个适当的许可证。我们计划在我们的应用程序使用此,我们要确保我们有发牌清除掉。谢谢你Bhargav乔希
briancm
评论会员:游客 时间:2011/12/02
从VS6到VS2005转换产生一个编译错误解决方法:更改"OnClickGraph布尔();""AFX_MSG无效OnClickGraph();".该函数还需要加以改变。此外,前面提到的错误,并显示出来。为了再现,运行演示,然后移动控制上的另一个窗口。
stanlymt
评论会员:游客 时间:2011/12/02
我真正欣赏UR好功夫。我发现一个bug。在图中,当任何窗口,窗口的一部分被复制在滚动的方向。我认为问题DrawPoint函数BitBlt函数。ü修正错误,并给我尽快答复吗?希望尽快听到从u 
WREY
评论会员:游客 时间:2011/12/02
,它使阅读恼人的和不必要的困难时,读者要来回滚动,左到右,以检讨的文章imgsrc=http://www.orcode.com/upimg/2011_12_02_07_13_14_1.gif威廉福特斯等opere真正
!拉维Bhavnani
评论会员:游客 时间:2011/12/02
imgsrc=http://www.orcode.com/upimg/2011_12_02_07_13_12_0.jpg]无效。{S2}拉维/我的新的一年的分辨率:2048×1536{A}ravib@ravib.com
杰拉尔德纳温
评论会员:游客 时间:2011/12/02
网站作出了积极的。遗憾的是,该网站是无效。我从来没有期望,雅虎站点无效,只是bcoz是没有更新...有使用该网站的人,但总之感谢UR反馈。感谢杰拉尔德纳温为(;)/*ageraldnaveen*/
Maximilien
评论会员:游客 时间:2011/12/02
为什么就不能作为一个CWnd和处理内部类点击(改变图表类型)?imgsrc=http://www.orcode.com/upimg/2011_12_02_07_13_14_2.gif你的头Splode-强坏
杰拉尔德纳温
评论会员:游客 时间:2011/12/02
我的整个逻辑是基于BS_OWNERDRAW这按钮只有。之所以选择CButton的Click事件,但所有者绘制。(;)/*ageraldnaveen*/
Maximilien
评论会员:游客 时间:2011/12/02
请不要以这种方式使用一个按钮您正在寻找消息是WM_PAINT消息。
杰拉尔德纳温
评论会员:游客 时间:2011/12/02
作为其他写道,只是不使用该按钮...使用的WM_PAINT,WM_LBUTTONDOWN,(和)消息管理点击imgsrc=http://www.orcode.com/upimg/2011_12_02_07_13_14_2.gif你的头Splode-强坏