使用多线程绘图(二)

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

二.如何使用多线程

1.demo界面设置:

为了能很好的模拟测试多线程绘图显示程序,我们建立了一个简单的demo程序,

先使用mfc向导,建立一个对话框程序,并增加全局变量CDib m_dib,对话框上建立三

个按钮和一个进度条,按钮1的功能为将c:\test1.bmp读入m_dib,按钮2的功能为将

c:\test2.bmp读入m_dib,按钮3的功能为终止m_dib的读入(关于CDib将在以后详细

说明),进度条用于显示当前读入数据的进度,于是按钮中的代码如下:

void CDemoDlg::OnButton1()

{

m_dib.LoadBmp ("c:\\test1.bmp");

}

void CDemoDlg::OnButton2()

{

m_dib.LoadBmp ("c:\\test2.bmp");

}

void CDemoDlg::OnButton3()

{

m_dib.DoStop(); //停止CDib的读入操作

}

但是,m_dib读入功能为多线程读取函数那有可能在读取test1.bmp时,程序要求读取test2.bmp,

所以按钮中的代码修改如下:

void CDemoDlg::OnButton1()

{

m_dib.DoStop(); //这也可以直接加入LoadBmp中

m_dib.LoadBmp ("c:\\test1.bmp");

}

void CDemoDlg::OnButton2()

{

m_dib.DoStop();

m_dib.LoadBmp("c:\\test2.bmp");

}

当然我们还要显示m_Dib,为了显示m_Dib我们对OnPaint作如下修改:

void CDemoDlg::OnPaint()

{

CPaintDC dc(this);

CRect clientRc;

GetClientRect(&clientRc); //取得窗体大小

CDC memDC1; //我们将读入的图像置于memDC1中

CDC memDC2; //memDC2设置背景图像

CBitmap m_bitmap;

CBitmap * m_pOldBitmap;

CBitmap * m_pOldBitmapA;

memDC1.CreateCompatibleDC(&dc);

memDC2.CreateCompatibleDC(&dc);

m_bitmap.CreateCompatibleBitmap(&dc,clientRc.Width() , clientRc.Height());

m_pOldBitmapA = memDC2.SelectObject(&m_bitmap);

m_pOldBitmap = memDC1.SelectObject(&m_Dib); //m_Dib为全局变量

memDC2.BitBlt(0,0, clientRc.Width(), clientRc.Height(),

&memDC1,0,0, SRCCOPY); //将读入的图像复制到背景图中

dc.BitBlt(0,0, clientRc.Width(), clientRc.Height(),

&memDC2,0,0, SRCCOPY); //显示当前图像

memDC2.SelectObject(m_pOldBitmapA );

memDC1.SelectObject(m_pOldBitmap );

}

我们建立两个消息函数负责子线程向界面线程报告完成情况和状态,

ON_MESSAGE(WM_SETPOS, ON_WM_SETPOS) //负责子线程向主线程报告完成进度

ON_MESSAGE(WM_INTERRUPT, ON_WM_INTERRUPT) //负责子线程向主线程报告是否中断

(待续...)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航