CProgress类使用例程

//========================================================================
//TITLE:
//    CProgress类使用例程
//AUTHOR:
//    norains
//DATE:
//    Tuesday  17-April-2007
//Environment:
//        EVC4.0 + Standard SDK 4.2
//        EVC4.0 + Standard SDK 5.0
//========================================================================

        CProgress类是仿照微软的CProgress写的一个显示进度类.最大的区别在于,该类的状态显示的图片可以按自己意愿设置,这对于某些需要风格独特的程序来说,显得比较方便.
       
        该类的使用范例如下:
       
        //声明一个对象       
 CProgress prg;

       
        //设置显示的位置       
 prg.SetPosition(rcWnd);


        //设置有效和无效的图片
  prg.SetImgInfoInvalid( & imgInvalid);
  prg.SetImgInfoValid(
& imgValid)

        //设置范围     
   prg.SetRange( 0 , 6 );
       
        //设置等级       
 prg.SetLevel( 4 );        
       
        //传入应用程序的实例句柄,令控件能读取图片       
 prg.SetHinstance(hInst);
       
        //绘制控件       
 prg.Draw(hdc);



//
//  Progress.h: interface for the CProgress class.
//
// Version: 
//     1.0.2
// Data:
//     2007.04.12   
//

#ifndef PROGRESS_H
#define  PROGRESS_H


#include 
" CtrlCommon.h "


// The image displayed information
typedef  struct
{
    LONG imgID;
    LONG left;
    LONG top;
    LONG right;
    LONG bottom;
}
DISPIMAGEINFO, * PDISPIMAGEINFO;

class  CProgress  
{
public:
    BOOL SetBkMode(
int iMode);
    
void SetBkColor(COLORREF crColor);
    
void SetHinstance(HINSTANCE hInst);
    BOOL Draw(HDC hdc);
    BOOL SetLevel(
int m_iLevel);
    BOOL SetRange(
int iMin,int iMax);
    
void SetImgInfoInvalid(const DISPIMAGEINFO *pInfo);
    
void SetImgInfoValid(const DISPIMAGEINFO *pInfo);
    
void SetPosition(const RECT *prc);
    CProgress();
    
virtual ~CProgress();
protected:
    RECT m_rcWndPos;
    DISPIMAGEINFO m_ImgValid;
    DISPIMAGEINFO m_ImgInvalid;
    
int m_iMinLevel;
    
int m_iMaxLevel;
    
int m_iCurLevel;
    HINSTANCE m_hInst;
    COLORREF m_crBkColor;
    
int m_iBkMode;
}
;

#endif   // #ifndef PROGRESS_H


//
//  Progress.cpp: implementation of the CProgress class.
//
//

#include 
" stdafx.h "
#include 
" Progress.h "


// --------------------------------------------------------------------
// Macro define
#define  DEFAULT_MIN_LEVEL                0
#define  DEFAULT_MAX_LEVEL                10
#define  DEFAULT_CUR_LEVEL                0
#define  DEFAULT_BKCOLOR                    RGB(128,128,128)
#define  DEFAULT_BKMODE                    TRANSPARENT

// The interval between two level image
#define  LEVEL_INTERVAL            4
// --------------------------------------------------------------------
//
//  Construction/Destruction
//

CProgress::CProgress()
{
    memset(
&m_rcWndPos,0,sizeof(m_rcWndPos));
    memset(
&m_ImgValid,0,sizeof(m_ImgValid));
    memset(
&m_ImgInvalid,0,sizeof(m_ImgInvalid));
    m_iMaxLevel 
= DEFAULT_MAX_LEVEL;
    m_iMinLevel 
= DEFAULT_MIN_LEVEL;
    m_iCurLevel 
= DEFAULT_CUR_LEVEL;
    m_hInst 
= NULL;
    m_crBkColor 
= DEFAULT_BKCOLOR;
    m_iBkMode 
= DEFAULT_BKMODE;
}


CProgress::
~ CProgress()
{
}



// -------------------------------------------------------------------
// Description:
//     Set the position
// -------------------------------------------------------------------
void  CProgress::SetPosition( const  RECT  * prc)
{
    m_rcWndPos 
= *prc;
}



// -------------------------------------------------------------------
// Description:
//     Set the image information for valid
// -------------------------------------------------------------------
void  CProgress::SetImgInfoValid( const  DISPIMAGEINFO  * pInfo)
{
    m_ImgValid 
= *pInfo;
}



// -------------------------------------------------------------------
// Description:
//     Set the image information for invalid
// -------------------------------------------------------------------
void  CProgress::SetImgInfoInvalid( const  DISPIMAGEINFO  * pInfo)
{
    m_ImgInvalid 
= *pInfo;
}



// -------------------------------------------------------------------
// Description:
//     Set the range
// -------------------------------------------------------------------
BOOL CProgress::SetRange( int  iMin,  int  iMax)
{
    
if(iMin < 0 || iMax < 0 || iMin >= iMax)
    
{
        
return FALSE;
    }


    m_iMinLevel 
= iMin;
    m_iMaxLevel 
= iMax;

    
return TRUE;
}




// -------------------------------------------------------------------
// Description:
//     Set the position
// -------------------------------------------------------------------
BOOL CProgress::SetLevel( int  iLevel)
{
    
if(iLevel < m_iMinLevel || iLevel > m_iMaxLevel)
    
{
        
return FALSE;
    }

    m_iCurLevel 
= iLevel;
    
return TRUE;
}



// -------------------------------------------------------------------
// Description:
//     Draw the control
// -------------------------------------------------------------------
BOOL CProgress::Draw(HDC hdc)
{
    
if(m_hInst == NULL)
    
{
        
return FALSE;
    }


    
int iImgTotalWidth = (m_ImgValid.right - m_ImgValid.left) * (m_iMaxLevel - m_iMinLevel) + LEVEL_INTERVAL * (m_iMaxLevel - m_iMinLevel - 1);
    
int iImgTotalHeight = m_ImgValid.bottom - m_ImgValid.top;

    
//Create a DC that matches the device
    HBITMAP hBitmap = CreateCompatibleBitmap(hdc,iImgTotalWidth,iImgTotalHeight);
    HDC hdcMem 
= CreateCompatibleDC(hdc);
    
//Select the bitmap into to the compatible device context
    HGDIOBJ hOldSel = SelectObject(hdcMem,hBitmap);



    
//Draw the background
    
//The frame color
    HPEN hPen=CreatePen(PS_SOLID,1,m_crBkColor);
    HPEN hOldPen
=NULL;
    hOldPen
=(HPEN)SelectObject(hdcMem,hPen);
    
//the rect color
    HBRUSH hBrush = CreateSolidBrush(m_crBkColor);
    HGDIOBJ hOldBrush 
= SelectObject(hdcMem,hBrush);
    
//Draw
    Rectangle(hdcMem,0,0,iImgTotalWidth + 1, iImgTotalHeight + 1);
    
//Realse the resource
    SelectObject(hdcMem,hOldBrush);
    DeleteObject(hBrush);
    SelectObject(hdcMem,hOldPen);
    DeleteObject(hPen);




    
//Draw the valid image
    
//Create a DC that matches the device to draw the background bitmap
    HDC hdcBmp = CreateCompatibleDC(hdc);
    
//Load the  bitmap
    HANDLE    hBmp = LoadImage(m_hInst,MAKEINTRESOURCE(m_ImgValid.imgID),IMAGE_BITMAP,0,0,0);
    
//Select the bitmap into to the compatible device context
    HGDIOBJ hOldBmpSel = SelectObject(hdcBmp,hBmp);
    
int i = 0, iPos_x = 0;
    
for(i = m_iMinLevel + 1; i <= m_iCurLevel; i ++)
    
{
        
//Copy the bitmap image to the memory DC
        BitBlt(hdcMem,iPos_x,0,(m_ImgValid.right - m_ImgValid.left),(m_ImgValid.bottom - m_ImgValid.top),hdcBmp,m_ImgValid.left,m_ImgValid.top,SRCCOPY);
        iPos_x 
+= (m_ImgValid.right - m_ImgValid.left) + LEVEL_INTERVAL;
    }

    
//Delete the bmp
    DeleteObject(hBmp);


    
//Draw the invalid image
    hBmp = LoadImage(m_hInst,MAKEINTRESOURCE(m_ImgInvalid.imgID),IMAGE_BITMAP,0,0,0);
    
//Select the bitmap into to the compatible device context
    SelectObject(hdcBmp,hBmp);
    
for(i = m_iCurLevel + 1; i <= m_iMaxLevel; i ++)
    
{
        
//Copy the bitmap image to the memory DC
        BitBlt(hdcMem,iPos_x,0,(m_ImgValid.right - m_ImgValid.left),(m_ImgValid.bottom - m_ImgValid.top),hdcBmp,m_ImgInvalid.left,m_ImgInvalid.top,SRCCOPY);
        iPos_x 
+= (m_ImgValid.right - m_ImgValid.left) + LEVEL_INTERVAL;
    }

    
//Delete the bmp
    DeleteObject(hBmp);



    
if(m_iBkMode == TRANSPARENT)
    
{
        TransparentImage(hdc,m_rcWndPos.left,m_rcWndPos.top,(m_rcWndPos.right 
- m_rcWndPos.left),(m_rcWndPos.bottom - m_rcWndPos.top),
            hdcMem,
0,0,iImgTotalWidth,iImgTotalHeight,m_crBkColor);
    }

    
else
    
{
        StretchBlt(hdc,m_rcWndPos.left,m_rcWndPos.top,(m_rcWndPos.right 
- m_rcWndPos.left),(m_rcWndPos.bottom - m_rcWndPos.top),
            hdcMem,
0,0,iImgTotalWidth,iImgTotalHeight,SRCCOPY);
    }

    
//Restore original bitmap selection and destroy the memory DC
    SelectObject(hdcBmp,hOldBmpSel);
    SelectObject(hdcMem,hOldSel);
    DeleteObject(hBitmap);    
    DeleteDC(hdcBmp);
    DeleteDC(hdcMem);



    
return TRUE;
}



// -------------------------------------------------------------------
// Description:
//     Set the hinstance
// -------------------------------------------------------------------
void  CProgress::SetHinstance(HINSTANCE hInst)
{
    m_hInst 
= hInst;
}



// -------------------------------------------------------------------
// Description:
//     Set the background color
// -------------------------------------------------------------------
void  CProgress::SetBkColor(COLORREF crColor)
{
    m_crBkColor 
= crColor;
}



// --------------------------------------------------------------------
// Description:
//     Set the background mode.If you choose the TRANSPARENT, the transparent
// color is the background color
//
// Parameters:
//     iMode: [in] The value is just like as follow:
//         OPAQUE      -- Background is filled with the current background color before the text, 
//                         hatched brush, or pen is drawn. 
//         TRANSPARENT -- Background remains untouched. 

// --------------------------------------------------------------------
BOOL CProgress::SetBkMode( int  iMode)
{
    
if(iMode == OPAQUE || iMode == TRANSPARENT)
    
{
        m_iBkMode 
= iMode;
        
return TRUE;
    }

    
else
    
{
        
return FALSE;
    }

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: CODESYS(控制系统开发环境)是一种流行的编程软件,用于开发工业自动化设备的控制系统。CODESYS支持面向对象编程(OOP),可以通过使用例程来展示和应用面向对象的概念。 在CODESYS中,可以创建Class)和对象(Object)。是具有特定属性和方法的对象的模板,对象是的具体实例。通过创建和对象,可以实现面向对象编程的特性,如封装、继承和多态。 使用例程可以展示如何使用面向对象的思维方式在CODESYS中编写程序。例如,可以创建一个来表示一个物体,并定义属性和方法,比如物体的位置(属性)和移动(方法)。然后,可以创建多个对象来表示多个不同的物体,并调用它们的方法来移动它们的位置。 除了属性和方法,还可以定义事件(Event)。事件是一种触发器,当满足特定条件时,会触发相应的动作。例如,在一个电梯中可以定义一个事件来表示电梯到达某个楼层,当事件触发时可以执行相应的动作,比如打开门。 使用例程可以演示如何设计和使用、对象和事件来模拟和控制复杂的系统。通过将问题分解成多个和对象,可以更好地组织和管理代码,提高代码的可读性和可维护性。 总之,CODESYS使用例程展示了如何在该开发环境中应用面向对象编程的概念和特性。通过创建、对象和事件,可以更好地组织和管理代码,并实现复杂系统的模拟和控制。 ### 回答2: CODESYS是一种面向对象的编程软件,它提供了丰富的使用例程来帮助开发人员更轻松地使用面向对象的编程思想进行开发。 首先,CODESYS中的使用例程包括了多个不同的对象,例如函数块、函数、等。这些例程可以通过继承和组合来创建复杂的对象结构,使程序的开发更加模块化和可维护。例如,我们可以创建一个函数块来表示一个温度传感器,并使用使用例程来定义其方法和属性。 其次,CODESYS中的使用例程还可以通过编程界面来进行调用和使用。开发人员可以使用例程来定义特定的功能、执行特定的操作,以及处理特定的事件。例如,我们可以创建一个使用例程来控制一个电机的运行,并在需要时调用该使用例程来启动或停止电机。 此外,CODESYS还提供了一些常用的使用例程模板,用于快速创建常见的功能。例如,我们可以使用一个模板来创建一个简单的计算器应用程序,包含加、减、乘、除等基本运算。 最后,CODESYS中的使用例程还可以与其他编程语言进行交互。例如,我们可以使用使用例程来调用C语言编写的函数,或使用CODESYS提供的API来与其他外部设备进行通信。这使得开发人员可以更灵活地使用不同语言和技术来开发复杂的应用程序。 总之,CODESYS中的使用例程提供了一种面向对象的编程方法,帮助开发人员更轻松地开发和组织程序,同时也提供了一些常用的使用例程模板和与其他编程语言的交互功能。通过使用例程,开发人员可以更高效地进行软件开发和维护工作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值