国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
進度條相關(guān)

方法1:
單線程方式。
將你的任務(wù)分成多個部分,每運行一部分,就更新一下進度條。
這種方法就是很煩人。

方法2:
雙線程方式。
主線程負責(zé)完成你想要的工作。副線程負責(zé)更新進度條。
更新進度條可以按照計時方法,或者根據(jù)主線程完成任務(wù)的狀態(tài)來更新。
因此,你的主線程在完成任務(wù)時,還得用一個臨界區(qū)隨時報告任務(wù)的完成狀態(tài)。

方法3:
雙線程方式
主線程負責(zé)更新進度條,并且創(chuàng)建副線程完成任務(wù)的某部分工作。但這和單線程很像。


在VC程序的狀態(tài)欄中實現(xiàn)進度條

  讀者朋友們可能天天使用Visual C++這個強大的工具來開發(fā)應(yīng)用程序,不知道注意到?jīng)]有,Visual C++每次裝載一個項目的時候,為了使項目加載過程不至于太單調(diào),會在狀態(tài)欄的左半部分會出現(xiàn)一個裝載進度條,用來即時顯示Visual C++裝載項目的進度,當(dāng)項目裝載完畢后,進度條隱藏。那么這個功能是如何實現(xiàn)的呢?為了說明該功能的實現(xiàn)原理,本例提供了一個范例程序prgsbar,它演示了在編輯視圖里顯示文本文件,在加載文本文件時,在界面的狀態(tài)條中的進度指示器仿真顯示文件的加載過程,當(dāng)文本裝載完畢后,進度條隱藏。由于該程序在裝載文件顯示的進度條時無法進行拷屏操作,所以這里沒有給出狀態(tài)條中顯示進度條的界面效果圖,讀者可以運行本書所帶光盤中的程序代碼觀看相應(yīng)的效果。

一、實現(xiàn)方法

雖然Visual C++中的MFC類提供了標(biāo)準(zhǔn)的進度指示器控件(progress control),但是我們不能在狀態(tài)欄里直接使用這個控件,要解決這個問題,可以創(chuàng)建一個可重用C++類CProgStatusBar,這個類從CStatusBar派生,用來來實現(xiàn)狀態(tài)條中的進度指示。整個實現(xiàn)過程不是很難,思路是在狀態(tài)欄創(chuàng)建一個進度指示器控制,把它作為子窗口來對待,然后根據(jù)不同的狀態(tài)來顯示或者隱藏進度指示器。

在具體實現(xiàn)CProgStatusBar類的過程中,首先在CProgStatusBar派生類中加了一個CProgressCtrl類型的數(shù)據(jù)成員--m_wndProgBar,然后重載CstatusBar類的二個重要成員函數(shù):OnCreate()、OnSize(),最后還要在該類中添加一個自定義成員函數(shù)OnProgress()。在上述三個函數(shù)中, OnCreate()負責(zé)在狀態(tài)欄第一次被創(chuàng)建時接收控制,繼而創(chuàng)建進度指示器并將它初始化為一個子窗口,它的實現(xiàn)代碼如下:

int CProgStatusBar::OnCreate(LPCREATESTRUCT lpcs)
{
lpcs->style |=WS_CLIPCHILDREN;
VERIFY(CStatusBar::OnCreate(lpcs)==0);
VERIFY(m_wndProgBar.Create(WS_CHILD,CRect(), this, 1));
m_wndProgBar.SetRange(0,100);
return 0;
}

OnCreate()函數(shù)在狀態(tài)欄的式樣中加了一個WS_CLIPCHILDREN,它告訴Windows不要繪制子窗口以下的狀態(tài)欄區(qū)域,這樣可以減少屏幕閃爍。接著OnCreate()函數(shù)創(chuàng)建進度指示器控件并將它的范圍設(shè)置成[0,100]。注意在這里創(chuàng)建進度指示器控件時沒有用WS_VISIBLE,因為我們要實現(xiàn)的目標(biāo)是僅僅當(dāng)裝載文件時進度條才顯現(xiàn),其余時間內(nèi)應(yīng)用程序都隱藏它。

熟悉Windows編程的人都清楚,無論何時,只要在某個窗口里添加子窗口,那么一定要負責(zé)管理它的大小尺寸,也就是說,當(dāng)父窗口大小改變后,子窗口的大小也要跟著作相應(yīng)的改變。一般來說,這個工作由父窗口的WM_SIZE消息處理函數(shù)OnSize()來作,所以我們也要處理該類的OnSize()函數(shù)。

void CProgStatusBar::OnSize(...)
{
CStatusBar::OnSize(...);
CRect rc;
GetItemRect(0,&rc);//獲取狀態(tài)條的第一個窗口的尺寸;
m_wndProgBar.MoveWindow(&rc,FALSE);//移動進度條到狀態(tài)條的第一個窗口;
}  

從上述代碼可以看出,CProgStatusBar::OnSize()將進度指示器放在了狀態(tài)欄的第一個窗格,這個窗格通常用來顯示程序的"就緒"信息和命令提示信息。注意這里不論進度指示器是處于可見狀態(tài)還是隱藏狀態(tài),MoveWindow都照樣起作用--所以即便是進度指示器處于隱藏狀態(tài),其窗口大小同樣是可調(diào)的。

調(diào)整好進度指示器的窗口大小后,下面要作的就是進度指示器的顯示,進度指示器當(dāng)前進度狀態(tài)的顯示在CProgStatusBar::OnProgress中完成。它有一個類型為UINT的入口參數(shù):參數(shù)值的范圍從0到100,表示進度百分比,0表示進度沒開始,100表示全部完成。如果這個參數(shù)的值大于0,則OnProgress顯示進度控制并設(shè)置指示器的位置;如果參數(shù)值等于0,則 OnProgress隱藏進度控制。

雖然子窗口控件通常都是放在父窗口能繪制的區(qū)域的最上面,但這樣做在繪制方面是有一定風(fēng)險的。在隱藏/顯示進度控制時尤其如此,這時候會出現(xiàn)兩個問題:第一,因為進度指示器顯示在狀態(tài)欄的第一個窗格位置,所以如果進度條指示器顯示時已經(jīng)顯示有狀態(tài)信息,那么進度指示器和狀態(tài)信息文本就會有沖突,相互干擾。之所以會這樣,是因為進度控制假設(shè)其繪制背景是干凈的,并且只繪制進度控制的著色部分。解決這個問題最簡單的方法是調(diào)用CStatusBar::SetWindowText(NULL)函數(shù)在顯示進度指示器之前打掃一下環(huán)境衛(wèi)生,清除以前的文本。

對于狀態(tài)欄來說,SetWindowText函數(shù)的作用是設(shè)置狀態(tài)欄第一個窗格的文本。反之,當(dāng)調(diào)用OnProgress(0)清除進度控制時也存在類似的問題,CProgStatusBar::OnProgress 隱藏進度控制后,狀態(tài)欄第一個窗格該顯示什么信息呢?一般顯示"就緒"或其它的提示信息。當(dāng)應(yīng)用程序不做任何事情時,MFC程序總是在這個位置顯示資源串AFX_IDS_IDLEMESSAGE表示的文本,其缺省值為"就緒",當(dāng)然讀者朋友們可以在當(dāng)前項目的RC文件中任意修改這個值,不管怎樣,在MFC程序的狀態(tài)欄中顯示"就緒"信息很容易,需要作的就是在CProgStatusBar::OnProgress()函數(shù)中調(diào)用語句GetParent()->PostMessage(WM_SETMESSAGESTRING,AFX_IDS_IDLEMESSAGE)向父窗口發(fā)送一個WM_SETMESSAGESTRING消息就可以了,需要注意的是,使用消息WM_SETMESSAGESTRING時必須包含它的定義文件"afxpriv.h",否則程序會報告編譯錯誤。

上述CprogStatusBar類實現(xiàn)了狀態(tài)欄中包含進度條控件,該類的使用方法很簡單,首先在應(yīng)用程序的CmainFrame類中用CProgStatusBar代替CStatusBar聲明實例,然后在任何想要顯示進度控制指示的地方調(diào)用CProgStatusBar::OnProgress。本例中定義了一個消息MYWM_PROGRESS,它將進度條當(dāng)前的進度作為WPARAM參數(shù)傳遞到CProgStatusBar::OnProgress()函數(shù)。

經(jīng)過上述處理,想要使用進度指示的任何對象都可以通過發(fā)送一個消息到主框架來調(diào)用狀態(tài)欄進行進度條的顯示。例如,在例子程序中,文檔的Serialize()函數(shù)在加載文本文件時,利用Sleep()函數(shù)仿真耗時加載,每隔150毫秒報告一次進度狀態(tài)。如果你不想從文檔發(fā)送Windows消息,可以用MFC的視圖更新機制來做。你可以發(fā)明一個"暗示"代碼以及一個小結(jié)構(gòu)來保存進度百分比數(shù)據(jù),并通過向框架發(fā)送MYWM_PROGRESS消息調(diào)用暗示信息。這是從文檔到視圖/框架傳遞進度控制信息的最省事的方式。

二、編程步驟

1、 啟動Visual C++6.0,生成一個單文檔應(yīng)用程序prgsbar,項目的視圖類的基類選擇CEdit類;

2、 在程序的Resource.h文件中添加自定義消息的定義:

#define MYWM_PROGRESS (WM_USER+1)

3、 在程序的主框架窗口CMainFrame類的頭文件中聲明MYWM_PROGRESS的消息響應(yīng)函數(shù)afx_msg LRESULTOnProgress(WPARAM wp, LPARAM lp),在該類的實現(xiàn)中添加消息映射ON_MESSAGE(MYWM_PROGRESS,OnProgress);

4、 將CMainFrame類中的工具條對象改為CProgStatusBar m_wndStatusBar;

5、 重載CPrgsbarDoc::Serialize(CArchive&ar)函數(shù),用來處理讀取文件時的進度條仿真;

6、 添加代碼,編譯運行程序。

三、程序代碼

////////////////////////////////////////////CprogStatusBar類的頭文件;
// Status bar with progress control.
class CProgStatusBar : public CStatusBar {
public:
CProgStatusBar();
virtual~CProgStatusBar();
CProgressCtrl&GetProgressCtrl() {
return m_wndProgBar;
}
void OnProgress(UINTpct);
protected:
CProgressCtrlm_wndProgBar; // the progress bar
afx_msg intOnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSize(UINTnType, int cx, int cy);
DECLARE_MESSAGE_MAP()
DECLARE_DYNAMIC(CProgStatusBar)
};
/////////////////////////////////////////////////////////////////////////////CprogStatusBar類的實現(xiàn)文件;
#include "StdAfx.h"
#include "ProgBar.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNAMIC(CProgStatusBar, CStatusBar)
BEGIN_MESSAGE_MAP(CProgStatusBar, CStatusBar)
ON_WM_CREATE()
ON_WM_SIZE()
END_MESSAGE_MAP()
////////////////////////////////////////////////////////////////
CProgStatusBar::CProgStatusBar()
{}
CProgStatusBar::~CProgStatusBar()
{}
////////////////////////////////////////創(chuàng)建狀態(tài)條時也創(chuàng)建進程條
int CProgStatusBar::OnCreate(LPCREATESTRUCT lpcs)
{
lpcs->style |=WS_CLIPCHILDREN;
VERIFY(CStatusBar::OnCreate(lpcs)==0);
VERIFY(m_wndProgBar.Create(WS_CHILD,CRect(), this, 1));
m_wndProgBar.SetRange(0,100);//設(shè)置進程條的范圍;
return 0;
}
////////////////////////////////////////////////////使進程度條的尺寸與狀態(tài)條的尺寸同步變化;
void CProgStatusBar::OnSize(UINT nType, int cx, int cy)
{
CStatusBar::OnSize(nType,cx, cy);
CRect rc;
GetItemRect(0,&rc);
m_wndProgBar.MoveWindow(&rc,FALSE);
}
////////////////////////////////////////////////////////////根據(jù)pct的當(dāng)前值對進程條進行設(shè)置
void CProgStatusBar::OnProgress(UINT pct)
{
CProgressCtrl& pc= m_wndProgBar;
DWORD dwOldStyle =pc.GetStyle();
DWORD dwNewStyle =dwOldStyle;
if (pct>0) //如果pct>0,將顯示進度條
dwNewStyle |= WS_VISIBLE;
else //否則隱藏進度條;
dwNewStyle &=~WS_VISIBLE;
if (dwNewStyle !=dwOldStyle) {
SetWindowText(NULL);//顯示進度條前清空狀態(tài)條;
SetWindowLong(pc.m_hWnd,GWL_STYLE, dwNewStyle);
//設(shè)置進度條處于顯示狀態(tài);
}
// 設(shè)置進度條的當(dāng)前位置;
pc.SetPos(pct);
if (pct==0)
// 如果pct等于0,通知主框架窗口顯示空閑信息;
GetParent()->PostMessage(WM_SETMESSAGESTRING,AFX_IDS_IDLEMESSAGE);
}
/////////////////////////////////////////////////////////////////////////文檔裝載處理函數(shù);
voidCPrgsbarDoc::Serialize(CArchive& ar)
{
CWnd* pFrame =AfxGetMainWnd();
if (!ar.IsStoring()){
for (int pct=10;pct<=100; pct+=10) {//對文檔裝載進行仿真處理;
Sleep(150);
if (pFrame)
pFrame->SendMessage(MYWM_PROGRESS,pct);
}
}
if (pFrame)
pFrame->SendMessage(MYWM_PROGRESS,0);
((CEditView*)m_viewList.GetHead())->SerializeRaw(ar);//顯示文本文件的內(nèi)容;
}


四、小結(jié)

本例雖然是介紹的如何在狀態(tài)條中包含進度條,但是讀者朋友們可以從中受到啟發(fā),開拓思路,將該思想應(yīng)用到類似的應(yīng)用當(dāng)中去,例如在狀態(tài)條中實現(xiàn)顯示圖像等。


位圖進度條

圖一 例子效果

玩過破天的朋友知道,游戲更新時進度是用位圖表示的,我覺的挺漂亮的,于是自己動手做了一個類來實現(xiàn)那種效果。

這個類的名字叫CBmpProgCtrl,繼承于CStatic,使用方法如下。

1、首先要將BmpProgCtrl.h和BmpProgCtrl.cpp添加到工程中。

2、導(dǎo)入兩幅位圖,作為前景和背景。資源標(biāo)識分別為IDB_FORE和IDB_BACK.

3、在對話框上,放置一個"Static Text"控件,修改其ID,只要不是默認(rèn)的IDC_STATIC就可以了。

4、讓這個控件和一個Control類型的變量關(guān)聯(lián),如變量名可以叫m_bmpprog。

5、找到該變量定義的地方,應(yīng)該是CStatic m_bmpprog,修改CStatic為CBmpProgCtrl。并將頭文件BmpProgCtrl.h包含進來。

6、調(diào)用該類的方法。

類成員方法介紹

void GetRange(int &lower,int&upper)返回進度條范圍。
int GetPos()獲得當(dāng)前位置
int StepIt( )以當(dāng)前步長使進度條增長
int SetStep( int nStep )設(shè)置步長
int SetPos( int nPos )設(shè)置位置
void SetRange( int nLower, int nUpper )設(shè)置進度條范圍。

具體的可以看源代碼。你可以修改它以符合自己的需要。你可能覺的這些方法很熟悉,是的,我參考了CProgressCtrl的方法名。

結(jié)束語

這個東西,比較簡單,你可以很容易就使用。


一條語句改變進度條顏色及去掉進度條邊框  

      改變進度條顏色 

在VC里想改變進度條顏色,在網(wǎng)上找了很多方法,都很麻煩,覺得很郁悶。后來想起在用VB做時,增經(jīng)用API實現(xiàn)過,很簡單。后來再一查,原來是SendMessage這個函數(shù),幾經(jīng)試驗,終于成功,高興,與大家分享!?。?!

      代碼如下:    

      m_Progress1.SendMessage(PBM_SETBKCOLOR, 0, #0000ff);//背景色為藍色

m_Progress1.SendMessage(PBM_SETBARCOLOR, 0,#ff0000);//前景色為紅色

 

      至于別的控件能不能按這種辦法來改變顏色,我還沒試過,大家可以試一試,如果可以,請留言告訴我,先謝謝了 。

以下摘自《新編win32API大全》:

函數(shù)功能:該函數(shù)將指定的消息發(fā)送到一個或多個窗口。此函數(shù)為指定的窗口調(diào)用窗口程序,直到窗口程序處理完消息再返回。而函數(shù)PostMessage不同,將一個消息寄送到一個線程的消息隊列后立即返回。

    函數(shù)原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);

    參數(shù):

    hWnd:其窗口程序?qū)⒔邮障⒌拇翱诘木浔?。如果此參?shù)為HWND_BROADCAST,則消息將被發(fā)送到系統(tǒng)中所有頂層窗口,包括無效或不可見的非自身擁有的窗口、被覆蓋的窗口和彈出式窗口,但消息不被發(fā)送到子窗口。

    Msg:指定被發(fā)送的消息。

    wParam:指定附加的消息指定信息。

    IParam:指定附加的消息指定信息。

    返回值:返回值指定消息處理的結(jié)果,依賴于所發(fā)送的消息。

    備注:需要用HWND_BROADCAST通信的應(yīng)用程序應(yīng)當(dāng)使用函數(shù)RegisterWindowMessage來為應(yīng)用程序間的通信取得一個唯一的消息。

    如果指定的窗口是由調(diào)用線程創(chuàng)建的,則窗口程序立即作為子程序調(diào)用。如果指定的窗口是由不同線程創(chuàng)建的,則系統(tǒng)切換到該線程并調(diào)用恰當(dāng)?shù)拇翱诔绦?。線程間的消息只有在線程執(zhí)行消息檢索代碼時才被處理。發(fā)送線程被阻塞直到接收線程處理完消息為止。

    Windows CE:Windows CE不支持Windows桌面平臺支持的所有消息。使用SendMesssge之前,要檢查發(fā)送的消息是否被支持。

    速查:Windows NT:3.1及以上版本:Windows:95及以上版本;Windows CE:1.0及以上版本;頭文件:winuser.h;輸入庫:user32.lib;Unicode:在Windows NT環(huán)境下以Unicode和ANSI方式實現(xiàn)。

以下摘自MSDN:

RGB(red, green, blue)

Arguments

red

Required. Number in the range0-255 representing the red component of the color.

green

Required. Number in the range0-255 representing the green component of the color.

blue

Required. Number in the range0-255 representing the blue component of the color.

 

二、        去掉進度條邊框

m_Progress1.ModifyStyleEx(WS_EX_STATICEDGE,0);

m_Progress.Invalidate(false);

 



轉(zhuǎn)可以設(shè)置刻度的進度條

現(xiàn)在做的軟件上要用圖形來顯示串口傳過來的信號值大小,最簡單的辦法,莫過于用進度條顯示了。但是在使用的過程中發(fā)現(xiàn)一個問題,就是沒有刻度。如果有美工,問題也好解決,在沒有美工的情況下,只好靠自己動手DIY了。

      由于以前沒有做過控件,就在網(wǎng)上找了別人做的拿來參考,于是,就發(fā)現(xiàn)了顏色漸變進度條的代碼。這個代碼嚴(yán)格說來并不完全,進度條只能橫著不能豎起來。在讀懂了顏色漸變進度條后,我做出了帶刻度的進度條控件。目前,我做的這個控件有以下功能:

 ?。薄⒃O(shè)置前景色

 ?。?、設(shè)置背景色

 ?。?、設(shè)置有無刻度,刻度位置,刻度數(shù)量

 ?。?、設(shè)置進度條有無邊框

 ?。?、設(shè)置文字顯示

  頭文件如下:

#if!defined(AFX_GRADIENTPROGRESSCTRL_H__91ECB8BC_A7DA_42EB_B2C5_37419D31B753__INCLUDED_)
#define AFX_GRADIENTPROGRESSCTRL_H__91ECB8BC_A7DA_42EB_B2C5_37419D31B753__INCLUDED_
#endif

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#if!defined(AFX_MEMDC_H__A68B97E6_DDB4_4B4F_8A18_429844C3659C__INCLUDED_)
#define AFX_MEMDC_H__A68B97E6_DDB4_4B4F_8A18_429844C3659C__INCLUDED_
#endif

class CMemDC : public CDC 
{
public:
 CMemDC(CDC* pDC);
 CMemDC* operator->(){return this;}
 operator CMemDC*(){return this;}
 virtual ~CMemDC();
private:
 CBitmap m_bitmap;
 CBitmap* m_pOldBitmap;
 CDC* m_pDC;
 CRect m_rect;
 BOOL m_bMemDC;
};


/////////////////////////////////////////////////////////////////////////////
// CScaleProgressCtrl window

class CScaleProgressCtrl : publicCProgressCtrl
{
// Construction
public:
 CScaleProgressCtrl();

 //Set_function
 void SetTextColor(COLORREF color) {m_clrText=color;}   //設(shè)置文字顏色,默認(rèn)為
 void SetBkColor(COLORREF color)  {m_clrBkGround=color;} //設(shè)置進度條背景色
 void SetForeColor(COLORREFcolor) {m_FaceColor=color;}    //設(shè)置進度條前景色
 void SetShowFrame(BOOLframe)          {m_Frame=frame;}    //設(shè)置是否顯示進度條邊框
 //void SetEndColor(COLORREF color) {m_clrEnd=color;}
 //Percent TXT showed in the Progress
 void SetShowPercent(BOOLbShowPercent=TRUE) {m_bShowPercent=bShowPercent;}   //是否顯示文字
 
 //Get_Function
 COLORREF GetTextColor(void)  {returnm_clrText;}   
 COLORREF GetBkColor(void)  {return m_clrBkGround;}
 COLORREF GetFaceColor(void) {return m_FaceColor;}
 


// Attributes
public:
 int m_nLower;   //setrange的最小值
 int m_nUpper;   //setrange的最大值
 int m_nStep;    //步長
 int m_nCurrentPosition;  //setpos的值
 COLORREF m_FaceColor,m_clrBkGround,m_clrText;  //前景色,背景色,文字顏色的變量
 BOOL  m_bShowPercent;       //是否顯示文字的變量

 BOOL       m_ScaleLine;    //有無刻度
 int        m_Side;         //刻度的方向,如0表示左邊或上邊有刻度,1表示右邊或下邊有刻度,3表示兩邊都有
 int         m_ScaleNumber; //刻度的數(shù)量
 BOOL       m_Frame;        //有無邊框
// Operations
public:

// Overrides
 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(CScaleProgressCtrl)
 //}}AFX_VIRTUAL

// Implementation
public:
 int SetPos(int nPos);
 void SetShowScale(BOOL Scaleline,int side,intscalenumber);    //Scaleline是是否有刻度線,false為無刻度,true為有刻度                                                         
                                                           //side代表刻度的位置,當(dāng)豎著時,0表示左邊有刻度,1表示右邊有刻度,3表示兩邊都有
                 //當(dāng)水平時,0表示上邊有刻度,1表示下邊有刻度,3表示兩邊都有
                                                               //scalenumber表示刻度數(shù)量,直從3~setrange的最大值

 int  SetStep(intnStep);          //設(shè)置步長
 void SetRange(int nLower,int nUpper);
 virtual ~CScaleProgressCtrl();

 // Generated message mapfunctions
protected:
 void DrawGradient(CPaintDC *pDC, RECT& rectClient,const int &nMaxWidth);   //水平時進度條的繪制
 void DrawEndUp(CPaintDC *pDC, RECT& rectClient,const int &maxHigh);        //豎直時進度條的繪制
 //{{AFX_MSG(CScaleProgressCtrl)
 afx_msg BOOL OnEraseBkgnd(CDC* pDC);
 afx_msg void OnPaint();
 //}}AFX_MSG

 DECLARE_MESSAGE_MAP()

public:
 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
public:
 virtual BOOL Create(DWORD dwStyle, const RECT& rect, CWnd*pParentWnd, UINT nID);
public:
 virtual BOOL CreateEx(DWORD dwExStyle, DWORD dwStyle, const RECT&rect, CWnd* pParentWnd, UINT nID);
protected:
 virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
 virtual void PreSubclassWindow();
};

  

 

  ?。悖穑鹞募缦拢?/p>

// ScaleProgressCtrl.cpp :implementation file
//

#include "stdafx.h"
#include "ScaleProgressCtrl.h"
#include "assert.h"
//#include "MemDC.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMemDC::CMemDC(CDC* pDC):CDC()
{

 ASSERT(pDC!=NULL);

 m_pDC=pDC;
 m_pOldBitmap=NULL;
 m_bMemDC=!pDC->IsPrinting();
 //
 if(m_bMemDC)
 {
  pDC->GetClipBox(&m_rect);
  CreateCompatibleDC(pDC);
  m_bitmap.CreateCompatibleBitmap(pDC,m_rect.Width(),m_rect.Height());
  m_pOldBitmap=SelectObject(&m_bitmap);
  SetWindowOrg(m_rect.left,m_rect.top);
 }
 else  //為相關(guān)的現(xiàn)有設(shè)備準(zhǔn)備打印
 {
  m_bPrinting=pDC->m_bPrinting;
  m_hDC=pDC->m_hDC;
  m_hAttribDC=pDC->m_hAttribDC;
 }

}

CMemDC::~CMemDC()
{
 if(m_bMemDC)
 {
  m_pDC->BitBlt(m_rect.left,m_rect.top,m_rect.Width(),m_rect.Height(),
   this,m_rect.left,m_rect.top,SRCCOPY);
  SelectObject(m_pOldBitmap);
 }
 else
 {
  m_hDC=m_hAttribDC=NULL;
 }

}


/////////////////////////////////////////////////////////////////////////////
// CScaleProgressCtrl

CScaleProgressCtrl::CScaleProgressCtrl()
{
 m_nLower=0;    //setrange最小值
 m_nUpper=100;  //setrange最大值
 m_nCurrentPosition=0;  //setpos的值
 m_nStep=10;           //setstep的值
 m_ScaleLine=false;     //默認(rèn)無刻度
 m_ScaleNumber=10;      //默認(rèn)10個刻度線
 m_Side=0;             //默認(rèn)水平時上邊有刻度或豎直時左邊有刻度
 m_Frame=true;         //默認(rèn)無邊框

 //Initial Color of show
 m_FaceColor= COLORREF(#0000ff); 
 //m_clrEnd= COLORREF(#ff0000);
 m_clrBkGround=::GetSysColor(COLOR_3DFACE);
 m_clrText=#ffffff;   //默認(rèn)文字顏色為白色
 //Not show Word
 m_bShowPercent=FALSE;
}

CScaleProgressCtrl::~CScaleProgressCtrl()
{
}


BEGIN_MESSAGE_MAP(CScaleProgressCtrl, CProgressCtrl)
 //{{AFX_MSG_MAP(CScaleProgressCtrl)
 ON_WM_ERASEBKGND()
 ON_WM_PAINT()
 //}}AFX_MSG_MAP
 ON_WM_CREATE()
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CScaleProgressCtrl message handlers

voidCScaleProgressCtrl::SetRange(int nLower,int nUpper)
{
 //This Function is to Set Range of the progress
 m_nLower=nLower;
 m_nUpper=nUpper;
 m_nCurrentPosition=nLower;
 
 CProgressCtrl::SetRange(nLower,nUpper);
}

intCScaleProgressCtrl::SetStep(int nStep)
{
 m_nStep=nStep;
 return (CProgressCtrl::SetStep(nStep));
}

BOOLCScaleProgressCtrl::OnEraseBkgnd(CDC* pDC)
{
 // TODO: Add your message handler code here and/or call default
 
 return TRUE;//CProgressCtrl::OnEraseBkgnd(pDC);
}
void CScaleProgressCtrl::DrawEndUp(CPaintDC *pDC,  RECT &rectClient,const int &maxHigh)
{
 RECT rectFill;  //顯示區(qū)域
 float fStep;   //每一步的幅長
 CBrush brush;   //顯示的顏色畫刷

 CMemDC memDC(pDC);
 CRect a1,b1;
 if(m_ScaleLine==TRUE)
 {
  if(m_Side==0)
   rectClient.left+=5;
  if(m_Side==1)
   rectClient.right-=5;
  if(m_Side==2)
  {
   rectClient.left+=5;
   rectClient.right-=5;
  }  
  a1.top=rectClient.top;
  a1.right=rectClient.left;
  a1.bottom=rectClient.bottom;
  a1.left=rectClient.left-5;
  
  b1.top=rectClient.top;
  b1.right=rectClient.right+5;
  b1.bottom=rectClient.bottom;
  b1.left=rectClient.right;
 } 
 int  nSteps=abs(m_nUpper-m_nLower);   
 fStep=(float)(abs(rectClient.top-rectClient.bottom))/(float)(m_nUpper-m_nLower);
 
 
 //使用背景色填充客戶區(qū)域
 ::SetRect(&rectFill,
  //以下為填充矩形區(qū)域的左上角x,y和右下角x,y
      rectClient.left,       //左上X 
      rectClient.top,
      rectClient.right,  //右下X
      rectClient.bottom);     //右下Y
 VERIFY(brush.CreateSolidBrush(m_clrBkGround));    
 memDC.FillRect(&rectFill,&brush); //填充背景色
 VERIFY(brush.DeleteObject());
 if(m_ScaleLine==TRUE)
 {
  COLORREF colorside;
  colorside=::GetSysColor(COLOR_3DFACE);
  VERIFY(brush.CreateSolidBrush(colorside));
  memDC.FillRect(&a1,&brush);
  memDC.FillRect(&b1,&brush);
  VERIFY(brush.DeleteObject());
 }
 
 //繪制進程條
 //if(rectFill.bottom>=maxHigh)
 //{
  ::SetRect(&rectFill,rectFill.left,rectClient.bottom-m_nCurrentPosition*fStep,rectClient.right,rectClient.bottom);   
  VERIFY(brush.CreateSolidBrush(m_FaceColor));
  memDC.FillRect(&rectFill,&brush);
  VERIFY(brush.DeleteObject());
  if(m_ScaleLine==TRUE)
  {
   COLORREF colorside;
     colorside=::GetSysColor(COLOR_3DFACE);   
   VERIFY(brush.CreateSolidBrush(colorside));
   memDC.FillRect(&a1,&brush);
   memDC.FillRect(&b1,&brush);
   VERIFY(brush.DeleteObject());
  
   int m_step;
   m_step=(rectClient.bottom-rectClient.top-1)/m_ScaleNumber; //這里不-1可能會有一個刻度繪不上最下邊的或最右邊的
   
   int temp=abs(rectClient.top-rectClient.bottom);
   for(inty=rectClient.bottom-1;y>=0;y-=m_step)    //繪制刻度線
   { 
    if(m_Side==0)
    {           
     memDC.MoveTo(0,y);
     memDC.LineTo(5,y);     
    }
    if(m_Side==1)
    {
     memDC.MoveTo(rectClient.right,y);
     memDC.LineTo(rectClient.right+5,y);      
    }
    if(m_Side==2)
    {
     memDC.MoveTo(0,y);
     memDC.LineTo(5,y);
     memDC.MoveTo(rectClient.right,y);
     memDC.LineTo(rectClient.right+5,y);
    }
   }    
  //}
  return;
 }
 
}
void CScaleProgressCtrl::DrawGradient(CPaintDC *pDC,  RECT&rectClient, const int &nMaxWidth)
{
 RECT rectFill;  //顯示區(qū)域
 float fStep;   //每一步的幅長
 CBrush brush;   //顯示的顏色畫刷
 CMemDC memDC(pDC);
 CRect a1,b1;
 if(m_ScaleLine==TRUE)
 {
  if(m_Side==0)
   rectClient.top+=5;
  if(m_Side==1)
   rectClient.bottom-=5;
  if(m_Side==2)
  {
   rectClient.top+=5;
   rectClient.bottom-=5;
  }  
  a1.top=rectClient.top-5;
  a1.left=rectClient.left;
  a1.bottom=rectClient.top;
  a1.right=rectClient.right;
  
  b1.top=rectClient.bottom;
  b1.right=rectClient.right;
  b1.bottom=rectClient.bottom+5;
  b1.left=rectClient.left;
 } 
 int  nSteps=abs(m_nUpper-m_nLower);   //總步數(shù) 
 fStep=(float)(abs(rectClient.right-rectClient.left))/(float)(m_nUpper-m_nLower); //每步的坐標(biāo)數(shù)
 
 //使用背景色填充客戶區(qū)域 
 ::SetRect(&rectFill,
  //以下為填充矩形區(qū)域的左上角x,y和右下角x,y
      rectClient.left,       //左上X 
      rectClient.top,        //左上Y
      rectClient.right,      //右下X
      rectClient.bottom);    //右下Y
 VERIFY(brush.CreateSolidBrush(m_clrBkGround));    
 memDC.FillRect(&rectFill,&brush); //填充背景色
 VERIFY(brush.DeleteObject());
 if(m_ScaleLine==TRUE)
 {
  COLORREF colorside;
  colorside=::GetSysColor(COLOR_3DFACE);
  VERIFY(brush.CreateSolidBrush(colorside));
  memDC.FillRect(&a1,&brush);
  memDC.FillRect(&b1,&brush);
  VERIFY(brush.DeleteObject());
 }
 
 
 //繪制進程條
 if(rectFill.right>=nMaxWidth)
 {
  ::SetRect(&rectFill,rectFill.left,rectClient.top,rectClient.left+m_nCurrentPosition*fStep,rectClient.bottom);   
  VERIFY(brush.CreateSolidBrush(m_FaceColor));
  memDC.FillRect(&rectFill,&brush);
  VERIFY(brush.DeleteObject());
  if(m_ScaleLine==TRUE)
  {
   COLORREF colorside;
     colorside=::GetSysColor(COLOR_3DFACE);   
   VERIFY(brush.CreateSolidBrush(colorside));
   memDC.FillRect(&a1,&brush);
   memDC.FillRect(&b1,&brush);
   VERIFY(brush.DeleteObject());
  
   int m_step;
   m_step=(rectClient.right-rectClient.left-1)/m_ScaleNumber; //刻度的步長
   int temp=abs(rectClient.right-rectClient.left);
   for(int x=0;x<=temp;x+=m_step)   //繪制刻度線
   { 
    if(m_Side==0)
    {           
     memDC.MoveTo(x,0);
     memDC.LineTo(x,5);     
    }
    if(m_Side==1)
    {
     memDC.MoveTo(x,rectClient.bottom);
     memDC.LineTo(x,rectClient.bottom+5);     
    }
    if(m_Side==2)
    {
     memDC.MoveTo(x,0);
     memDC.LineTo(x,5);
     memDC.MoveTo(x,rectClient.bottom);
     memDC.LineTo(x,rectClient.bottom+5);     
    }
   }    
  }
  return;
 }
}


void CScaleProgressCtrl::OnPaint()
{
 if(!m_Frame)
 {
  this->ModifyStyleEx(WS_EX_STATICEDGE,0);
  this->Invalidate(false); //這兩句是去掉Progress的邊框并顯示
 }
 DWORD y=this->GetStyle();
 y=y&4;
 CPaintDC dc(this); // device context for painting
 CRect rectClient;
 GetClientRect(rectClient);

 floatmaxWidth((float)m_nCurrentPosition/(float)m_nUpper*(float)rectClient.right);
 floatmaxHigh((float)m_nCurrentPosition/(float)m_nUpper*(float)rectClient.bottom);
 //繪制
 
  if(y==4)
  DrawEndUp(&dc,rectClient,(int)maxHigh);
 if(y==0)
  DrawGradient(&dc,rectClient,(int)maxWidth);
 //顯示進程條進度文字
 if(m_bShowPercent) 
 {
  CString percent;
  percent.Format("%d%%",(int)(100*(float)m_nCurrentPosition/m_nUpper)); //顯示當(dāng)前值的百分比  
  dc.SetTextColor(m_clrText);
  dc.SetBkMode(TRANSPARENT);
  dc.DrawText(percent,&rectClient,DT_VCENTER|DT_CENTER|DT_SINGLELINE);
 }
 
 // Do not call CProgressCtrl::OnPaint() for painting messages
}

intCScaleProgressCtrl::SetPos(int nPos)
{
 //Set the Position of the Progress
 m_nCurrentPosition=nPos;
 return (CProgressCtrl::SetPos(nPos));
}

intCScaleProgressCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CProgressCtrl::OnCreate(lpCreateStruct) == -1)
  return -1;

 // TODO:  在此添加您專用的創(chuàng)建代碼

 return 0;
}

BOOLCScaleProgressCtrl::Create(DWORD dwStyle, const RECT& rect, CWnd*pParentWnd, UINT nID)
{
 // TODO: 在此添加專用代碼和/或調(diào)用基類

 returnCProgressCtrl::Create(dwStyle, rect, pParentWnd, nID);
}

BOOLCScaleProgressCtrl::CreateEx(DWORD dwExStyle, DWORD dwStyle, const RECT&rect, CWnd* pParentWnd, UINT nID)
{
 // TODO: 在此添加專用代碼和/或調(diào)用基類

 returnCProgressCtrl::CreateEx(dwExStyle, dwStyle, rect, pParentWnd, nID);
}

BOOLCScaleProgressCtrl::PreCreateWindow(CREATESTRUCT& cs)
{
 // TODO: 在此添加專用代碼和/或調(diào)用基類

 returnCProgressCtrl::PreCreateWindow(cs);
}

voidCScaleProgressCtrl::PreSubclassWindow()
{
 // TODO: 在此添加專用代碼和/或調(diào)用基類

 CProgressCtrl::PreSubclassWindow();
}
void CScaleProgressCtrl::SetShowScale(BOOL scaleline,int side,int scalenumber)
{
 assert(scaleline==0||scaleline==1);
 m_ScaleLine=scaleline;
 assert(scalenumber>2 && scalenumber<m_nUpper);
 m_ScaleNumber=scalenumber;
 assert(side<3 && side>=0);
 m_Side=side;
 return;
}




Trackback:http://tb.donews.net/TrackBack.aspx?PostId=1254501

 


本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
基于2440wince系統(tǒng)畫曲線的類的詳解
mfc中背景圖片隨著窗口大小的改變而改變
防止畫圖時背景的擦除?(傳說中的雙緩沖)(轉(zhuǎn)載)
VC防止窗口和控件閃爍的方法
vc編程如何實現(xiàn)'十字線隨光標(biāo)移動'
VC的內(nèi)存繪圖防止屏幕閃爍技術(shù)的實現(xiàn)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服