使用多线程绘图(三)

类别:VC语言 点击:0 评论:0 推荐:

   在CDib中我们每次读入图像的一行,然后发送WM_SETPOS消息给界面线
程,界面则刷新当前图像和进度条,在ON_WM_SETPOS中,wParam为bmp总行
数,lParam为目前处理的行数,为了简化程序我们只处理自底向上(即bmp图
像高度>0)的图像.
   void CDemoDlg::ON_WM_SETPOS(WPARAM wParam, LPARAM lParam)
   {
     CRect clientRc;
     GetClientRect(&clientRc);   //取得当前窗体大小

     CProgressCtrl *cw;
     cw=(class CProgressCtrl *)GetDlgItem(IDC_PROGRESS1);
     cw->SetRange (0,100);       //设置进度条

     float l;
     if (wParam!=0)
         l=(float) lParam/(float)wParam*100;
     else
         l=0;
    cw->SetPos ((int)l);       //更新进度条

    CRect rc;
    rc.SetRect (0,wParam-lParam,clientRc.Width(),wParam-lParam+1);
    InvalidateRect(&rc,false); //刷新当前行
   }
   至此我们的界面程序基本完成.

   2.CDib设置:
   下面我们进行CDib的构建,为了方便图像的显示处理我们继承CBitmap构建CDib,
为了解说方便,我们只处理24位色图,这里我们给出CDib基本结构,其他部分读者可以
自由扩充.

   class CDib : public CBitmap 
   {
    public:
             CDib();                            //构造函数
            virtual ~CDib();                //析构函数
            BYTE * m_lpBits;            //数据指针,指向cbitmap的数据区
            LPBITMAPINFOHEADER m_lpBmih;//图像头指针
            HANDLE hMutex;          //互斥变量
            HANDLE hStopEvent;    //线程读到此信号,立即退出现有的操作
            CWnd * m_Wnd;            //用于子线程发送消息界面指针
            CWinThread  *m_cAniThread;  //多线程中,子线程对象
            virtual void DoStop();      //用于界面线程中停止当前线程
            BOOL LoadBmp(LPCTSTR lpszPathName, CDC* pDC = NULL);
                                                   //由bmp读入图像
            static UINT ThreadProcRead(LPVOID parm);
                                                  //多线程函数读入图像
            .
            .
            .
    protected:
            BOOL AttachDib(HGDIOBJ hObject);
                                                 //Attach Object
            BOOL DeleteDib();      //delete object
            void Initialize();             //设置图像头等操作
            .
            .
            .
   }

本文地址:http://com.8s8s.com/it/it524.htm