MFC OnPaint问题

我在对话框上取一点,(0,200),再将X右移40,Y不变取点(40,200),连线(0,200)-(40,200);相隔50秒,以(40,200)为起点,X再右移40,... 我在对话框上取一点,(0,200),再将X右移40,Y不变取点(40,200),连线(0,200)-(40,200);相隔50秒,以(40,200)为起点,X再右移40 ,连线(40,200)-(80,200);再相隔50秒 ……以此类推,程序一直运行,在界面看见的是缓慢的画直线动作,且遇到直线越界时,调用滚动条函数(ScrollWindow(-300,0,NULL,NULL))滚动对话框显示;。如果不希望程序一直处于划线的死机状态,该如何操作?
多线程函数怎么写呢,首先我在头文件中声明线程函数
static void ThreadFunc();
再在头文件添加protected型变量:
HANDLE hThread;
DWORD ThreadID;
分别代表线程的句柄和ID。
接着编写线程函数
void CMultiThread1Dlg::ThreadFunc()
{
OnPaint();
}
最后创建线程
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc,
NULL,
0,
&ThreadID);
可是这样子编译会出错,提示illegal call of non-static member function
展开
 我来答
XOopsy
2009-08-03 · 超过35用户采纳过TA的回答
知道答主
回答量:80
采纳率:0%
帮助的人:95.1万
展开全部
创建线程也不能解决一直划线的状态,因为该功能函数没有结束条件。解决办法可以如 zjjzff11 所说的用鼠标事件来结束。
即,
1、创建一个全局变量(一般为bool型)。
2、在你的画图函数中判断这个变量是否为真。是则画图。否则return。
3、这样就可以在你的鼠标事件中改变这个变量,从而实现结束画图。
百度网友1d8e8b9
2009-08-05 · TA获得超过913个赞
知道小有建树答主
回答量:589
采纳率:60%
帮助的人:320万
展开全部
多线程应该这样:

DWORD WINAPI DrawLine( LPVOID lpVoid )
{
CDC * pDC = ( CDC * ) lpVoid;

while( m_bRuning )
{
// 这里添加你的绘图操作

if( m_bRuning )
Sleep( 50000 ); // 延时50秒
}
return 0;
}
这个函数应该是全局的。如果非要把它做成类的成员函数,那么必须是静态的。

创建线程地方
CreateThread( NULL, ..... &dc, .... );
就是要把客户区的DC地址作为参数传入。

程序关闭的地方:
WM_CLOSE或者窗口的WM_NCDESTORY函数中:
默认操作之前加入:

m_bRuning = false;
WaitForSingleObject( m_hThreadHandle, -1 );

OK。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友32cdd9945
2009-08-03 · TA获得超过1374个赞
知道大有可为答主
回答量:2429
采纳率:100%
帮助的人:1921万
展开全部
你要搞个多线程才行,在后台线程里面画图

CreatThread 函数
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zjjzff11
2009-08-02 · TA获得超过2226个赞
知道小有建树答主
回答量:358
采纳率:0%
帮助的人:231万
展开全部
你可以在鼠标消息中去取消计时器啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式