您可以在这里快速查找:


 
您的位置: 编程学习 > C++/VC > 200602
文章分类

Java技术
2005: 03 04 05 06 07 08
09 10 11 12
2006: 01 02

Asp.net
2005: 07 08 09 10 11 12
2006: 01 02

VB编程
2006: 02

Asp编程
2005: 11 12
2006: 01 02

C++/VC
2005: 10 11 12
2006: 01 02

Delphi
2005: 12
2006: 01 02

其它

 本文章适合所有读者

使用多线程绘图(二)

s6283

 

二.如何使用多线程
   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)      //负责子线程向主线程报告是否中断

           (待续...)