- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写 C++ MFC 应用程序来控制制造环境中的机器。此应用还需要在非常短的周期时间内分析大量信息。
出于测试目的和长期维护,我需要能够在控制台上绘制来自传感器的数据。我可能完全忽略了一个选项(请随意提出其他选项),但我的研究让我使用图片控件。
我通过使用 OnPaint()
成功地在这个控件中绘制。我的问题是我需要每隔几秒重新绘制一张新图像,而且我不能重复调用 OnPaint()
或向它传递数据。
如何创建一个可用于在图片控件上重复绘制的新函数?此外,这是我第一次涉足 MFC 应用程序,因此请在适当的级别上进行解释。谢谢!
class CPicture : public CStatic
{
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnPaint();
};
BEGIN_MESSAGE_MAP(CPicture, CStatic)
ON_WM_PAINT()
END_MESSAGE_MAP()
void CPicture::OnPaint()
{
CPaintDC dc(this); // device context for painting
dc.SelectStockObject(BLACK_BRUSH);
dc.Rectangle(5, 50, 1000, 51);
}
我想问题是如何以及在哪里访问它
//Picture
class CPicture : public CStatic
{
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnPaint();
vector<Coordinates> GraphData;
};
void CPicture::OnPaint()
{
// device context for painting
CPaintDC dc(this);
// save current brush
CBrush *pOldBrush = (CBrush*)dc.SelectStockObject(BLACK_BRUSH);
int NumPoints = GraphData.size() - 1;
for (int N = 0; N <= NumPoints; N++) {
dc.Rectangle(GraphData[N].x, GraphData[N].y, GraphData[N].x, GraphData[N].y);
}
// select original brush into device contect
dc.SelectObject(pOldBrush);
}
最佳答案
您可以调用Invalidate()
当新数据到达时由您控制,或使用 RedrawWindow()
强制立即重绘:
CPicture myPicture;
myPicture.Invalidate();
或
myPicture.RedrawWindow();
I cannot call OnPaint() repetitively or pass data to it.
要传递数据,可以在 CPicture
类(或程序中的其他地方)中声明包含数据的结构,然后可以从 OnPaint( )
:
struct myData {
int value1;
int value2; // or an array, or some other data structure
}
class CPicture : public CStatic
{
DECLARE_MESSAGE_MAP()
public:
myData m_data;
afx_msg void OnPaint();
};
在OnPaint()
中(你也应该选择原来的刷回设备上下文以避免资源泄漏):
void CPicture::OnPaint()
{
CPaintDC dc(this); // device context for painting
// save current brush
CBrush *pOldBrush = (CBrush*)dc.SelectStockObject(BLACK_BRUSH);
// check pOldBrush - could be NULL
// dc.Rectangle(5, 50, 1000, 51);
// access m_data here, for example
dc.Rectangle(m_data.value1, m_data.value2, 1000, 51);
// select original brush into device contect
dc.SelectObject(pOldBrush);
}
更新(使用线程):
假设如下(来自评论):
对于主线程,您有一个对话框 CLongbowDlg
。
对于图形,您有一个派生自 CStatic
的 PicControl
,并且该控件位于对话框中。
从主线程开始,工作线程开始读取数据。
PicControl and CLongbowDlg are defined in the same header, but are independent of each other. I need to be able to call Invalidate() or RedrawWindow() from inside CLongbowDlg's functions because they represent the primary thread.
我将尝试在这里对其中一种可能性进行简短描述,因为这实际上应该是一个单独的问题。
首先,PicControl
的对象必须是 CLongbowDlg
的成员,我假设是这种情况(我们称它为 m_PicControl
) - 因此,在 CLongbowDlg
类中:
PicControl m_PicControl;
对于数据(我将使用上面的 myData
作为示例数据):在您的主线程(对话框)中,创建一个 myData
类型的变量: m_data
(对于更大的数据,您可以在堆上分配空间,或使用 CArray
或其他一些容器):
myData m_data;
在PicControl
中创建一个类型为myData*
的成员变量,并在PicControl构造函数中将其设置为NULL。
myData *m_pData;
在 OnInitDialog()
(主对话框)中,为 m_picControl
提供指向数据的指针(或者最好在 PicControl 中创建一个函数来执行此操作):
m_picControl.m_pData = &m_data;
启动工作线程时,还为其提供指向 m_data
的指针和/或指向对话框本身的指针 (this
)。
确保使用临界区保护数据。
当数据进来时,工作线程可以通过提供的指针写入数据。
在PicControl::OnPaint()
中,可以通过m_pData
访问相同的数据。
要启动重绘,有几种方法:
在 PicControl
或主对话框中使用计时器,并在每次计时器触发时调用 Invalidate()
。
为了控制工作线程的重绘(例如,当一定数量的新数据到达时),可以使用 PostMessage()
将消息发布到主对话框(使用启动线程时提供的指针 - this
指针)。
要接收消息,您必须在主对话框中创建一个消息处理程序,然后从那里调用 m_picControl
上的 Invalidate()
(您也可以发布一个直接向 PicControl 发送消息,但我更喜欢通过主窗口执行此操作)。
关于c++ - 在 C++ MFC 应用程序中绘制图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34858622/
我一直在为此而苦苦挣扎。我想插入一个图像,并将其“靠近”讨论该图像的文本,但是该页面上的文本将围绕图像环绕/流动。 我已将图像转换为eps格式。最初,我尝试使用图形环境(\begin {figure}
我在用户界面中创建了管理控制台,管理员可以在其中执行所有操作,例如创建、删除用户、向用户分配应用程序以及从用户界面删除用户的应用程序访问权限 我厌倦了使用 Microsoft 图形 API 和 Azu
我在用户界面中创建了管理控制台,管理员可以在其中执行所有操作,例如创建、删除用户、向用户分配应用程序以及从用户界面删除用户的应用程序访问权限 我厌倦了使用 Microsoft 图形 API 和 Azu
我想为计算机图形学类(class)做一个有趣的项目。我知道那里有很多文献(即 SIGGRAPH session 论文)。我对计算机图形学(即图像处理、3D 建模、渲染、动画)兴趣广泛。但是,我只学了
我试图在 MaterializeCSS 网站上创建一些类似于这个的图形,但我不知道它来自哪里,我查看了整个 MaterializeCSS 网站,它不是框架的一部分,我找不到在代码中他们使用的是什么 我
我有一个包含 1 到 6 之间的各种数字的 TextView ,每个数字在每一行上代表一次,例如 123456 213456 214356 ...... 我希望能够绘制一条蓝线来跟随单个数值在列表中向
我目前在 Windows 7 上使用 Netbeans 和 Cygwin,我希望用 C 语言编写一个简单的 2D 游戏。 我设法找到的大多数教程都使用 Turbo C 提供的 graphics.h,C
亲爱的,我正在尝试将 kaggle 教程代码应用于 Iris 数据集。 不幸的是,当我执行图表的代码时,我只能看到这个输出而看不到任何图表: matplotlib.axes._subplots.Axe
我需要加快我正在处理的一些粒子系统的视觉效果。令人眼前一亮的是添加混合、积累以及粒子上的轨迹和发光。目前我正在手动渲染到浮点图像缓冲区,在最后一分钟转换为无符号字符,然后上传到 OpenGL 纹理。为
在研究跨网络的最短路径算法时,我想生成网络图片。我想代表节点(圆圈)、链接(线)、遍历链接的成本(链接线中间的数字)和链接的容量(链接线上它代表的节点旁边的数字)在这张图中。是否有任何库/软件可以帮助
尽管我已将应用程序从库添加到 Azure AD,但我无法看到何时尝试提取数据。但我可以看到添加的自定义应用程序。就像我添加了 7 个应用程序一样; 2 个来自图库(Google 文档、一个驱动器)和
因此,我正在构建一个系统,该系统具有“人员”,“银行帐户”和“银行帐户交易”。 我需要能够回答以下问题: “将所有与1/2/3度有联系的人归还给特定的人”, “返回年龄在40岁以上的所有人” “从德国
我在 JFrame 构造函数中有以下简单代码 super(name); setBounds(0,0,1100,750); setLayout(null); setVis
(这是java)我有一个椭圆形,代表一个单位。我希望椭圆形的颜色代表单位的健康状况。因此,一个完全健康的单位将是全绿色的。随着单位生命值的降低,椭圆形开始从底部填充红色。因此,在 50% 生命值下,椭
我目前正在开发一个学校项目。我们必须制作一个Applet,我选择了JApplet。由于某种原因,我用来显示特定字符串的面板将不会显示。这里可能有什么问题?请指出我正确的方向。另外,我看了一些教程,
我正在尝试创建一个 Simon game 。我正在编写游戏程序,但遇到了问题。我希望程序从队列中读取游戏中之前存在的所有值,并以正确的顺序将它们的颜色变为闪烁(我选择将它们变为灰色,然后在第二秒后恢复
我正在尝试创建一个框架,该框架在同一框架的顶部有一个图形面板(通过布局),在其下方有一个按钮/标签面板。到目前为止,我似乎已经能够将它们放在同一个框架上,但与按钮/标签面板相比,图形面板非常小....
我用 Java 编写了一个解决数独问题的代码,并使用 Java Applet 来设计它。现在,我尝试使用 Java Swing 使其看起来更好,并添加一些功能,例如“保存”数独板等。不幸的是,我对 J
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我现在尝试了 8 个多小时来解决这个问题,但无法弄清楚,请帮助找出我的代码有什么问题。 int main() { int gd = DETECT, gm; float ANGLE =
我是一名优秀的程序员,十分优秀!