4980 lines
236 KiB
C++
4980 lines
236 KiB
C++
|
|
/******************************************************************************/
|
||
|
|
/* NAME : SkinProgress.cpp */
|
||
|
|
/* PURPOSE : Place a bitmapped progress bar into the status bar */
|
||
|
|
/* CREATED_BY : Kochise (kochise@caramail.com) */
|
||
|
|
/* CREATION_DATE : $C_DATE=YYYY/MM/DD$ 22003/05/02 */
|
||
|
|
/* MODIFIED_BY : Kochise (kochise@caramail.com) */
|
||
|
|
/* MODIFICATION_DATE : $M_DATE=YYYY/MM/DD$ 2003/07/12 */
|
||
|
|
/* LANGUAGE : MFC Visual C++ 6 */
|
||
|
|
/* MPROC_TYPE : Microsoft Windows compatible computer */
|
||
|
|
/* */
|
||
|
|
/*
|
||
|
|
$Log: E:\Projects\NoeZooArc\SkinProgressTest.zoo\SkinProgressTest\SkinProgress.cpp.adiff $
|
||
|
|
*
|
||
|
|
* Rev 1.02 : July 12 2003 14:01:53 (Kochise)
|
||
|
|
* Base : CSkinProgress 1.32dev
|
||
|
|
* extracting files : no error
|
||
|
|
* parsing files : no error
|
||
|
|
* diff engine : no error
|
||
|
|
* modify.public.constructor:CSkinProgress
|
||
|
|
* touch.protected.function:CreateCommon
|
||
|
|
* modify.protected.function:ProgressInStatusBar
|
||
|
|
* modify.protected.function:ProgressInDialog
|
||
|
|
* modify.public.function:SetRange
|
||
|
|
* touch.public.function:SetPos
|
||
|
|
* modify.public.function:GetPos
|
||
|
|
* touch.public.function:SetStart
|
||
|
|
* modify.public.function:GetStart
|
||
|
|
* modify.public.function:Reset
|
||
|
|
* add.public.function:SetProgress
|
||
|
|
* add.public.function:GetProgress
|
||
|
|
* modify.public.function:RefreshPanes
|
||
|
|
* touch.protected.function:CompactText
|
||
|
|
* modify.protected.function:GetTimed
|
||
|
|
* modify.protected.function:UpdateProgress
|
||
|
|
* modify.protected.function:OnPaint
|
||
|
|
* compiling project files : no error
|
||
|
|
* packing files : no error
|
||
|
|
* http://www.codeproject.com/miscctrl/CSkinProgress.asp
|
||
|
|
*
|
||
|
|
* Rev 1.01 : July 06 2003 22:08:37 (Kochise)
|
||
|
|
* Base : CSkinProgress 1.28 Devel
|
||
|
|
* extracting files : no error
|
||
|
|
* parsing files : no error
|
||
|
|
* diff engine : no error
|
||
|
|
* modify.public.constructor:CSkinProgress
|
||
|
|
* add.public.constructor:CSkinProgress
|
||
|
|
* modify.public.function:SetBitmap
|
||
|
|
* modify.public.function:ConvBitmap
|
||
|
|
* modify.public.function:SetRange
|
||
|
|
* modify.public.function:SetPos
|
||
|
|
* modify.public.function:OffsetPos
|
||
|
|
* modify.public.function:StepIt
|
||
|
|
* modify.public.function:SetSize
|
||
|
|
* add.public.function:GetSize
|
||
|
|
* add.public.function:GetPos
|
||
|
|
* add.public.function:GetStep
|
||
|
|
* add.public.function:GetLower
|
||
|
|
* add.public.function:GetUpper
|
||
|
|
* add.public.function:SetStart
|
||
|
|
* add.public.function:GetStart
|
||
|
|
* add.public.function:Reset
|
||
|
|
* modify.public.function:SetText
|
||
|
|
* mutate.function:protected.ResizeTextPane->public.RefreshPanes
|
||
|
|
* modify.public.function:RefreshPanes
|
||
|
|
* mutate.function:public.Clear->protected.Clear
|
||
|
|
* add.protected.function:GetTargetRect
|
||
|
|
* mutate.protected.function:Create->CreateCommon
|
||
|
|
* modify.protected.function:CreateCommon
|
||
|
|
* add.protected.function:ProgressInStatusBar
|
||
|
|
* add.protected.function:ProgressInDialog
|
||
|
|
* modify.protected.function:CompactText
|
||
|
|
* add.protected.function:UpdateProgress
|
||
|
|
* modify.protected.function:OnPaint
|
||
|
|
* compiling project files : no error
|
||
|
|
* packing files : no error
|
||
|
|
* http://www.codeproject.com/miscctrl/CSkinProgress.asp
|
||
|
|
*
|
||
|
|
* Rev 1.00 : May 25 2003 13:25:12 (Kochise)
|
||
|
|
* First archived version and released onto CodeProject.
|
||
|
|
* Base : CSkinProgress 1.12 Devel
|
||
|
|
* add.public.constructor:CSkinProgress
|
||
|
|
* add.public.constructor:CSkinProgress
|
||
|
|
* add.public.function:SetRange
|
||
|
|
* add.public.function:SetText
|
||
|
|
* add.public.function:SetSize
|
||
|
|
* add.public.function:SetBitmap
|
||
|
|
* add.public.function:CopyBitmap
|
||
|
|
* add.public.function:ConvBitmap
|
||
|
|
* add.public.function:SetPos
|
||
|
|
* add.public.function:OffsetPos
|
||
|
|
* add.public.function:SetStep
|
||
|
|
* add.public.function:StepIt
|
||
|
|
* add.public.function:Clear
|
||
|
|
* add.public.destructor:~CSkinProgress
|
||
|
|
* add.protected.function:Create
|
||
|
|
* add.protected.function:GetStatusBar
|
||
|
|
* add.protected.function:ResizeTextPane
|
||
|
|
* add.protected.function:CompactText
|
||
|
|
* add.protected.function:GetTimed
|
||
|
|
* add.protected.function:OnEraseBkgnd
|
||
|
|
* add.protected.function:OnPaint
|
||
|
|
* add.protected.function:OnSizing
|
||
|
|
* add.protected.function:OnSize
|
||
|
|
* add.protected.function:OnTimer
|
||
|
|
* compiling project files : no error
|
||
|
|
* packing files : no error
|
||
|
|
* http://www.codeproject.com/useritems/CSkinProgress.asp
|
||
|
|
*
|
||
|
|
*/
|
||
|
|
/******************************************************************************/
|
||
|
|
|
||
|
|
// SkinProgress.cpp : implementation file
|
||
|
|
//
|
||
|
|
|
||
|
|
#include "stdafx.h"
|
||
|
|
#include "SkinProgress.h"
|
||
|
|
|
||
|
|
#ifdef _DEBUG
|
||
|
|
#define new DEBUG_NEW
|
||
|
|
#undef THIS_FILE
|
||
|
|
static char THIS_FILE[] = __FILE__;
|
||
|
|
#endif
|
||
|
|
|
||
|
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
// CSkinProgress
|
||
|
|
|
||
|
|
// g_Global : g_ = Global
|
||
|
|
// i_Input : i_ = Input
|
||
|
|
// no z...
|
||
|
|
// m_Member : m_ = Member
|
||
|
|
// o_Output : o_ = Output
|
||
|
|
// ... : use your imagination
|
||
|
|
|
||
|
|
// aArray : a = Array (array)
|
||
|
|
// bBool : b = Boolean (boolean, true/false)
|
||
|
|
// cConstant : c = Constant (constant, whatever...)
|
||
|
|
// dDefine : d = Define (simple define or defined value)
|
||
|
|
// nNumber : n = Number (char, long, int, whatever...)
|
||
|
|
// oObject : o = Object (C++ class)
|
||
|
|
// pPointer : p = Pointer (typicaly a 32 bits ulong address)
|
||
|
|
// sStruct : s = Struct (structure)
|
||
|
|
// uUnion : u = Union (join two or more values of the same size under a common name)
|
||
|
|
|
||
|
|
// poRemoteClass : po = Pointer on Object
|
||
|
|
// cdConstantDef : cd = Constant Define, typicaly a constant defined value
|
||
|
|
// usUnionStruct : us = Union of Structures
|
||
|
|
// ... : use your imagination
|
||
|
|
|
||
|
|
// o_psBitmap : CBitmap::GetBitmap((BITMAP*) o_psBitmap); // s = BITMAP, p = *, o_ means it's an output
|
||
|
|
|
||
|
|
// <Value>
|
||
|
|
// [Function]
|
||
|
|
|
||
|
|
// TYPICAL LIFE TIME
|
||
|
|
//
|
||
|
|
// CSkinProgress(...) -------> StepIt() ----------------------------> ~CSkinProgress() USER
|
||
|
|
// | | | SIDE
|
||
|
|
// ..|...........................|.......................................|.........................
|
||
|
|
// | | |
|
||
|
|
// '-> Create(...) | '-> Clear() OBJECT
|
||
|
|
// | | SIDE
|
||
|
|
// +-> GetStatusBar() |
|
||
|
|
// +-> SetRange(...) |
|
||
|
|
// +-> SetBitmap(...) '----------->
|
||
|
|
// '---------------------------------> RefreshPanes() --------,
|
||
|
|
// ,---------------------------------> | |
|
||
|
|
// | ,-> | |
|
||
|
|
// | | | |
|
||
|
|
// | | +-> GetStatusBar() |
|
||
|
|
// | | +-> GetTimed(...) |
|
||
|
|
// | | '-> CompactText(...) |
|
||
|
|
// ........|...............................|..........................|............................
|
||
|
|
// | | | WINDOWS
|
||
|
|
// OnSizing(...) -> OnSize(...) OnEraseBkgnd(...) '-> OnPaint() SIDE
|
||
|
|
|
||
|
|
#ifndef dCSP_RESOURCE_BITMAP
|
||
|
|
/*** anAQUA_BITMAP ************************************************************/
|
||
|
|
/* Purpose : The default embedded progress bar image, if resource bitmap not */
|
||
|
|
/* used instead. */
|
||
|
|
/* Unit : unsigned char */
|
||
|
|
/* Range : [0-255] - LIMITED selection */
|
||
|
|
/* List : None */
|
||
|
|
/* Example : None */
|
||
|
|
/******************************************************************************/
|
||
|
|
unsigned char anAQUA_BITMAP[5760] =
|
||
|
|
{ // B, G, R, A -> Set to 0xFF for CAlphaBlendBitmap
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xAC, 0x9C, 0x9B, 0xFF, 0x9F, 0x60, 0x5A, 0xFF, 0x9E, 0x38, 0x2B, 0xFF,
|
||
|
|
0xA2, 0x22, 0x00, 0xFF, 0xAA, 0x22, 0x00, 0xFF, 0xAB, 0x2B, 0x00, 0xFF, 0xAB, 0x2B, 0x00, 0xFF,
|
||
|
|
0xB1, 0x33, 0x00, 0xFF, 0xB1, 0x33, 0x00, 0xFF, 0xB1, 0x33, 0x00, 0xFF, 0xB1, 0x33, 0x00, 0xFF,
|
||
|
|
0xB1, 0x33, 0x00, 0xFF, 0xB1, 0x33, 0x00, 0xFF, 0xB1, 0x33, 0x00, 0xFF, 0xB1, 0x33, 0x00, 0xFF,
|
||
|
|
0xB1, 0x33, 0x00, 0xFF, 0xB1, 0x33, 0x00, 0xFF, 0xB1, 0x33, 0x00, 0xFF, 0xB1, 0x33, 0x00, 0xFF,
|
||
|
|
0xB1, 0x33, 0x00, 0xFF, 0xB1, 0x33, 0x00, 0xFF, 0xB1, 0x33, 0x00, 0xFF, 0xB1, 0x33, 0x00, 0xFF,
|
||
|
|
0xB1, 0x33, 0x00, 0xFF, 0xB1, 0x33, 0x00, 0xFF, 0xB1, 0x33, 0x00, 0xFF, 0xB1, 0x33, 0x00, 0xFF,
|
||
|
|
0xAB, 0x2B, 0x00, 0xFF, 0xB1, 0x33, 0x00, 0xFF, 0xAB, 0x38, 0x00, 0xFF, 0xA4, 0x46, 0x27, 0xFF,
|
||
|
|
0x9E, 0x65, 0x54, 0xFF, 0x99, 0x89, 0x86, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF,
|
||
|
|
0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF,
|
||
|
|
0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF,
|
||
|
|
0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF,
|
||
|
|
0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF,
|
||
|
|
0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xA9, 0x8A, 0x86, 0xFF, 0x9F, 0x40, 0x2E, 0xFF,
|
||
|
|
0xA5, 0x1C, 0x00, 0xFF, 0xB1, 0x2E, 0x00, 0xFF, 0xC8, 0x6D, 0x42, 0xFF, 0xD8, 0x91, 0x67, 0xFF,
|
||
|
|
0xDB, 0x9D, 0x76, 0xFF, 0xDD, 0xA2, 0x75, 0xFF, 0xDD, 0xA2, 0x75, 0xFF, 0xDD, 0xA2, 0x75, 0xFF,
|
||
|
|
0xDD, 0xA2, 0x75, 0xFF, 0xDD, 0xA2, 0x75, 0xFF, 0xDD, 0xA2, 0x75, 0xFF, 0xDD, 0xA2, 0x75, 0xFF,
|
||
|
|
0xDD, 0xA2, 0x75, 0xFF, 0xDD, 0xA2, 0x75, 0xFF, 0xDD, 0xA2, 0x75, 0xFF, 0xDD, 0xA2, 0x75, 0xFF,
|
||
|
|
0xDD, 0xA2, 0x75, 0xFF, 0xDD, 0xA2, 0x75, 0xFF, 0xDD, 0xA2, 0x75, 0xFF, 0xDD, 0xA2, 0x75, 0xFF,
|
||
|
|
0xDD, 0xA2, 0x75, 0xFF, 0xDD, 0xA2, 0x75, 0xFF, 0xDD, 0xA2, 0x75, 0xFF, 0xDD, 0xA2, 0x75, 0xFF,
|
||
|
|
0xDD, 0xA2, 0x75, 0xFF, 0xDD, 0xA2, 0x75, 0xFF, 0xDB, 0x9D, 0x76, 0xFF, 0xD9, 0x94, 0x6D, 0xFF,
|
||
|
|
0xC8, 0x6D, 0x42, 0xFF, 0xB1, 0x33, 0x00, 0xFF, 0xA5, 0x1C, 0x00, 0xFF, 0x97, 0x3D, 0x22, 0xFF,
|
||
|
|
0x8E, 0x6F, 0x6B, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF,
|
||
|
|
0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF,
|
||
|
|
0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF,
|
||
|
|
0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF,
|
||
|
|
0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF,
|
||
|
|
0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF,
|
||
|
|
0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF,
|
||
|
|
0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF,
|
||
|
|
0xC3, 0xC3, 0xC3, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xB4, 0xA5, 0xA2, 0xFF,
|
||
|
|
0xA1, 0x46, 0x2E, 0xFF, 0xAB, 0x2B, 0x00, 0xFF, 0xAF, 0x33, 0x00, 0xFF, 0xCE, 0x76, 0x42, 0xFF,
|
||
|
|
0xE0, 0xAB, 0x81, 0xFF, 0xE5, 0xB5, 0x89, 0xFF, 0xE7, 0xBC, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF,
|
||
|
|
0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF,
|
||
|
|
0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF,
|
||
|
|
0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF,
|
||
|
|
0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF,
|
||
|
|
0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF,
|
||
|
|
0xE7, 0xBC, 0x95, 0xFF, 0xE5, 0xB5, 0x89, 0xFF, 0xE3, 0xAF, 0x88, 0xFF, 0xD0, 0x7F, 0x4C, 0xFF,
|
||
|
|
0xB1, 0x33, 0x00, 0xFF, 0xAB, 0x2B, 0x00, 0xFF, 0x97, 0x3D, 0x22, 0xFF, 0x88, 0x78, 0x76, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xA6, 0x6E, 0x5A, 0xFF, 0xAF, 0x33, 0x00, 0xFF, 0xB8, 0x3D, 0x00, 0xFF,
|
||
|
|
0xBB, 0x45, 0x00, 0xFF, 0xD4, 0x87, 0x44, 0xFF, 0xE4, 0xAD, 0x7B, 0xFF, 0xE5, 0xB3, 0x84, 0xFF,
|
||
|
|
0xE5, 0xB5, 0x89, 0xFF, 0xE6, 0xB8, 0x8C, 0xFF, 0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF,
|
||
|
|
0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF,
|
||
|
|
0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF,
|
||
|
|
0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF,
|
||
|
|
0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF,
|
||
|
|
0xE9, 0xBD, 0x95, 0xFF, 0xE9, 0xBD, 0x95, 0xFF, 0xE6, 0xB8, 0x8C, 0xFF, 0xE5, 0xB3, 0x84, 0xFF,
|
||
|
|
0xE4, 0xAD, 0x7B, 0xFF, 0xD8, 0x8E, 0x4E, 0xFF, 0xBB, 0x45, 0x00, 0xFF, 0xB8, 0x3D, 0x00, 0xFF,
|
||
|
|
0xB1, 0x33, 0x00, 0xFF, 0x89, 0x50, 0x3D, 0xFF, 0x99, 0x99, 0x99, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF,
|
||
|
|
0xCD, 0xCD, 0xCD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF, 0xA6, 0x50, 0x27, 0xFF,
|
||
|
|
0xBB, 0x45, 0x00, 0xFF, 0xBF, 0x4E, 0x00, 0xFF, 0xC1, 0x54, 0x00, 0xFF, 0xD4, 0x7A, 0x2E, 0xFF,
|
||
|
|
0xE1, 0xA2, 0x6A, 0xFF, 0xE5, 0xAC, 0x77, 0xFF, 0xE7, 0xB1, 0x7F, 0xFF, 0xE9, 0xB4, 0x85, 0xFF,
|
||
|
|
0xE9, 0xB6, 0x88, 0xFF, 0xE9, 0xB6, 0x88, 0xFF, 0xE9, 0xB6, 0x88, 0xFF, 0xE9, 0xB6, 0x88, 0xFF,
|
||
|
|
0xE9, 0xB6, 0x88, 0xFF, 0xE9, 0xB6, 0x88, 0xFF, 0xE9, 0xB6, 0x88, 0xFF, 0xE9, 0xB6, 0x88, 0xFF,
|
||
|
|
0xE9, 0xB6, 0x88, 0xFF, 0xE9, 0xB6, 0x88, 0xFF, 0xE9, 0xB6, 0x88, 0xFF, 0xE9, 0xB6, 0x88, 0xFF,
|
||
|
|
0xE9, 0xB6, 0x88, 0xFF, 0xE9, 0xB6, 0x88, 0xFF, 0xE9, 0xB6, 0x88, 0xFF, 0xE9, 0xB6, 0x88, 0xFF,
|
||
|
|
0xE9, 0xB6, 0x88, 0xFF, 0xE9, 0xB6, 0x88, 0xFF, 0xE9, 0xB6, 0x88, 0xFF, 0xE9, 0xB6, 0x88, 0xFF,
|
||
|
|
0xE5, 0xB3, 0x84, 0xFF, 0xE4, 0xAD, 0x7B, 0xFF, 0xE1, 0xA6, 0x72, 0xFF, 0xD4, 0x80, 0x38, 0xFF,
|
||
|
|
0xC1, 0x54, 0x00, 0xFF, 0xBF, 0x4E, 0x00, 0xFF, 0xBB, 0x45, 0x00, 0xFF, 0x9B, 0x46, 0x1C, 0xFF,
|
||
|
|
0x82, 0x82, 0x82, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xB6, 0x4C, 0x00, 0xFF, 0xC1, 0x54, 0x00, 0xFF, 0xC5, 0x5C, 0x00, 0xFF,
|
||
|
|
0xCA, 0x63, 0x15, 0xFF, 0xD4, 0x73, 0x22, 0xFF, 0xD9, 0x7D, 0x2E, 0xFF, 0xDA, 0x84, 0x3B, 0xFF,
|
||
|
|
0xDF, 0x8A, 0x42, 0xFF, 0xE0, 0x8D, 0x48, 0xFF, 0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF,
|
||
|
|
0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF,
|
||
|
|
0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF,
|
||
|
|
0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF,
|
||
|
|
0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF,
|
||
|
|
0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF, 0xE0, 0x8D, 0x48, 0xFF, 0xDA, 0x84, 0x3B, 0xFF,
|
||
|
|
0xD4, 0x7A, 0x2E, 0xFF, 0xCE, 0x6F, 0x22, 0xFF, 0xC5, 0x61, 0x15, 0xFF, 0xC5, 0x5C, 0x00, 0xFF,
|
||
|
|
0xB8, 0x55, 0x00, 0xFF, 0xB6, 0x4C, 0x00, 0xFF, 0x73, 0x73, 0x73, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xD5, 0xD5, 0xD5, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xB6, 0x4C, 0x00, 0xFF,
|
||
|
|
0xC1, 0x54, 0x00, 0xFF, 0xC5, 0x5C, 0x00, 0xFF, 0xCA, 0x63, 0x15, 0xFF, 0xD4, 0x73, 0x22, 0xFF,
|
||
|
|
0xD9, 0x7D, 0x2E, 0xFF, 0xDA, 0x84, 0x3B, 0xFF, 0xDF, 0x8A, 0x42, 0xFF, 0xE0, 0x8D, 0x48, 0xFF,
|
||
|
|
0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF,
|
||
|
|
0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF,
|
||
|
|
0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF,
|
||
|
|
0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF,
|
||
|
|
0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF, 0xE5, 0x94, 0x4D, 0xFF,
|
||
|
|
0xE0, 0x8D, 0x48, 0xFF, 0xDA, 0x84, 0x3B, 0xFF, 0xD4, 0x7A, 0x2E, 0xFF, 0xCE, 0x6F, 0x22, 0xFF,
|
||
|
|
0xC5, 0x61, 0x15, 0xFF, 0xC5, 0x5C, 0x00, 0xFF, 0xB8, 0x55, 0x00, 0xFF, 0xB6, 0x4C, 0x00, 0xFF,
|
||
|
|
0x73, 0x73, 0x73, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xB5, 0xB5, 0xB5, 0xFF, 0xB8, 0x55, 0x00, 0xFF, 0xC3, 0x5F, 0x15, 0xFF, 0xCC, 0x6A, 0x1C, 0xFF,
|
||
|
|
0xD4, 0x73, 0x22, 0xFF, 0xDE, 0x82, 0x35, 0xFF, 0xE3, 0x8C, 0x42, 0xFF, 0xEA, 0x96, 0x4D, 0xFF,
|
||
|
|
0xEB, 0x9B, 0x55, 0xFF, 0xED, 0x9E, 0x59, 0xFF, 0xF2, 0xA6, 0x61, 0xFF, 0xF2, 0xA6, 0x61, 0xFF,
|
||
|
|
0xF2, 0xA6, 0x61, 0xFF, 0xF2, 0xA6, 0x61, 0xFF, 0xF2, 0xA6, 0x61, 0xFF, 0xF2, 0xA6, 0x61, 0xFF,
|
||
|
|
0xF2, 0xA6, 0x61, 0xFF, 0xF2, 0xA6, 0x61, 0xFF, 0xF2, 0xA6, 0x61, 0xFF, 0xF2, 0xA6, 0x61, 0xFF,
|
||
|
|
0xF2, 0xA6, 0x61, 0xFF, 0xF2, 0xA6, 0x61, 0xFF, 0xF2, 0xA6, 0x61, 0xFF, 0xF2, 0xA6, 0x61, 0xFF,
|
||
|
|
0xF2, 0xA6, 0x61, 0xFF, 0xF2, 0xA6, 0x61, 0xFF, 0xF2, 0xA6, 0x61, 0xFF, 0xF2, 0xA6, 0x61, 0xFF,
|
||
|
|
0xF2, 0xA6, 0x61, 0xFF, 0xF2, 0xA6, 0x61, 0xFF, 0xED, 0x9E, 0x59, 0xFF, 0xE5, 0x94, 0x4D, 0xFF,
|
||
|
|
0xDF, 0x8A, 0x42, 0xFF, 0xD4, 0x7C, 0x33, 0xFF, 0xCE, 0x72, 0x22, 0xFF, 0xCC, 0x6A, 0x1C, 0xFF,
|
||
|
|
0xC3, 0x5F, 0x15, 0xFF, 0xB4, 0x54, 0x00, 0xFF, 0x67, 0x67, 0x67, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF,
|
||
|
|
0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0xA9, 0x62, 0x2B, 0xFF,
|
||
|
|
0xCC, 0x6A, 0x1C, 0xFF, 0xD4, 0x73, 0x22, 0xFF, 0xDA, 0x7F, 0x35, 0xFF, 0xE4, 0x90, 0x46, 0xFF,
|
||
|
|
0xF1, 0x9D, 0x54, 0xFF, 0xF8, 0xA7, 0x60, 0xFF, 0xFB, 0xAC, 0x66, 0xFF, 0xFE, 0xB2, 0x6D, 0xFF,
|
||
|
|
0xFE, 0xB5, 0x74, 0xFF, 0xFE, 0xB5, 0x74, 0xFF, 0xFE, 0xB5, 0x74, 0xFF, 0xFE, 0xB5, 0x74, 0xFF,
|
||
|
|
0xFE, 0xB5, 0x74, 0xFF, 0xFE, 0xB5, 0x74, 0xFF, 0xFE, 0xB5, 0x74, 0xFF, 0xFE, 0xB5, 0x74, 0xFF,
|
||
|
|
0xFE, 0xB5, 0x74, 0xFF, 0xFE, 0xB5, 0x74, 0xFF, 0xFE, 0xB5, 0x74, 0xFF, 0xFE, 0xB5, 0x74, 0xFF,
|
||
|
|
0xFE, 0xB5, 0x74, 0xFF, 0xFE, 0xB5, 0x74, 0xFF, 0xFE, 0xB5, 0x74, 0xFF, 0xFE, 0xB5, 0x74, 0xFF,
|
||
|
|
0xFE, 0xB5, 0x74, 0xFF, 0xFE, 0xB5, 0x74, 0xFF, 0xFE, 0xB5, 0x74, 0xFF, 0xFE, 0xB5, 0x74, 0xFF,
|
||
|
|
0xFA, 0xAF, 0x6E, 0xFF, 0xEE, 0xA2, 0x5D, 0xFF, 0xE9, 0x96, 0x50, 0xFF, 0xDF, 0x8A, 0x42, 0xFF,
|
||
|
|
0xD4, 0x7C, 0x33, 0xFF, 0xCE, 0x72, 0x22, 0xFF, 0xC7, 0x69, 0x1C, 0xFF, 0xA0, 0x59, 0x22, 0xFF,
|
||
|
|
0x69, 0x69, 0x69, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xC3, 0xC3, 0xC3, 0xFF, 0x9C, 0x73, 0x50, 0xFF, 0xCE, 0x72, 0x22, 0xFF, 0xD4, 0x7C, 0x33, 0xFF,
|
||
|
|
0xE1, 0x89, 0x3D, 0xFF, 0xF1, 0x9D, 0x54, 0xFF, 0xFB, 0xAC, 0x66, 0xFF, 0xFE, 0xB2, 0x6D, 0xFF,
|
||
|
|
0xFF, 0xBC, 0x74, 0xFF, 0xFF, 0xC4, 0x7C, 0xFF, 0xFF, 0xC7, 0x84, 0xFF, 0xFF, 0xC7, 0x84, 0xFF,
|
||
|
|
0xFF, 0xC7, 0x84, 0xFF, 0xFF, 0xC7, 0x84, 0xFF, 0xFF, 0xC7, 0x84, 0xFF, 0xFF, 0xC7, 0x84, 0xFF,
|
||
|
|
0xFF, 0xC7, 0x84, 0xFF, 0xFF, 0xC7, 0x84, 0xFF, 0xFF, 0xC7, 0x84, 0xFF, 0xFF, 0xC7, 0x84, 0xFF,
|
||
|
|
0xFF, 0xC7, 0x84, 0xFF, 0xFF, 0xC7, 0x84, 0xFF, 0xFF, 0xC7, 0x84, 0xFF, 0xFF, 0xC7, 0x84, 0xFF,
|
||
|
|
0xFF, 0xC7, 0x84, 0xFF, 0xFF, 0xC7, 0x84, 0xFF, 0xFF, 0xC7, 0x84, 0xFF, 0xFF, 0xC7, 0x84, 0xFF,
|
||
|
|
0xFF, 0xC7, 0x84, 0xFF, 0xFF, 0xC7, 0x84, 0xFF, 0xFF, 0xC4, 0x7C, 0xFF, 0xFE, 0xB2, 0x6D, 0xFF,
|
||
|
|
0xF5, 0xA5, 0x5E, 0xFF, 0xEA, 0x96, 0x4D, 0xFF, 0xDA, 0x84, 0x3B, 0xFF, 0xD4, 0x7C, 0x33, 0xFF,
|
||
|
|
0xCE, 0x72, 0x22, 0xFF, 0x83, 0x5A, 0x38, 0xFF, 0x82, 0x82, 0x82, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0x9B, 0x91, 0x88, 0xFF,
|
||
|
|
0xA3, 0x6A, 0x3B, 0xFF, 0xD4, 0x80, 0x38, 0xFF, 0xE4, 0x90, 0x46, 0xFF, 0xFB, 0xA6, 0x5A, 0xFF,
|
||
|
|
0xFF, 0xB8, 0x6E, 0xFF, 0xFF, 0xC4, 0x7C, 0xFF, 0xFF, 0xD0, 0x87, 0xFF, 0xFF, 0xCD, 0x8D, 0xFF,
|
||
|
|
0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF,
|
||
|
|
0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF,
|
||
|
|
0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF,
|
||
|
|
0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF,
|
||
|
|
0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF,
|
||
|
|
0xFF, 0xCD, 0x8D, 0xFF, 0xFF, 0xC4, 0x7C, 0xFF, 0xFE, 0xB2, 0x6D, 0xFF, 0xF1, 0xA0, 0x57, 0xFF,
|
||
|
|
0xE3, 0x8C, 0x42, 0xFF, 0xD4, 0x80, 0x38, 0xFF, 0x9E, 0x63, 0x33, 0xFF, 0x66, 0x5C, 0x54, 0xFF,
|
||
|
|
0xA5, 0xA5, 0xA5, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF,
|
||
|
|
0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF,
|
||
|
|
0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF,
|
||
|
|
0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF,
|
||
|
|
0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF, 0x8E, 0x7B, 0x6D, 0xFF, 0xA8, 0x6F, 0x40, 0xFF,
|
||
|
|
0xE4, 0x90, 0x46, 0xFF, 0xF9, 0xA8, 0x5F, 0xFF, 0xFF, 0xBC, 0x74, 0xFF, 0xFF, 0xCC, 0x82, 0xFF,
|
||
|
|
0xFF, 0xD5, 0x8C, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xE6, 0x9F, 0xFF, 0xFF, 0xE6, 0x9F, 0xFF,
|
||
|
|
0xFF, 0xE6, 0x9F, 0xFF, 0xFF, 0xE6, 0x9F, 0xFF, 0xFF, 0xE6, 0x9F, 0xFF, 0xFF, 0xE6, 0x9F, 0xFF,
|
||
|
|
0xFF, 0xE6, 0x9F, 0xFF, 0xFF, 0xE6, 0x9F, 0xFF, 0xFF, 0xE6, 0x9F, 0xFF, 0xFF, 0xE6, 0x9F, 0xFF,
|
||
|
|
0xFF, 0xE6, 0x9F, 0xFF, 0xFF, 0xE6, 0x9F, 0xFF, 0xFF, 0xE6, 0x9F, 0xFF, 0xFF, 0xE6, 0x9F, 0xFF,
|
||
|
|
0xFF, 0xE6, 0x9F, 0xFF, 0xFF, 0xE6, 0x9F, 0xFF, 0xFF, 0xE6, 0x9F, 0xFF, 0xFF, 0xE6, 0x9F, 0xFF,
|
||
|
|
0xFF, 0xE6, 0x9F, 0xFF, 0xFF, 0xE6, 0x9F, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xCC, 0x82, 0xFF,
|
||
|
|
0xFF, 0xBC, 0x74, 0xFF, 0xF5, 0xA5, 0x5E, 0xFF, 0xE4, 0x90, 0x46, 0xFF, 0xA3, 0x6A, 0x3B, 0xFF,
|
||
|
|
0x70, 0x5D, 0x4E, 0xFF, 0x7F, 0x7F, 0x7F, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF,
|
||
|
|
0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF,
|
||
|
|
0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF,
|
||
|
|
0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF,
|
||
|
|
0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF,
|
||
|
|
0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF,
|
||
|
|
0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF,
|
||
|
|
0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF,
|
||
|
|
0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF,
|
||
|
|
0xAC, 0xAC, 0xAC, 0xFF, 0x85, 0x7C, 0x74, 0xFF, 0x8C, 0x6A, 0x4C, 0xFF, 0xB8, 0x80, 0x50, 0xFF,
|
||
|
|
0xEC, 0xA3, 0x66, 0xFF, 0xFF, 0xBD, 0x7A, 0xFF, 0xFF, 0xC7, 0x84, 0xFF, 0xFF, 0xCD, 0x8D, 0xFF,
|
||
|
|
0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF,
|
||
|
|
0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF,
|
||
|
|
0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF,
|
||
|
|
0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF,
|
||
|
|
0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF, 0xFF, 0xDE, 0x97, 0xFF,
|
||
|
|
0xFF, 0xD5, 0x8C, 0xFF, 0xFF, 0xC4, 0x7C, 0xFF, 0xEC, 0xA3, 0x66, 0xFF, 0xB8, 0x80, 0x50, 0xFF,
|
||
|
|
0x85, 0x63, 0x44, 0xFF, 0x6A, 0x60, 0x59, 0xFF, 0x7F, 0x7F, 0x7F, 0xFF, 0xC3, 0xC3, 0xC3, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xB5, 0xB5, 0xB5, 0xFF,
|
||
|
|
0x91, 0x91, 0x91, 0xFF, 0x7F, 0x7F, 0x7F, 0xFF, 0x7F, 0x7F, 0x7F, 0xFF, 0x69, 0x69, 0x69, 0xFF,
|
||
|
|
0x67, 0x67, 0x67, 0xFF, 0x5C, 0x5C, 0x5C, 0xFF, 0x5C, 0x5C, 0x5C, 0xFF, 0x5C, 0x5C, 0x5C, 0xFF,
|
||
|
|
0x5C, 0x5C, 0x5C, 0xFF, 0x5C, 0x5C, 0x5C, 0xFF, 0x5C, 0x5C, 0x5C, 0xFF, 0x5C, 0x5C, 0x5C, 0xFF,
|
||
|
|
0x5C, 0x5C, 0x5C, 0xFF, 0x5C, 0x5C, 0x5C, 0xFF, 0x5C, 0x5C, 0x5C, 0xFF, 0x5C, 0x5C, 0x5C, 0xFF,
|
||
|
|
0x5C, 0x5C, 0x5C, 0xFF, 0x5C, 0x5C, 0x5C, 0xFF, 0x5C, 0x5C, 0x5C, 0xFF, 0x5C, 0x5C, 0x5C, 0xFF,
|
||
|
|
0x5C, 0x5C, 0x5C, 0xFF, 0x5C, 0x5C, 0x5C, 0xFF, 0x5C, 0x5C, 0x5C, 0xFF, 0x5C, 0x5C, 0x5C, 0xFF,
|
||
|
|
0x5C, 0x5C, 0x5C, 0xFF, 0x5C, 0x5C, 0x5C, 0xFF, 0x5C, 0x5C, 0x5C, 0xFF, 0x5C, 0x5C, 0x5C, 0xFF,
|
||
|
|
0x67, 0x67, 0x67, 0xFF, 0x69, 0x69, 0x69, 0xFF, 0x73, 0x73, 0x73, 0xFF, 0x91, 0x91, 0x91, 0xFF,
|
||
|
|
0xC3, 0xC3, 0xC3, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF,
|
||
|
|
0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xCD, 0xCD, 0xCD, 0xFF, 0xBD, 0xBD, 0xBD, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xB5, 0xB5, 0xB5, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF,
|
||
|
|
0xAC, 0xAC, 0xAC, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF,
|
||
|
|
0xAC, 0xAC, 0xAC, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF,
|
||
|
|
0xAC, 0xAC, 0xAC, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF,
|
||
|
|
0xAC, 0xAC, 0xAC, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF,
|
||
|
|
0xAC, 0xAC, 0xAC, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF,
|
||
|
|
0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xA5, 0xA5, 0xA5, 0xFF, 0xAC, 0xAC, 0xAC, 0xFF,
|
||
|
|
0xBD, 0xBD, 0xBD, 0xFF, 0xD5, 0xD5, 0xD5, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF,
|
||
|
|
};
|
||
|
|
|
||
|
|
/*** sAQUA_BITMAP *************************************************************/
|
||
|
|
/* Purpose : anAQUA_BITMAP's image header for CBitmap::CreateBitmapIndirect */
|
||
|
|
/* Unit : BITMAP */
|
||
|
|
/* Range : structure list */
|
||
|
|
/* List : 0 - int bmType : bitmap type (0) */
|
||
|
|
/* 1 - int bmWidth : width in pixels (>0) */
|
||
|
|
/* 2 - int bmHeight : height in pixels (>0) */
|
||
|
|
/* 3 - int bmWidthBytes ; number of bytes per line (%2) */
|
||
|
|
/* 4 - unsigned char bmPlanes ; number of color planes */
|
||
|
|
/* 5 - unsigned char bmBitsPixel : number of bits per pixel */
|
||
|
|
/* 6 - unsigned char* bmBits : pointer to an array of shorts */
|
||
|
|
/* Example : None */
|
||
|
|
/* WARNING : I said SHORT for <bmBits> because the number of bytes must be */
|
||
|
|
/* divible by 2 ! But in facts, it can be bytes, longs, whatever, */
|
||
|
|
/* as long as the size of the array remains divisible by 2... */
|
||
|
|
/******************************************************************************/
|
||
|
|
BITMAP sAQUA_BITMAP =
|
||
|
|
{
|
||
|
|
0, // bmType
|
||
|
|
90, // bmWidth
|
||
|
|
16, // bmHeight
|
||
|
|
360, // bmWidthBytes
|
||
|
|
1, // bmPlanes
|
||
|
|
32, // bmBitsPixel
|
||
|
|
anAQUA_BITMAP // bmBits
|
||
|
|
};
|
||
|
|
#endif // dCSP_RESOURCE_BITMAP
|
||
|
|
|
||
|
|
/*** anThreeDots **************************************************************/
|
||
|
|
/* Purpose : dots for reduced string */
|
||
|
|
/* Unit : char */
|
||
|
|
/* Range : [0-127] - LIMITED selection */
|
||
|
|
/* List : None */
|
||
|
|
/* Example : None */
|
||
|
|
/******************************************************************************/
|
||
|
|
const TCHAR anThreeDots[] = _T("...");
|
||
|
|
|
||
|
|
// *** CONSTRUCTORS ***
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : CSkinProgress */
|
||
|
|
/* Role : Default constructor for status bar usage */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* None */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* None */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : Sets the default values to */
|
||
|
|
/* i_poStrMessage = "Work in progress..." */
|
||
|
|
/* i_nUpper = 100 - from 0 to 100 */
|
||
|
|
/* i_nProgress = cSPT_PERCENT - DISPLAY PERCENT */
|
||
|
|
/* i_nPane = 0 - Share the text pane */
|
||
|
|
/* i_nSize = 200 - 200 pixels FORCED WIDTH */
|
||
|
|
/* i_poBitmap = NULL - USE EMBEDDED BITMAP */
|
||
|
|
/* <> i_bReverse = false - normal display */
|
||
|
|
/* Behavior : A - Create the progress bar using default parameters */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC CSkinProgress */
|
||
|
|
/* */
|
||
|
|
/* A..... Create a status progress bar with "Work in progress..." as text */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
CSkinProgress::CSkinProgress
|
||
|
|
( // Default constructor
|
||
|
|
)
|
||
|
|
{
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// Process
|
||
|
|
|
||
|
|
// A..... Create a default progress bar in Status Bar with "Work in progress..." as text
|
||
|
|
ProgressInStatusBar(_T("Work in progress"));
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : CSkinProgress */
|
||
|
|
/* Role : Default constructor with parameters for status bar usage */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (pointer to value, direct value) */
|
||
|
|
/* None */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* i_poStrMessage : The text message to display in pane 0 */
|
||
|
|
/* i_nUpper : Upper limit to reach 100% (0 at 0%) */
|
||
|
|
/* i_nProgress : Progress completion message type */
|
||
|
|
/* i_nPane : Pane number for the progress bar */
|
||
|
|
/* i_nSize : Progress bar width in pixel IF pane 0 */
|
||
|
|
/* i_poBitmap : Replacement progress bar bitmap */
|
||
|
|
/* <> i_bReverse : Reverse display of the progress bar */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : At least, <i_poStrMessage> must be provided */
|
||
|
|
/* Behavior : A - Create the progress bar using user's parameters */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC CSkinProgress */
|
||
|
|
/* */
|
||
|
|
/* A..... Create the progress bar using user's parameters */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
CSkinProgress::CSkinProgress
|
||
|
|
( // Default constructor with parameters for status bar usage
|
||
|
|
LPCTSTR i_poStrMessage, // Text to display
|
||
|
|
int i_nUpper, // = 100 : Default range from 0 to i_nUpper
|
||
|
|
int i_nProgress, // = cSPT_PERCENT : Message type to add to the text
|
||
|
|
int i_nPane, // = 0 : Pane number in which display the progress bar
|
||
|
|
int i_nSize, // = 200 : Size of the progress bar if in pane 0
|
||
|
|
CBitmap* i_poBitmap // = NULL : Pointer to a user bitmap
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
,BOOL i_bReverse // = false : Reverse display of the progress bar
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
)
|
||
|
|
{
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// Process
|
||
|
|
|
||
|
|
// A..... Create the progress bar using user's parameters
|
||
|
|
ProgressInStatusBar
|
||
|
|
(
|
||
|
|
i_poStrMessage,
|
||
|
|
i_nUpper,
|
||
|
|
i_nProgress,
|
||
|
|
i_nPane,
|
||
|
|
i_nSize,
|
||
|
|
i_poBitmap
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
,i_bReverse
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : CSkinProgress */
|
||
|
|
/* Role : Default constructor with parameters for dialog usage */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* None */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* i_poWndProgress : The CWnd where to display the progress */
|
||
|
|
/* i_nUpper : Upper limit to reach 100% (0 at 0%) */
|
||
|
|
/* i_poBitmap : Replacement progress bar bitmap */
|
||
|
|
/* <> i_bReverse : Reverse display of the progress bar */
|
||
|
|
/* i_poWndMessage : The CWnd where to display the text */
|
||
|
|
/* i_poStrMessage : The text message to display */
|
||
|
|
/* i_nProgress : Progress completion message type */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : At least, <i_poStrMessage> must be provided */
|
||
|
|
/* Behavior : A - Create the dialog progress bar using user's parameters */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC CSkinProgress */
|
||
|
|
/* */
|
||
|
|
/* A..... Create the dialog progress bar using user's parameters */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* The most simple dialog CSkinProgress constructor : */
|
||
|
|
/* CSkinProgress oCspBar(&oCStatic); // Use 100 as upper limit */
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
#ifdef dCSP_DIALOG_PROGRESS
|
||
|
|
CSkinProgress::CSkinProgress
|
||
|
|
( // Default constructor with parameters for dialog usage
|
||
|
|
CWnd* i_poWndProgress, // Pointer to the anchor CWnd to use for the progress bar
|
||
|
|
int i_nUpper, // = 100, : Default range from 0 to i_nUpper
|
||
|
|
CBitmap* i_poBitmap, // = NULL : Pointer to a user bitmap
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
BOOL i_bReverse, // = false, : Reverse display of the progress bar
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
CWnd* i_poWndMessage, // = NULL, : Pointer to the anchor CWnd to use for the text pane
|
||
|
|
LPCTSTR i_poStrMessage, // = NULL : Text to display,
|
||
|
|
int i_nProgress // = cSPT_NONE : Message type to add to the text
|
||
|
|
)
|
||
|
|
{
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// Process
|
||
|
|
|
||
|
|
// A..... Create the progress bar using user's parameters
|
||
|
|
ProgressInDialog
|
||
|
|
(
|
||
|
|
i_poWndProgress,
|
||
|
|
i_nUpper,
|
||
|
|
i_poBitmap,
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
i_bReverse,
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
i_poWndMessage,
|
||
|
|
i_poStrMessage,
|
||
|
|
i_nProgress
|
||
|
|
);
|
||
|
|
}
|
||
|
|
#endif // dCSP_DIALOG_PROGRESS
|
||
|
|
|
||
|
|
// *** INITIALIZATORS ***
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : CreateCommon */
|
||
|
|
/* Role : Initialize the progress with its basic parameters */
|
||
|
|
/* Type : PROTECTED */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* BOOL = false : Error during progress bar creation */
|
||
|
|
/* true : Progress bar created */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* i_poStrMessage : The text message to display in pane 0 */
|
||
|
|
/* i_nUpper : Upper limit to reach 100% (0 at 0%) */
|
||
|
|
/* i_nProgress : Progress completion message type */
|
||
|
|
/* i_poBitmap : Replacement progress bar bitmap */
|
||
|
|
/* <> i_bReverse : Reverse display of the progress bar */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : Base of progress bar is fixed to 0, must use */
|
||
|
|
/* [SetRange(...)] to change it... */
|
||
|
|
/* Behavior : A - Set base values */
|
||
|
|
/* B - Set the bitmap */
|
||
|
|
/* C - Set the progress bar values */
|
||
|
|
/* D - Get the creation date and time of the progress bar */
|
||
|
|
/* E - Set the refresh timer */
|
||
|
|
/* F - Resize the text and display the whole things */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC CreateCommon */
|
||
|
|
/* */
|
||
|
|
/* A..... Set base values */
|
||
|
|
/* B..... Set the bitmap */
|
||
|
|
/* C..... Set the progress bar values */
|
||
|
|
/* D..... Get the creation date and time of the progress bar */
|
||
|
|
/* E..... Set the refresh timer to 500 milliseconds */
|
||
|
|
/* F..... Resize the text and display the whole things */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
BOOL CSkinProgress::CreateCommon
|
||
|
|
(
|
||
|
|
LPCTSTR i_poStrMessage,
|
||
|
|
int i_nUpper, // = 100
|
||
|
|
int i_nProgress, // = cSPT_PERCENT
|
||
|
|
CBitmap* i_poBitmap // = NULL
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
,BOOL i_bReverse // = false
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
)
|
||
|
|
{
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// A..... Set base values
|
||
|
|
m_poBaseBmp = NULL;
|
||
|
|
m_poCompatibleBmp = NULL;
|
||
|
|
m_poStretchBmp = NULL;
|
||
|
|
m_poProgressBmp = NULL;
|
||
|
|
m_oStrPrevMessage = "";
|
||
|
|
m_oRectPane.SetRect(0, 0, 0, 0);
|
||
|
|
|
||
|
|
// Process + Return
|
||
|
|
|
||
|
|
// B..... Set the bitmap
|
||
|
|
if(
|
||
|
|
!SetBitmap
|
||
|
|
(
|
||
|
|
i_poBitmap
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
,false
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
)
|
||
|
|
)
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
// C..... Set the progress bar values
|
||
|
|
// Set the progress text type
|
||
|
|
m_nProgressText = i_nProgress;
|
||
|
|
|
||
|
|
// Set range and step
|
||
|
|
m_nLower = 0; // Set first parameters for the resampling
|
||
|
|
ASSERT(i_nUpper > 0); // m_nLower is 0, m_nUpper CANNOT BE BEFORE m_nLower quite now
|
||
|
|
m_nUpper = i_nUpper;
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
m_nLeft = 0;
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
m_nRight = 0;
|
||
|
|
|
||
|
|
SetRange
|
||
|
|
(
|
||
|
|
0,
|
||
|
|
i_nUpper,
|
||
|
|
1,
|
||
|
|
false
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
,false // Don't resample range, and avoid display there !
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
);
|
||
|
|
|
||
|
|
// Set and save additional values
|
||
|
|
m_oStrMessage = i_poStrMessage;
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
m_bReverse = i_bReverse;
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
|
||
|
|
// D..... Get the creation date and time of the progress bar and set its position to the beginning
|
||
|
|
Reset
|
||
|
|
(
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
false
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
);
|
||
|
|
|
||
|
|
// E..... Set the refresh timer to 500 milliseconds (or 20ms/50Hz in <dCSP_TIMED_REDRAW> mode)
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
SetTimer((UINT)(UINT_PTR) this, 500, NULL); // Use object's unique address as timer identifier
|
||
|
|
#else
|
||
|
|
SetTimer((UINT) this, 20, NULL); // Use object's unique address as timer identifier
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
|
||
|
|
// F..... Resize the text and display the whole things
|
||
|
|
RefreshPanes(); // Set the text in pane 0 and do the first drawing of the SkinProgress bar
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : ProgressInStatusBar */
|
||
|
|
/* Role : Create the progress in status bar with basic parameters */
|
||
|
|
/* Type : PROTECTED */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* BOOL = false : Error during progress bar creation */
|
||
|
|
/* true : Progress bar created */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* i_poStrMessage : The text message to display in pane 0 */
|
||
|
|
/* i_nUpper : Upper limit to reach 100% (0 at 0%) */
|
||
|
|
/* i_nProgress : Progress completion message type */
|
||
|
|
/* i_nPane : Pane number for the progress bar */
|
||
|
|
/* i_nSize : Progress bar width in pixel IF pane 0 */
|
||
|
|
/* i_poBitmap : Replacement progress bar bitmap */
|
||
|
|
/* <> i_bReverse : Reverse display of the progress bar */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : Base of progress bar is fixed to 0, must use [SetRange] to */
|
||
|
|
/* change it... */
|
||
|
|
/* Behavior : A - Get status bar handler */
|
||
|
|
/* B - Create a CStatic object upon the target pane */
|
||
|
|
/* C - Specific Status Bar initialization */
|
||
|
|
/* D - Create and initialize the progress bar */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC ProgressInStatusBar */
|
||
|
|
/* */
|
||
|
|
/* A..... Get status bar handler */
|
||
|
|
/* [IF there is a status bar] */
|
||
|
|
/* : B..... Create a CStatic object upon the target status bar pane */
|
||
|
|
/* : [IF CStatic creation OK] */
|
||
|
|
/* : : C..... Specific Status Bar initialization */
|
||
|
|
/* : : D..... Create and initialize the progress bar */
|
||
|
|
/* : [ENDIF] */
|
||
|
|
/* [ENDIF] */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
BOOL CSkinProgress::ProgressInStatusBar
|
||
|
|
( // The initialization routine
|
||
|
|
LPCTSTR i_poStrMessage, // Text to display
|
||
|
|
int i_nUpper, // = 100, : Default range from 0 to i_nUpper
|
||
|
|
int i_nProgress, // = cSPT_PERCENT : Message type to add to the text
|
||
|
|
int i_nPane, // = 0, : Pane number in which display the progress bar
|
||
|
|
int i_nSize, // = 200, : Size of the progress bar if in pane 0
|
||
|
|
CBitmap* i_poBitmap // = NULL : Pointer to a user bitmap
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
,BOOL i_bReverse // = false
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
)
|
||
|
|
{
|
||
|
|
BOOL bSuccess;
|
||
|
|
CStatusBar* poStatusBar;
|
||
|
|
DWORD nStyleEx;
|
||
|
|
DWORD nStyle;
|
||
|
|
CRect oRectPane;
|
||
|
|
|
||
|
|
LPCTSTR poStrClass;
|
||
|
|
UINT nClassStyle;
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
bSuccess = false;
|
||
|
|
#ifdef dCSP_DIALOG_PROGRESS
|
||
|
|
m_poWndProgress = NULL;
|
||
|
|
m_poWndMessage = NULL;
|
||
|
|
#endif // dCSP_DIALOG_PROGRESS
|
||
|
|
|
||
|
|
// Process
|
||
|
|
|
||
|
|
// A..... Get status bar handler
|
||
|
|
poStatusBar = GetStatusBar();
|
||
|
|
if(poStatusBar != NULL)
|
||
|
|
{
|
||
|
|
// B..... Create a CStatic object upon the target status bar pane
|
||
|
|
// Set the style for the custom progress bas
|
||
|
|
nClassStyle = 0; // CS_CLASSDC | CS_HREDRAW | CS_VREDRAW;
|
||
|
|
//nStyleEx = WS_EX_STATICEDGE;
|
||
|
|
nStyleEx = 0;
|
||
|
|
nStyle = WS_CHILD | WS_VISIBLE | SS_BITMAP | SS_CENTERIMAGE;
|
||
|
|
|
||
|
|
// Get CRect coordinates for requested status bar pane
|
||
|
|
poStatusBar->GetItemRect(i_nPane, &oRectPane);
|
||
|
|
|
||
|
|
// Create the progress bar
|
||
|
|
poStrClass = AfxRegisterWndClass(nClassStyle, AfxGetApp()->LoadStandardCursor(IDC_ARROW));
|
||
|
|
bSuccess = CStatic::CreateEx(nStyleEx, poStrClass, _T(""), nStyle, oRectPane, poStatusBar, (UINT)(UINT_PTR) this); // Use object's unique address as child window identifier
|
||
|
|
|
||
|
|
ASSERT(bSuccess);
|
||
|
|
if(!bSuccess)
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
#ifndef dCSP_DISPLAY_STRETCH
|
||
|
|
m_bVertical = false; // *ALWAYS false IN CSkinProgress while in StatusBar mode*
|
||
|
|
#else
|
||
|
|
m_bVertical = true; // *FORCE* vertical for m_poStretchBmp analysis
|
||
|
|
#endif // dCSP_DISPLAY_STRETCH
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
|
||
|
|
// C..... Specific Status Bar initialization
|
||
|
|
SetSize
|
||
|
|
(
|
||
|
|
i_nSize
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
,false // Set the size, and avoid display there !
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
);
|
||
|
|
m_nPane = i_nPane;
|
||
|
|
m_oStrPrevText = poStatusBar->GetPaneText(m_nPane); // Get the previous pane's text
|
||
|
|
|
||
|
|
// D..... Create and initialize the progress bar
|
||
|
|
bSuccess = CreateCommon
|
||
|
|
(
|
||
|
|
i_poStrMessage,
|
||
|
|
i_nUpper,
|
||
|
|
i_nProgress,
|
||
|
|
i_poBitmap
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
,i_bReverse
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
);
|
||
|
|
|
||
|
|
return bSuccess;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : ProgressInDialog */
|
||
|
|
/* Role : Create the progress bar in a dialog with basic parameters */
|
||
|
|
/* Type : PROTECTED */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* BOOL = false : Error during progress bar creation */
|
||
|
|
/* true : Progress bar created */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* i_poWndProgress : The CWnd where to display the progress */
|
||
|
|
/* i_nUpper : Upper limit to reach 100% (0 at 0%) */
|
||
|
|
/* i_poBitmap : Replacement progress bar bitmap */
|
||
|
|
/* <> i_bReverse : Reverse display of the progress bar */
|
||
|
|
/* i_poWndMessage : The CWnd where to display the text */
|
||
|
|
/* i_poStrMessage : The text message to display in pane 0 */
|
||
|
|
/* i_nProgress : Progress completion message type */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : Base of progress bar is fixed to 0, must use [SetRange] to */
|
||
|
|
/* change it... */
|
||
|
|
/* Behavior : A - Get status bar handler */
|
||
|
|
/* B - Create a CStatic object upon the target pane */
|
||
|
|
/* C - Set the <m_bVertical> flag */
|
||
|
|
/* D - Specific Status Bar initialization */
|
||
|
|
/* E - Create and initialize the progress bar */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC ProgressInDialog */
|
||
|
|
/* */
|
||
|
|
/* A..... Specific Dialog initialization */
|
||
|
|
/* B..... Create a CStatic object upon the target CWnd progress bar pane */
|
||
|
|
/* [IF CStatic creation OK] */
|
||
|
|
/* : C..... Set the <m_bVertical> flag if the progress bar pane is vertical */
|
||
|
|
/* : [IF there is a CWnd anchor for a text pane to create] */
|
||
|
|
/* : : D..... Specific Status Bar initialization */
|
||
|
|
/* : [ENDIF] */
|
||
|
|
/* : E..... Create and initialize the progress bar */
|
||
|
|
/* [ENDIF] */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* Well, sorry, I put <i_bReverse> in the middle of the function call, but */
|
||
|
|
/* there is an obvious reason : If you want to bypass the message's Cwnd, */
|
||
|
|
/* you can leave the ending parameters empty ! But if I had put <i_bReverse> */
|
||
|
|
/* on the end, you had to force every text related parameter to NULL before */
|
||
|
|
/* being able to set the <i_bReverse> value. */
|
||
|
|
/* */
|
||
|
|
/* You can also use yourself the <dCSP_SLIDERBAR_METHOD> define to compile */
|
||
|
|
/* your own code according to your needs (as long as you include the .h) ! */
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
#ifdef dCSP_DIALOG_PROGRESS
|
||
|
|
BOOL CSkinProgress::ProgressInDialog
|
||
|
|
( // The initialization routine
|
||
|
|
CWnd* i_poWndProgress,
|
||
|
|
int i_nUpper, // = 100, : Default range from 0 to i_nUpper
|
||
|
|
CBitmap* i_poBitmap, // = NULL : Pointer to a user bitmap
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
BOOL i_bReverse, // = false
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
CWnd* i_poWndMessage, // = NULL
|
||
|
|
LPCTSTR i_poStrMessage, // = NULL : Text to display
|
||
|
|
int i_nProgress // = cSPT_NONE : Message type to add to the text
|
||
|
|
)
|
||
|
|
{
|
||
|
|
BOOL bSuccess;
|
||
|
|
DWORD nStyleEx;
|
||
|
|
DWORD nStyle;
|
||
|
|
CRect oRectPane;
|
||
|
|
|
||
|
|
LPCTSTR poStrClass;
|
||
|
|
UINT nClassStyle;
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
bSuccess = false;
|
||
|
|
|
||
|
|
// A..... Specific Dialog initialization
|
||
|
|
m_poWndProgress = i_poWndProgress;
|
||
|
|
m_poWndMessage = i_poWndMessage;
|
||
|
|
|
||
|
|
// Process + Return
|
||
|
|
|
||
|
|
// B..... Create a CStatic object upon the target CWnd progress bar pane
|
||
|
|
// Set the style for the custom progress bas
|
||
|
|
nClassStyle = 0; // CS_CLASSDC | CS_HREDRAW | CS_VREDRAW;
|
||
|
|
//nStyleEx = WS_EX_STATICEDGE;
|
||
|
|
nStyleEx = 0;
|
||
|
|
nStyle = WS_CHILD | WS_VISIBLE | SS_BITMAP | SS_CENTERIMAGE;
|
||
|
|
|
||
|
|
// Get CRect coordinates for requested target CWnd bar pane
|
||
|
|
GetTargetRect(&oRectPane);
|
||
|
|
|
||
|
|
// Create the progress bar
|
||
|
|
poStrClass = AfxRegisterWndClass(nClassStyle, AfxGetApp()->LoadStandardCursor(IDC_ARROW));
|
||
|
|
bSuccess = CStatic::CreateEx
|
||
|
|
(
|
||
|
|
nStyleEx,
|
||
|
|
poStrClass,
|
||
|
|
_T(""),
|
||
|
|
nStyle,
|
||
|
|
oRectPane,
|
||
|
|
m_poWndProgress->GetParent(), // Attach it not the the CWnd anchor (thus getting in its client area) but to its parent to overlap it
|
||
|
|
(UINT)(UINT_PTR) this // Use object's unique address as child window identifier
|
||
|
|
);
|
||
|
|
|
||
|
|
ASSERT(bSuccess);
|
||
|
|
if(!bSuccess)
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
// C..... Set the <m_bVertical> flag if the progress bar pane is vertical
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
#ifndef dCSP_DISPLAY_STRETCH
|
||
|
|
if(oRectPane.Height() > oRectPane.Width())
|
||
|
|
{ // VERTICAL
|
||
|
|
m_bVertical = true;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
m_bVertical = false;
|
||
|
|
}
|
||
|
|
#else
|
||
|
|
m_bVertical = true; // *FORCE* vertical for <m_poStretchBmp> analysis
|
||
|
|
#endif // dCSP_DISPLAY_STRETCH
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
|
||
|
|
if(m_poWndMessage != NULL)
|
||
|
|
{
|
||
|
|
// D..... Specific Status Bar initialization
|
||
|
|
m_poWndMessage->GetWindowText(m_oStrPrevText); // Get the previous pane's text
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
if(bSuccess)
|
||
|
|
{
|
||
|
|
// E..... Create and initialize the progress bar
|
||
|
|
bSuccess = CreateCommon
|
||
|
|
(
|
||
|
|
i_poStrMessage,
|
||
|
|
i_nUpper,
|
||
|
|
i_nProgress,
|
||
|
|
i_poBitmap
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
,i_bReverse
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
);
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
return bSuccess;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
#endif // dCSP_DIALOG_PROGRESS
|
||
|
|
|
||
|
|
// *** DESCTRUCTOR ***
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : ~CSkinProgress */
|
||
|
|
/* Role : Destructor, restore the inital states and used memory */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* None */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* None */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Clear the progress bar */
|
||
|
|
/* B - Delete the refresh timer */
|
||
|
|
/* C - Delete the base bitmap */
|
||
|
|
/* C - Delete the client DC compatible base bitmap */
|
||
|
|
/* D - Delete the stretched for image list bitmap */
|
||
|
|
/* E - Delete the displayed progress bar bitmap */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC ~CSkinProgress */
|
||
|
|
/* */
|
||
|
|
/* A..... Clear the progress bar */
|
||
|
|
/* B..... Delete the refresh timer */
|
||
|
|
/* C..... Delete the <m_poBaseBmp> base bitmap */
|
||
|
|
/* D..... Delete the <m_poCompatibleBmp> client DC compatible base bitmap */
|
||
|
|
/* E..... Delete the <m_poStretchBmp> stretched for image list bitmap */
|
||
|
|
/* F..... Delete the <m_poProgressBmp> displayed progress bar bitmap */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
CSkinProgress::~CSkinProgress
|
||
|
|
( // Destructor
|
||
|
|
)
|
||
|
|
{
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// Process
|
||
|
|
|
||
|
|
// A..... Clear the progress bar
|
||
|
|
Clear();
|
||
|
|
|
||
|
|
// B..... Delete the refresh timer
|
||
|
|
if(IsWindow(this->m_hWnd)) // Test first if <this> is the correct address of the object before using it as the right timer identifier
|
||
|
|
{
|
||
|
|
KillTimer((UINT)(UINT_PTR) this); // Use object's unique address as timer identifier
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// C..... Delete the <m_poBaseBmp> base bitmap
|
||
|
|
if(m_poBaseBmp != NULL)
|
||
|
|
{ // Delete the attached base bitmap
|
||
|
|
delete m_poBaseBmp;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// D..... Delete the <m_poCompatibleBmp> client DC compatible base bitmap
|
||
|
|
if(m_poCompatibleBmp != NULL)
|
||
|
|
{ // Delete the attached client DC compatible base bitmap
|
||
|
|
delete m_poCompatibleBmp;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// E..... Delete the <m_poStretchBmp> stretched for image list bitmap
|
||
|
|
if(m_poStretchBmp != NULL)
|
||
|
|
{ // Delete the attached stretched image list bitmap
|
||
|
|
delete m_poStretchBmp;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// F..... Delete the <m_poProgressBmp> displayed progress bar bitmap
|
||
|
|
if(m_poProgressBmp != NULL)
|
||
|
|
{ // Delete the attached progress bitmap
|
||
|
|
delete m_poProgressBmp;
|
||
|
|
}else{}
|
||
|
|
}
|
||
|
|
|
||
|
|
// *** CLEANER ***
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : Clear */
|
||
|
|
/* Role : Erase the progress */
|
||
|
|
/* Type : PROTECTED */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* None */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* None */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Delete the progress bar */
|
||
|
|
/* B - Set IDLE message in pane 0 */
|
||
|
|
/* C - Set previous message in user pane */
|
||
|
|
/* D - Display the changes */
|
||
|
|
/* E - Set previous message */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC Clear */
|
||
|
|
/* */
|
||
|
|
/* [IF the object is still alive] */
|
||
|
|
/* : A..... Delete the progress bar */
|
||
|
|
/* : [IF status bar] */
|
||
|
|
/* : : B..... Set IDLE message in pane 0 */
|
||
|
|
/* : : C..... Set previous message in user pane */
|
||
|
|
/* : : D..... Display the changes */
|
||
|
|
/* : [ELSE] */
|
||
|
|
/* : : [IF there is a text CWnd] */
|
||
|
|
/* : : : E..... Set previous message */
|
||
|
|
/* : : [ENDIF] */
|
||
|
|
/* : [ENDIF] */
|
||
|
|
/* [ENDIF] */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
void CSkinProgress::Clear
|
||
|
|
( // Deletion of the progress bar, restoration of the context
|
||
|
|
)
|
||
|
|
{
|
||
|
|
CStatusBar* poStatusBar;
|
||
|
|
|
||
|
|
//
|
||
|
|
|
||
|
|
if(IsWindow(GetSafeHwnd()))
|
||
|
|
{
|
||
|
|
// A..... Delete the progress bar
|
||
|
|
ModifyStyle(WS_VISIBLE, 0); // Clear the attached CStatic progress bar
|
||
|
|
DestroyWindow(); // Destroy it
|
||
|
|
|
||
|
|
#ifdef dCSP_DIALOG_PROGRESS
|
||
|
|
if(m_poWndProgress == NULL)
|
||
|
|
{ // If in Status Bar, reset pane 0 and delete the progress bar
|
||
|
|
#endif // dCSP_DIALOG_PROGRESS
|
||
|
|
poStatusBar = GetStatusBar();
|
||
|
|
if(poStatusBar != NULL)
|
||
|
|
{
|
||
|
|
// B..... Set IDLE message in pane 0
|
||
|
|
m_oStrMessage.LoadString(AFX_IDS_IDLEMESSAGE); // Get the IDLE_MESSAGE and place ? in the status bar
|
||
|
|
poStatusBar->SetPaneText(0, m_oStrMessage);
|
||
|
|
|
||
|
|
// C..... Set previous message in user pane
|
||
|
|
if(m_nPane != 0)
|
||
|
|
{ // If not the text pane, restore previous text in the pane
|
||
|
|
poStatusBar->SetPaneText(m_nPane, m_oStrPrevText);
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// D..... Display the changes
|
||
|
|
poStatusBar->InvalidateRect(NULL);
|
||
|
|
}else{}
|
||
|
|
#ifdef dCSP_DIALOG_PROGRESS
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
if(m_poWndMessage != NULL)
|
||
|
|
{
|
||
|
|
// E..... Set previous message
|
||
|
|
m_poWndMessage->SetWindowText(m_oStrPrevText); // Set the previous pane's text
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
m_poWndProgress->InvalidateRect(NULL);
|
||
|
|
} // NOTHING TO RESET IN DIALOG MODE !!!
|
||
|
|
#endif // dCSP_DIALOG_PROGRESS
|
||
|
|
}else{}
|
||
|
|
}
|
||
|
|
|
||
|
|
// *** SYSTEM INTERFACE ***
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : GetStatusBar */
|
||
|
|
/* Role : Get status bar's window handle */
|
||
|
|
/* Type : PROTECTED */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* CStatusBar* : Window handle, else NULL if no status bar */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* None */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Get the main window handle */
|
||
|
|
/* B - Retrieve the status bar handle */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC GetStatusBar */
|
||
|
|
/* */
|
||
|
|
/* A..... Get the main window handle */
|
||
|
|
/* B..... Retrieve the status bar handle */
|
||
|
|
/* [IF main window is based on CFrameWnd] */
|
||
|
|
/* : BA.... Return status bar's handle from CFrameWnd main window type */
|
||
|
|
/* :[ELSE] */
|
||
|
|
/* : BB.... Return status bar's handle from other main window type */
|
||
|
|
/* [ENDIF] */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
CStatusBar* CSkinProgress::GetStatusBar
|
||
|
|
( // Get the pointer on the current status bar
|
||
|
|
)
|
||
|
|
{
|
||
|
|
CWnd* poMainWnd;
|
||
|
|
CWnd* poMessageBar;
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// A..... Get the main window handle
|
||
|
|
poMainWnd = AfxGetMainWnd();
|
||
|
|
|
||
|
|
// Process + Return
|
||
|
|
|
||
|
|
// B..... Retrieve the status bar handle
|
||
|
|
if(poMainWnd != NULL)
|
||
|
|
{
|
||
|
|
if(poMainWnd->IsKindOf(RUNTIME_CLASS(CFrameWnd)))
|
||
|
|
{ // If main window is a frame window, use normal methods
|
||
|
|
poMessageBar = ((CFrameWnd*) poMainWnd)->GetMessageBar();
|
||
|
|
|
||
|
|
// BA.... Return status bar's handle from CFrameWnd main window type
|
||
|
|
return DYNAMIC_DOWNCAST(CStatusBar, poMessageBar);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // otherwise traverse children to try and find the status bar
|
||
|
|
// BB.... Return status bar's handle from other main window type
|
||
|
|
return DYNAMIC_DOWNCAST(CStatusBar, poMainWnd->GetDescendantWindow(AFX_IDW_STATUS_BAR));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : GetTargetRect */
|
||
|
|
/* Role : Get the target CRect of the progress bar */
|
||
|
|
/* Type : PROTECTED */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* BOOL = false : Error in getting the target rect */
|
||
|
|
/* true : CRect returned is valid */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* o_poProgressRect : Pointer on an existing CRect */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* None */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Get the progress bar's CWnd anchor rectangle */
|
||
|
|
/* B - Get the status bar selected pane rectangle */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC GetTargetRect */
|
||
|
|
/* */
|
||
|
|
/* [IF there is a progress bar CWnd anchor specified] */
|
||
|
|
/* : A..... Get the progress bar's CWnd anchor rectangle */
|
||
|
|
/* [ELSE] */
|
||
|
|
/* : B..... Get the status bar selected pane rectangle */
|
||
|
|
/* [ENDIF] */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
BOOL CSkinProgress::GetTargetRect
|
||
|
|
( // Get the target CRect for the [SetBitmap(...)]
|
||
|
|
CRect* o_poProgressRect // Pointer on an existing CRect
|
||
|
|
)
|
||
|
|
{
|
||
|
|
CStatusBar* poStatusBar;
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// Process + Return
|
||
|
|
|
||
|
|
#ifdef dCSP_DIALOG_PROGRESS
|
||
|
|
if(m_poWndProgress != NULL)
|
||
|
|
{ // If dialog mode
|
||
|
|
// A..... Get the progress bar's CWnd anchor rectangle
|
||
|
|
m_poWndProgress->GetWindowRect(o_poProgressRect); // Return CWnd parent's screen absolute coordinates
|
||
|
|
m_poWndProgress->GetParent()->ScreenToClient(o_poProgressRect); // Transform into parent relative coordinates
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
#endif // dCSP_DIALOG_PROGRESS
|
||
|
|
poStatusBar = GetStatusBar();
|
||
|
|
if(poStatusBar != NULL)
|
||
|
|
{
|
||
|
|
// B..... Get the status sar selected pane rectangle
|
||
|
|
poStatusBar->GetItemRect(m_nPane, o_poProgressRect); // Already working in parent (the status bar) relative coordinates
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
#ifdef dCSP_DIALOG_PROGRESS
|
||
|
|
}
|
||
|
|
#endif // dCSP_DIALOG_PROGRESS
|
||
|
|
}
|
||
|
|
|
||
|
|
// *** BITMAP PROCESS ***
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : SetBitmap */
|
||
|
|
/* Role : Create an image list for the progress bar painting */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* BOOL = false : Error in image list creation */
|
||
|
|
/* true : Image list created and ready to use */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* i_poCwnd : CWnd anchor to get the bitmap size to use */
|
||
|
|
/* i_poBitmap : Image to use, use default bitmap if NULL */
|
||
|
|
/* i_bDisplay : Display the changes */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Get the base bitmap for the image list creation */
|
||
|
|
/* B - Create the stretched bitmap used for the image list */
|
||
|
|
/* C - Create an image list compatible bitmap */
|
||
|
|
/* D - Create the image list */
|
||
|
|
/* E - Display the new bitmap */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC SetBitmap */
|
||
|
|
/* */
|
||
|
|
/* A..... Get the base bitmap for the <m_oBarImgLst> image list creation */
|
||
|
|
/* AA.... Create the base and the device compatible bitmaps */
|
||
|
|
/* AB.... Load the <i_poBitmap> base bitmap */
|
||
|
|
/* AC.... Convert the <m_poBaseBmp> base bitmap in a compatible format */
|
||
|
|
/* B..... Create the stretched bitmap used for the image list creation */
|
||
|
|
/* BA.... Create the bitmap, and delete the previous one if there was one */
|
||
|
|
/* BB.... Create a bitmap with mixed dimensions from the base and the pane */
|
||
|
|
/* BC.... Set the copy parameters for the stretching */
|
||
|
|
/* C..... Modify the base bitmap to create an image list compatible bitmap */
|
||
|
|
/* D..... Create the <m_oBarImgLst> image list */
|
||
|
|
/* DA.... Get the stretched bitmap size */
|
||
|
|
/* DB.... Calculate the size of every element of the image list */
|
||
|
|
/* DC.... Delete the previous image list the create a new one from scratch */
|
||
|
|
/* DD.... Create the new image list in 32 bits for maximun throughput */
|
||
|
|
/* DE.... Add the stretched bitmap in the image list */
|
||
|
|
/* E..... Display the new bitmap */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
BOOL CSkinProgress::SetBitmap
|
||
|
|
( // Change of progress bar image
|
||
|
|
CBitmap* i_poBitmap // = NULL : Pointer to an existing bitmap
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
,BOOL i_bDisplay // = true : Display the changes
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
)
|
||
|
|
{
|
||
|
|
BITMAP sBmpSrc;
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
CBitmap oBmpVertical;
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
CBitmap* poOldBitmap;
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
CBitmap* poOldVertical;
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
CBitmap* poOldStretch;
|
||
|
|
CRect oRectBar;
|
||
|
|
CDC oDcBitmap;
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
CDC oDcVertical;
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
CDC oDcStretch;
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
m_oRectPaint.SetRect(0, 0, 0, 0); // Force redraw if the bitmap is changed while the SkinProgress object exist
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
poOldVertical = NULL; // AVOID /W4 -> BC.... *STUPID COMPILER*
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
|
||
|
|
// Process
|
||
|
|
|
||
|
|
if(GetTargetRect(&oRectBar))
|
||
|
|
{ // If the target rectangle is valid
|
||
|
|
CClientDC oDC(this); // Get the current DC
|
||
|
|
|
||
|
|
// A..... Get the <i_poBitmap> base bitmap for the <m_oBarImgLst> image list creation
|
||
|
|
// AA.... Create the base and the device compatible bitmaps
|
||
|
|
if(m_poBaseBmp != NULL)
|
||
|
|
{ // *IF* m_poBaseBmp already exist
|
||
|
|
delete m_poBaseBmp;
|
||
|
|
}else{}
|
||
|
|
m_poBaseBmp = new CBitmap; // BEWARE : DON'T INITIALIZE IT YET !
|
||
|
|
|
||
|
|
if(m_poCompatibleBmp != NULL)
|
||
|
|
{ // *IF* m_poCompatibleBmp already exist
|
||
|
|
delete m_poCompatibleBmp;
|
||
|
|
}else{}
|
||
|
|
m_poCompatibleBmp = new CBitmap; // BEWARE : DON'T INITIALIZE IT YET !
|
||
|
|
|
||
|
|
// AB.... Load the <i_poBitmap> base bitmap
|
||
|
|
// Check if i_poBitmap is valid, otherwise use the resource's bitmap
|
||
|
|
if(i_poBitmap == NULL)
|
||
|
|
{ // If no bitmap provided, takes the default bitmap
|
||
|
|
#ifndef dCSP_RESOURCE_BITMAP
|
||
|
|
m_poBaseBmp->CreateBitmapIndirect(&sAQUA_BITMAP);
|
||
|
|
#else
|
||
|
|
m_poBaseBmp->LoadBitmap(IDB_AQUABAR); // Defaut bitmap, might have to be changed !
|
||
|
|
#endif // dCSP_RESOURCE_BITMAP
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Copy the <i_poBitmap> input bitmap as the new <m_poBaseBmp> base bitmap
|
||
|
|
CopyBitmap(m_poBaseBmp, i_poBitmap);
|
||
|
|
}
|
||
|
|
|
||
|
|
// AC.... Convert the <m_poBaseBmp> base bitmap in a device compatible format
|
||
|
|
ConvBitmap(m_poCompatibleBmp, m_poBaseBmp, &oDC);
|
||
|
|
|
||
|
|
// Get bitmap width and height for the image list creation
|
||
|
|
m_poCompatibleBmp->GetBitmap(&sBmpSrc);
|
||
|
|
m_nBmpWidth = sBmpSrc.bmWidth / cSPB_EnumElements; // cSPB_EnumElements == 9, the bitmap is actually composed of 9 parts
|
||
|
|
m_nBmpHeight = sBmpSrc.bmHeight;
|
||
|
|
|
||
|
|
// B..... Create the <m_poStretchBmp> stretched bitmap used for the <m_oBarImgLst> image list creation
|
||
|
|
// BA.... Create the bitmap, and if a previous one was already existing, delete it first
|
||
|
|
if(m_poStretchBmp != NULL)
|
||
|
|
{ // *IF* m_poStretchBmp already exist
|
||
|
|
delete m_poStretchBmp;
|
||
|
|
}else{}
|
||
|
|
m_poStretchBmp = new CBitmap;
|
||
|
|
|
||
|
|
// BB.... Create a bitmap with the base bitmap width, and the despination pane height minus 2
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
#ifndef dCSP_CREATE_BITMAP_FILE
|
||
|
|
m_poStretchBmp->CreateCompatibleBitmap(&oDC, sBmpSrc.bmWidth, oRectBar.Height() - 2); // Minus 2, with don't count the contour of the box
|
||
|
|
#else
|
||
|
|
m_poStretchBmp->CreateCompatibleBitmap(&oDC, sBmpSrc.bmWidth, sBmpSrc.bmHeight); // BITMAP CREATION IN CURRENT VIDEO MODE !
|
||
|
|
#endif //dCSP_CREATE_BITMAP_FILE
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
#ifndef dCSP_DISPLAY_STRETCH
|
||
|
|
oBmpVertical.CreateCompatibleBitmap(&oDC, sBmpSrc.bmWidth, oRectBar.Width() - 2); // Minus 2, with don't count the contour of the box
|
||
|
|
m_poStretchBmp->CreateCompatibleBitmap(&oDC, (oRectBar.Width() - 2) * cSPB_EnumElements, m_nBmpWidth); // Minus 2, with don't count the contour of the box
|
||
|
|
#else
|
||
|
|
oBmpVertical.CreateCompatibleBitmap(&oDC, sBmpSrc.bmWidth, oRectBar.Height() - 2); // Minus 2, with don't count the contour of the box
|
||
|
|
m_poStretchBmp->CreateCompatibleBitmap(&oDC, (oRectBar.Height() - 2) * cSPB_EnumElements, m_nBmpWidth); // Minus 2, with don't count the contour of the box
|
||
|
|
#endif //dCSP_DISPLAY_STRETCH
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
|
||
|
|
// BC.... Set the copy parameters for the stretching
|
||
|
|
// Set the DC
|
||
|
|
oDcBitmap.CreateCompatibleDC(&oDC);
|
||
|
|
poOldBitmap = oDcBitmap.SelectObject(m_poCompatibleBmp); // Source
|
||
|
|
oDcStretch.CreateCompatibleDC(&oDC);
|
||
|
|
poOldStretch = oDcStretch.SelectObject(m_poStretchBmp); // Destination
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical != false)
|
||
|
|
{ // Vertical bar
|
||
|
|
oDcVertical.CreateCompatibleDC(&oDC);
|
||
|
|
poOldVertical = oDcVertical.SelectObject(&oBmpVertical); // Destination
|
||
|
|
oDcVertical.SetStretchBltMode(HALFTONE);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
oDcStretch.SetStretchBltMode(HALFTONE);
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
|
||
|
|
// C..... Copy the <m_poCompatibleBmp> base bitmap and apply modifications to create an image list compatible bitmap
|
||
|
|
// Copy the picture
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
#ifndef dCSP_CREATE_BITMAP_FILE
|
||
|
|
oDcStretch.StretchBlt(0, 0, sBmpSrc.bmWidth, oRectBar.Height() - 2, &oDcBitmap, 0, 0, sBmpSrc.bmWidth, sBmpSrc.bmHeight, SRCCOPY);
|
||
|
|
#else
|
||
|
|
oDcStretch.BitBlt(0, 0, sBmpSrc.bmWidth, sBmpSrc.bmHeight, &oDcBitmap, 0, 0, SRCCOPY); // BITMAP CREATION IN CURRENT VIDEO MODE, PLEASE USE 32 BITS, AVOID MAPPED !
|
||
|
|
#endif //dCSP_CREATE_BITMAP_FILE
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
#ifndef dCSP_DISPLAY_STRETCH
|
||
|
|
oDcVertical.StretchBlt(0, 0, sBmpSrc.bmWidth, oRectBar.Width() - 2, &oDcBitmap, 0, 0, sBmpSrc.bmWidth, sBmpSrc.bmHeight, SRCCOPY);
|
||
|
|
#else
|
||
|
|
oDcVertical.StretchBlt(0, 0, sBmpSrc.bmWidth, oRectBar.Height() - 2, &oDcBitmap, 0, 0, sBmpSrc.bmWidth, sBmpSrc.bmHeight, SRCCOPY);
|
||
|
|
#endif // dCSP_DISPLAY_STRETCH
|
||
|
|
|
||
|
|
// Copy the stretched vertical picture into the m_poStretchBmp with part flip
|
||
|
|
#ifndef dCSP_DISPLAY_STRETCH
|
||
|
|
for(int y = 0; y < oRectBar.Width() - 2; y += 1)
|
||
|
|
#else
|
||
|
|
for(int y = 0; y < oRectBar.Height() - 2; y += 1)
|
||
|
|
#endif // dCSP_DISPLAY_STRETCH
|
||
|
|
{ // Scan each line
|
||
|
|
for(int x = 0; x < sBmpSrc.bmWidth; x += 1)
|
||
|
|
{ // Scan every pixel of the line
|
||
|
|
#ifndef dCSP_DISPLAY_STRETCH
|
||
|
|
oDcStretch.SetPixel(y + ((oRectBar.Width() - 2) * (x / m_nBmpWidth)), x % m_nBmpWidth, oDcVertical.GetPixel(x, y));
|
||
|
|
#else
|
||
|
|
oDcStretch.SetPixel(y + ((oRectBar.Height() - 2) * (x / m_nBmpWidth)), x % m_nBmpWidth, oDcVertical.GetPixel(x, y));
|
||
|
|
#endif // dCSP_DISPLAY_STRETCH
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
|
||
|
|
// Release the DC
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical != false)
|
||
|
|
{ // Vertical bar
|
||
|
|
oDcVertical.SelectObject(poOldVertical);
|
||
|
|
oDcVertical.DeleteDC();
|
||
|
|
}else{}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
oDcStretch.SelectObject(poOldStretch);
|
||
|
|
oDcStretch.DeleteDC();
|
||
|
|
oDcBitmap.SelectObject(poOldBitmap);
|
||
|
|
oDcBitmap.DeleteDC();
|
||
|
|
|
||
|
|
// D..... Create the <m_oBarImgLst> image list
|
||
|
|
// DA.... Get the stretched bitmap size
|
||
|
|
// Get bitmap width and height for the image list creation
|
||
|
|
m_poStretchBmp->GetBitmap(&sBmpSrc);
|
||
|
|
|
||
|
|
#ifdef dCSP_CREATE_BITMAP_FILE
|
||
|
|
// Fast and dirty routine to save the stretched bitmap in C format, for the people who wants to recreate the AQUA_BITMAP array with their own default bitmap, instead to provide it to the constructor
|
||
|
|
FILE* sFileHandle;
|
||
|
|
unsigned char* panDataBmp;
|
||
|
|
int nCount = sBmpSrc.bmWidthBytes * sBmpSrc.bmHeight;
|
||
|
|
unsigned char nBufferHi;
|
||
|
|
unsigned char nBufferLo;
|
||
|
|
|
||
|
|
panDataBmp = new unsigned char[nCount];
|
||
|
|
|
||
|
|
if(panDataBmp != NULL)
|
||
|
|
{
|
||
|
|
sFileHandle = fopen("C:\\aqua_bitmap.cpp", "wt"); // Change the path here
|
||
|
|
if(sFileHandle != NULL)
|
||
|
|
{
|
||
|
|
m_poStretchBmp->GetBitmapBits(nCount, panDataBmp);
|
||
|
|
|
||
|
|
fprintf(sFileHandle, "unsigned char anAQUA_BITMAP[%d] =\n{\n ", nCount);
|
||
|
|
for(int nPointer = 0; nPointer < nCount; nPointer += 1)
|
||
|
|
{
|
||
|
|
fputs(" 0x", sFileHandle);
|
||
|
|
nBufferHi = panDataBmp[nPointer];
|
||
|
|
nBufferLo = nBufferHi;
|
||
|
|
|
||
|
|
nBufferHi >>= 4;
|
||
|
|
nBufferLo &= 0x0F;
|
||
|
|
|
||
|
|
if(nBufferHi < 10)
|
||
|
|
{
|
||
|
|
nBufferHi += '0';
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
nBufferHi += 'A' - 10;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(nBufferLo < 10)
|
||
|
|
{
|
||
|
|
nBufferLo += '0';
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
nBufferLo += 'A' - 10;
|
||
|
|
}
|
||
|
|
|
||
|
|
fputc(nBufferHi, sFileHandle);
|
||
|
|
fputc(nBufferLo, sFileHandle);
|
||
|
|
|
||
|
|
fputs(",", sFileHandle);
|
||
|
|
if((nPointer % 16) == 15)
|
||
|
|
{ // 16 pixels per line
|
||
|
|
fputs("\n ", sFileHandle);
|
||
|
|
}else{}
|
||
|
|
}
|
||
|
|
fputs("};\n\n", sFileHandle);
|
||
|
|
|
||
|
|
fputs("BITMAP sAQUA_BITMAP =\n{\n", sFileHandle);
|
||
|
|
fprintf(sFileHandle, " %d, // bmType\n", sBmpSrc.bmType);
|
||
|
|
fprintf(sFileHandle, " %d, // bmWidth\n", sBmpSrc.bmWidth);
|
||
|
|
fprintf(sFileHandle, " %d, // bmHeight\n", sBmpSrc.bmHeight);
|
||
|
|
fprintf(sFileHandle, " %d, // bmWidthBytes\n", sBmpSrc.bmWidthBytes);
|
||
|
|
fprintf(sFileHandle, " %d, // bmPlanes\n", sBmpSrc.bmPlanes);
|
||
|
|
fprintf(sFileHandle, " %d, // bmBitsPixel\n", sBmpSrc.bmBitsPixel);
|
||
|
|
fputs(" anAQUA_BITMAP // bmBits\n", sFileHandle);
|
||
|
|
fputs("};\n", sFileHandle);
|
||
|
|
|
||
|
|
fclose(sFileHandle);
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
delete panDataBmp;
|
||
|
|
}else{}
|
||
|
|
#endif //dCSP_CREATE_BITMAP_FILE
|
||
|
|
|
||
|
|
// DB.... Calculate the size of every element of the image list
|
||
|
|
m_nBmpWidth = sBmpSrc.bmWidth / cSPB_EnumElements; // cSPB_EnumElements == 5, the bitmap is yet composed of 5 parts
|
||
|
|
m_nBmpHeight = sBmpSrc.bmHeight;
|
||
|
|
|
||
|
|
// DC.... Delete the previous image list the create a new one from scratch (useful when providing a new bitmap during SkinProgress life-time)
|
||
|
|
// Image list creation
|
||
|
|
m_oBarImgLst.DeleteImageList(); // Delete the previous ImageList and recreate it with the new bitmap
|
||
|
|
// DD.... Create the new image list in 32 bits to be sure it will accept any kind of bitmap in input (if 8 bits bitmap provided, will be converted in 32 bits)
|
||
|
|
if(!m_oBarImgLst.Create(m_nBmpWidth, m_nBmpHeight, ILC_COLOR32, 0, 0)) // ILC_COLOR32 to be sure to accept any BitMap format passed through i_poBitmap
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
// DE.... Add the stretched bitmap in the image list
|
||
|
|
m_oBarImgLst.Add(m_poStretchBmp, RGB(0, 255, 255));
|
||
|
|
|
||
|
|
// E..... Display the new bitmap
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
if(i_bDisplay != false)
|
||
|
|
{
|
||
|
|
RefreshPanes();
|
||
|
|
}else{}
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : CopyBitmap */
|
||
|
|
/* Role : Copy a bitmap */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* BOOL = false : Error in copy */
|
||
|
|
/* true : Image copied */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* o_poBitmap : Image where to copy */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* i_poBitmap : Image to copy */
|
||
|
|
/* Pre-condition : Both output and input pointer must be provided ! */
|
||
|
|
/* Also, the output bitmap MUST BE CREATED, BUT NOT */
|
||
|
|
/* INITIALIZED */
|
||
|
|
/* Constraints : Do not handle mapped bitmap yet... */
|
||
|
|
/* Behavior : A - Create a remote data buffer to get the source data */
|
||
|
|
/* B - Get the source data */
|
||
|
|
/* C - Copy the bitmap */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC CopyBitmap */
|
||
|
|
/* */
|
||
|
|
/* A..... Create a remote data buffer to get the source data */
|
||
|
|
/* [IF the remote buffer is successfully created] */
|
||
|
|
/* : B..... Get the source data */
|
||
|
|
/* : C..... Copy the bitmap */
|
||
|
|
/* [ENDIF] */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* As this STUPID [CBitmap::GetBitmap((BITMAP*) o_psBitmap)] returns NULL in */
|
||
|
|
/* <o_psBitmap.bmBits>, we cannot reuse immediatly the returned BITMAP for a */
|
||
|
|
/* [CBitmap::CreateBitmapIndirect((BITMAP*) i_psBitmap)], we have to get the */
|
||
|
|
/* address of the data buffer by creating it by ourself, then get the datas */
|
||
|
|
/* with [CBitmap::GetBitmapBits((DWORD) i_nDataCount, (LPVOID) i_panDataBmp)] */
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
BOOL CSkinProgress::CopyBitmap
|
||
|
|
( // Copy a bitmap
|
||
|
|
CBitmap* o_poBitmap, // Pointer to an EXISTING but NOT INITIALIZED bitmap
|
||
|
|
CBitmap* i_poBitmap // Pointer to the source bitmap
|
||
|
|
)
|
||
|
|
{
|
||
|
|
BITMAP sBmpSrc;
|
||
|
|
unsigned char* panDataBmp;
|
||
|
|
DWORD nDataCount;
|
||
|
|
BOOL bResult;
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// Process
|
||
|
|
|
||
|
|
if(
|
||
|
|
(o_poBitmap == NULL)
|
||
|
|
|| (i_poBitmap == NULL)
|
||
|
|
)
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
// A..... Create a remote data buffer to get the source data
|
||
|
|
i_poBitmap->GetBitmap(&sBmpSrc);
|
||
|
|
nDataCount = sBmpSrc.bmWidthBytes * sBmpSrc.bmHeight;
|
||
|
|
panDataBmp = new unsigned char[nDataCount];
|
||
|
|
|
||
|
|
if(panDataBmp != NULL)
|
||
|
|
{
|
||
|
|
// B..... Get the source data
|
||
|
|
i_poBitmap->GetBitmapBits(nDataCount, panDataBmp);
|
||
|
|
sBmpSrc.bmBits = panDataBmp; // Just complete the BITMAP structure
|
||
|
|
|
||
|
|
// C..... Copy the bitmap
|
||
|
|
bResult = o_poBitmap->CreateBitmapIndirect(&sBmpSrc);
|
||
|
|
|
||
|
|
delete[] panDataBmp;
|
||
|
|
|
||
|
|
return bResult;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : ConvBitmap */
|
||
|
|
/* Role : Convert a bitmap to a specified device context */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* BOOL = false : Error in conversion */
|
||
|
|
/* true : Image converted */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* o_poBitmap : Image where to copy/transform */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* i_poBitmap : Image to copy/transform */
|
||
|
|
/* i_poDC : The DC to use for the conversion */
|
||
|
|
/* Pre-condition : Both output and input pointer must be provided ! */
|
||
|
|
/* Also, the output bitmap MUST BE CREATED, BUT NOT */
|
||
|
|
/* INITIALIZED */
|
||
|
|
/* Constraints : Do not handle mapped bitmap yet... */
|
||
|
|
/* Behavior : A - Get the current DC */
|
||
|
|
/* B - Copy the bitmap */
|
||
|
|
/* C - Create a remote data buffer to get the source data */
|
||
|
|
/* D - Get the source data */
|
||
|
|
/* E - Initialize the bitmap */
|
||
|
|
/* F - Convert the data */
|
||
|
|
/* G - Copy the converted bitmap */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC CopyBitmap */
|
||
|
|
/* */
|
||
|
|
/* [IF pointers on bitmap valids] */
|
||
|
|
/* : [IF no DC provided] */
|
||
|
|
/* : : A..... Get the current DC */
|
||
|
|
/* : [ELSE] */
|
||
|
|
/* : [IF same color format] */
|
||
|
|
/* : : B..... Copy the bitmap */
|
||
|
|
/* : [ELSE] */
|
||
|
|
/* : : C..... Create a remote data buffer to get the source data */
|
||
|
|
/* : : [IF buffer created] */
|
||
|
|
/* : : : D..... Get the source data */
|
||
|
|
/* : : : E..... Initialize the bitmap */
|
||
|
|
/* : : : F..... Convert the data */
|
||
|
|
/* : : : G..... Copy the converted bitmap */
|
||
|
|
/* : : [ELSE] */
|
||
|
|
/* : [ENDIF] */
|
||
|
|
/* [ENDIF] */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
BOOL CSkinProgress::ConvBitmap
|
||
|
|
( // Convert a bitmap to a specified device context
|
||
|
|
CBitmap* o_poBitmap, // Pointer to an EXISTING but NOT INITIALIZED bitmap
|
||
|
|
CBitmap* i_poBitmap, // Pointer to the source bitmap
|
||
|
|
CDC* i_poDC // = NULL : Pointer to the DC to use for the conversion, if NULL use the current DC
|
||
|
|
)
|
||
|
|
{
|
||
|
|
BITMAP sBmpSrc;
|
||
|
|
BITMAPINFO sBmpInfoSrc;
|
||
|
|
HBITMAP DIB;
|
||
|
|
unsigned char* panDataBmp;
|
||
|
|
DWORD nDataCount;
|
||
|
|
int nResult;
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
panDataBmp = NULL;
|
||
|
|
|
||
|
|
// Process
|
||
|
|
|
||
|
|
if(
|
||
|
|
(o_poBitmap != NULL)
|
||
|
|
&& (i_poBitmap != NULL)
|
||
|
|
)
|
||
|
|
{
|
||
|
|
if(i_poDC == NULL)
|
||
|
|
{ // If no target device context provided, use the current one
|
||
|
|
// A..... Get the current DC
|
||
|
|
CClientDC oDC(this);
|
||
|
|
i_poDC = &oDC;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
i_poBitmap->GetBitmap(&sBmpSrc); // Get some infos on the source bitmap
|
||
|
|
|
||
|
|
if(sBmpSrc.bmBitsPixel == GetDeviceCaps(*i_poDC, BITSPIXEL))
|
||
|
|
{ // If it's the same bitmap format, just copy it instead to waste some time to convert the picture (what will fail :/ )
|
||
|
|
// B..... Copy the bitmap
|
||
|
|
nResult = (int) CopyBitmap(o_poBitmap, i_poBitmap);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
// C..... Create a remote data buffer to get the source data
|
||
|
|
nDataCount = sBmpSrc.bmWidthBytes * sBmpSrc.bmHeight;
|
||
|
|
panDataBmp = new unsigned char[nDataCount];
|
||
|
|
|
||
|
|
if(panDataBmp != NULL)
|
||
|
|
{
|
||
|
|
// D..... Get the source data
|
||
|
|
i_poBitmap->GetBitmapBits(nDataCount, panDataBmp);
|
||
|
|
sBmpSrc.bmBits = panDataBmp;
|
||
|
|
|
||
|
|
// E..... Initialize the bitmap
|
||
|
|
|
||
|
|
sBmpInfoSrc.bmiColors[0].rgbBlue = 0;
|
||
|
|
sBmpInfoSrc.bmiColors[0].rgbGreen = 0;
|
||
|
|
sBmpInfoSrc.bmiColors[0].rgbRed = 0;
|
||
|
|
sBmpInfoSrc.bmiColors[0].rgbReserved = 0;
|
||
|
|
|
||
|
|
sBmpInfoSrc.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
||
|
|
sBmpInfoSrc.bmiHeader.biWidth = sBmpSrc.bmWidth;
|
||
|
|
sBmpInfoSrc.bmiHeader.biHeight = 0 - sBmpSrc.bmHeight; // 0 - HEIGHT : TOP-DOWN DIB, origin is upper/left corner
|
||
|
|
sBmpInfoSrc.bmiHeader.biPlanes = sBmpSrc.bmPlanes;
|
||
|
|
sBmpInfoSrc.bmiHeader.biBitCount = sBmpSrc.bmBitsPixel;
|
||
|
|
sBmpInfoSrc.bmiHeader.biCompression = BI_RGB;
|
||
|
|
sBmpInfoSrc.bmiHeader.biSizeImage = 0; // 0 : BI_RGB
|
||
|
|
sBmpInfoSrc.bmiHeader.biXPelsPerMeter = 0;
|
||
|
|
sBmpInfoSrc.bmiHeader.biYPelsPerMeter = 0;
|
||
|
|
sBmpInfoSrc.bmiHeader.biClrUsed = 0;
|
||
|
|
sBmpInfoSrc.bmiHeader.biClrImportant = 0;
|
||
|
|
|
||
|
|
// F..... Convert the data
|
||
|
|
DIB = CreateDIBitmap
|
||
|
|
(
|
||
|
|
i_poDC->m_hDC,
|
||
|
|
&sBmpInfoSrc.bmiHeader,
|
||
|
|
CBM_INIT,
|
||
|
|
panDataBmp,
|
||
|
|
&sBmpInfoSrc,
|
||
|
|
DIB_RGB_COLORS
|
||
|
|
);
|
||
|
|
|
||
|
|
// G..... Copy the converted bitmap
|
||
|
|
nResult = (int) CopyBitmap(o_poBitmap, CBitmap::FromHandle(DIB));
|
||
|
|
|
||
|
|
DeleteObject(DIB);
|
||
|
|
delete[] panDataBmp;
|
||
|
|
|
||
|
|
if(nResult != 0)
|
||
|
|
{
|
||
|
|
return true;
|
||
|
|
}else{}
|
||
|
|
}else{}
|
||
|
|
}
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
// *** PROGRESS INTERFACE ***
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : SetRange */
|
||
|
|
/* Role : None */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* BOOL = false : Error while trying to change the range */
|
||
|
|
/* true : New range set */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* i_nLower : Minimum value possible */
|
||
|
|
/* i_nUpper : Maximum value possible */
|
||
|
|
/* i_nStep : Step increment */
|
||
|
|
/* i_bResamble : Resample the current position */
|
||
|
|
/* i_bDisplay : Display the changes */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Resample the postion */
|
||
|
|
/* B - Set the new range */
|
||
|
|
/* C - Display the new ranged progress bar */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC SetRange */
|
||
|
|
/* */
|
||
|
|
/* A..... Resample the postion from the previous range to the new one */
|
||
|
|
/* B..... Set the new range values */
|
||
|
|
/* C..... Display the new ranged progress bar */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
BOOL CSkinProgress::SetRange
|
||
|
|
( // Set the new range
|
||
|
|
int i_nLower, // Minimum limit
|
||
|
|
int i_nUpper, // Maximum limit
|
||
|
|
int i_nStep, // = 1 : Step increment
|
||
|
|
BOOL i_bResamble // = false : Resample the current position from the new Lower and Upper values
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
,BOOL i_bDisplay // = true : Display the changes
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
)
|
||
|
|
{
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// Process + Return
|
||
|
|
|
||
|
|
if(IsWindow(GetSafeHwnd()))
|
||
|
|
{
|
||
|
|
ASSERT((-0x7FFFFFFF <= i_nLower) && (i_nLower <= 0x7FFFFFFF));
|
||
|
|
ASSERT((-0x7FFFFFFF <= i_nUpper) && (i_nUpper <= 0x7FFFFFFF));
|
||
|
|
ASSERT(i_nLower < i_nUpper); // Seems to be stupid, but avoid zero divide problem in percent calculation just below
|
||
|
|
|
||
|
|
// A..... Resample the postion from the previous range to the new one
|
||
|
|
if(i_bResamble != false)
|
||
|
|
{ // Resample positions to readapt them to the new range
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
// Recalculate start
|
||
|
|
m_nLeft = (int) (
|
||
|
|
(
|
||
|
|
(
|
||
|
|
(LONGLONG) // Turns the whole calculation in 64 bits
|
||
|
|
(m_nLeft - m_nLower) // Old start
|
||
|
|
* (i_nUpper - i_nLower) // New range
|
||
|
|
)
|
||
|
|
/ (m_nUpper - m_nLower) // Old range
|
||
|
|
)
|
||
|
|
+ i_nLower // New start
|
||
|
|
);
|
||
|
|
m_nPrevLeft = m_nLeft;
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
|
||
|
|
// Recalculate end
|
||
|
|
m_nRight = (int) (
|
||
|
|
(
|
||
|
|
(
|
||
|
|
(LONGLONG) // Turns the whole calculation in 64 bits
|
||
|
|
(m_nRight - m_nLower) // Old end
|
||
|
|
* (i_nUpper - i_nLower) // New range
|
||
|
|
)
|
||
|
|
/ (m_nUpper - m_nLower) // Old range
|
||
|
|
)
|
||
|
|
+ i_nLower // New end
|
||
|
|
);
|
||
|
|
m_nPrevRight = m_nRight;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// B..... Set the new range values
|
||
|
|
// Sets new parameters for good
|
||
|
|
m_nLower = i_nLower;
|
||
|
|
m_nUpper = i_nUpper;
|
||
|
|
m_nStep = i_nStep;
|
||
|
|
|
||
|
|
// C..... Display the new ranged progress bar
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
if(i_bDisplay != false)
|
||
|
|
{
|
||
|
|
RefreshPanes();
|
||
|
|
}else{}
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : SetPos */
|
||
|
|
/* Role : None */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* int : Previous <m_nRight> position, 0 if error */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* i_nPos : Select the new position */
|
||
|
|
/* i_bDisplay : Display the changes */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Jump to a specified position */
|
||
|
|
/* B - Display the changes */
|
||
|
|
/* C - Return the previous position */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC SetPos */
|
||
|
|
/* */
|
||
|
|
/* A..... Jump to a specified <i_nEnd> position */
|
||
|
|
/* B..... Display the changes */
|
||
|
|
/* C..... Return the previous <m_nRight> position */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
int CSkinProgress::SetPos
|
||
|
|
( // Set <m_nRight> value
|
||
|
|
int i_nPos // Set a new current position
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
,BOOL i_bDisplay // = true : Display the changes
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
)
|
||
|
|
{
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// Process + Return
|
||
|
|
|
||
|
|
if(IsWindow(GetSafeHwnd()))
|
||
|
|
{
|
||
|
|
ASSERT((-0x7FFFFFFF <= i_nPos) && (i_nPos <= 0x7FFFFFFF));
|
||
|
|
|
||
|
|
if(i_nPos > m_nUpper)
|
||
|
|
{ // Avoid problems
|
||
|
|
i_nPos = m_nUpper;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
if(i_nPos < m_nLower)
|
||
|
|
{ // Avoid problems
|
||
|
|
i_nPos = m_nLower;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
if(i_nPos < m_nLeft)
|
||
|
|
{ // Avoid problems
|
||
|
|
i_nPos = m_nLeft;
|
||
|
|
}else{}
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
|
||
|
|
m_nPrevRight = m_nRight;
|
||
|
|
// A..... Jump to a specified <i_nEnd> position
|
||
|
|
m_nRight = i_nPos;
|
||
|
|
|
||
|
|
// B..... Display the changes
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
if(i_bDisplay != false)
|
||
|
|
{
|
||
|
|
RefreshPanes();
|
||
|
|
}else{}
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
|
||
|
|
// C..... Return the previous <m_nRight> position
|
||
|
|
return m_nPrevRight;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : OffsetPos */
|
||
|
|
/* Role : None */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* int : Previous <m_nRight> position, 0 if error */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* i_nOffset : Offset the current position */
|
||
|
|
/* i_bDisplay : Display the changes */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Add an offset to the current position */
|
||
|
|
/* B - Display the changes */
|
||
|
|
/* C - Return the previous position */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC OffsetPos */
|
||
|
|
/* */
|
||
|
|
/* A..... Add a <i_nEnd> offset to the current <m_nRight> position */
|
||
|
|
/* B..... Display the changes */
|
||
|
|
/* C..... Return the previous <m_nRight> position */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
int CSkinProgress::OffsetPos
|
||
|
|
( // Forward of <i_nOffset> value
|
||
|
|
int i_nOffset // Add the offset to the current position (can be negative)
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
,BOOL i_bDisplay // = true : Display the changes
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
)
|
||
|
|
{
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// Process + Return
|
||
|
|
|
||
|
|
if(IsWindow(GetSafeHwnd()))
|
||
|
|
{
|
||
|
|
m_nPrevRight = m_nRight;
|
||
|
|
// A..... Add a <i_nEnd> offset to the current <m_nRight> position
|
||
|
|
m_nRight += i_nOffset;
|
||
|
|
|
||
|
|
if(m_nRight > m_nUpper)
|
||
|
|
{ // Avoid problems
|
||
|
|
m_nRight = m_nUpper;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
if(m_nRight < m_nLower)
|
||
|
|
{ // Avoid problems
|
||
|
|
m_nRight = m_nLower;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
if(m_nRight < m_nLeft)
|
||
|
|
{ // Avoid problems
|
||
|
|
m_nRight = m_nLeft;
|
||
|
|
}else{}
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
|
||
|
|
// B..... Display the changes
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
if(i_bDisplay != false)
|
||
|
|
{
|
||
|
|
RefreshPanes();
|
||
|
|
}else{}
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
|
||
|
|
// C..... Return the previous <m_nRight> position
|
||
|
|
return m_nPrevRight;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : SetStep */
|
||
|
|
/* Role : None */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* int : Previous <m_nStep> setting, 0 if error */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* i_nStep : Set the new step increment */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Set the step increment value */
|
||
|
|
/* B - Return the previous step increment value */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC SetStep */
|
||
|
|
/* */
|
||
|
|
/* A..... Set the <m_nStep> step increment value */
|
||
|
|
/* C..... Return the previous <m_nStep> step increment value */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
int CSkinProgress::SetStep
|
||
|
|
( // Set <m_nStep> value
|
||
|
|
int i_nStep // Set the step increment
|
||
|
|
)
|
||
|
|
{
|
||
|
|
int PrevStep;
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// Process + Return
|
||
|
|
|
||
|
|
if(IsWindow(GetSafeHwnd()))
|
||
|
|
{
|
||
|
|
PrevStep = m_nStep;
|
||
|
|
// A..... Set the <m_nStep> step increment value
|
||
|
|
m_nStep = i_nStep;
|
||
|
|
|
||
|
|
// B..... Return the previous <m_nStep> step increment value
|
||
|
|
return PrevStep;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : StepIt */
|
||
|
|
/* Role : None */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* int : Previous <m_nRight> position, 0 if error */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* i_bDisplay : Display the changes */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Step the position */
|
||
|
|
/* B - Display the changes */
|
||
|
|
/* C - Return the previous position */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC StepIt */
|
||
|
|
/* */
|
||
|
|
/* A..... Step the <m_nRight> position from the <m_nStep> increment value */
|
||
|
|
/* B..... Display the changes */
|
||
|
|
/* C..... Return the previous <m_nRight> position */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
int CSkinProgress::StepIt
|
||
|
|
( // Forward of <m_nStep> value
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
BOOL i_bDisplay // = true : Display the changes
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
)
|
||
|
|
{
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// Process + Return
|
||
|
|
|
||
|
|
if(IsWindow(GetSafeHwnd()))
|
||
|
|
{
|
||
|
|
m_nPrevRight = m_nRight;
|
||
|
|
// A..... Step the <m_nRight> position from the <m_nStep> step increment value
|
||
|
|
m_nRight += m_nStep;
|
||
|
|
|
||
|
|
if(m_nRight > m_nUpper)
|
||
|
|
{ // Avoid problems
|
||
|
|
m_nRight = m_nUpper;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
if(m_nRight < m_nLower)
|
||
|
|
{ // Avoid problems
|
||
|
|
m_nRight = m_nLower;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
if(m_nRight < m_nLeft)
|
||
|
|
{ // Avoid problems
|
||
|
|
m_nRight = m_nLeft;
|
||
|
|
}else{}
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
|
||
|
|
// B..... Display the changes
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
if(i_bDisplay != false)
|
||
|
|
{
|
||
|
|
RefreshPanes();
|
||
|
|
}else{}
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
|
||
|
|
// C..... Return the previous <m_nRight> position
|
||
|
|
return m_nPrevRight;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// *** EXTENDED PROGRESS INTERFACE ***
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : SetSize */
|
||
|
|
/* Role : Change the size of the progress bar if in pane 0 */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* BOOL = false : NEVER */
|
||
|
|
/* true : ALWAYS */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* i_nSize : The new size of the progress bar in pane 0 */
|
||
|
|
/* i_bDisplay : Display the changes */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Set the new size of the progress bar */
|
||
|
|
/* B - Display the resized progress bar */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC SetSize */
|
||
|
|
/* */
|
||
|
|
/* A..... Set the new size of the progress bar */
|
||
|
|
/* B..... Display the resized progress bar */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
BOOL CSkinProgress::SetSize
|
||
|
|
( // Set size of the progress bar in pane 0
|
||
|
|
int i_nSize // Set the size of the progress bar
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
,BOOL i_bDisplay // = true : Display the changes
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
)
|
||
|
|
{
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// A..... Set the new size of the progress bar
|
||
|
|
if(i_nSize > 0)
|
||
|
|
{ // Due to pane anti-disclosure system and progress bar contour, must readapt the size
|
||
|
|
i_nSize += 5;
|
||
|
|
}
|
||
|
|
else if(i_nSize < 0)
|
||
|
|
{
|
||
|
|
i_nSize -= 2;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
m_nSize = i_nSize;
|
||
|
|
|
||
|
|
// Process
|
||
|
|
|
||
|
|
// B..... Display the resized progress bar
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
if(i_bDisplay != false)
|
||
|
|
{
|
||
|
|
RefreshPanes();
|
||
|
|
}else{}
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
|
||
|
|
// Return
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : GetSize */
|
||
|
|
/* Role : Get width or height of the progress bar */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* int : The width or height in pixel of the progress bar */
|
||
|
|
/* 0 : Error */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* None */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Return the current <m_nSize> value */
|
||
|
|
/* B - Return the CWnd based pane size */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC SetStart */
|
||
|
|
/* */
|
||
|
|
/* [IF progress bar in status bar] */
|
||
|
|
/* : A..... Return the current <m_nSize> value */
|
||
|
|
/* [ELSE] */
|
||
|
|
/* : [IF get the target pane rectangle] */
|
||
|
|
/* : : B..... Return the CWnd based pane size */
|
||
|
|
/* : : [IF the bar is not vertical] */
|
||
|
|
/* : : : BA.... Return the width */
|
||
|
|
/* : : [ELSE] */
|
||
|
|
/* : : : BB.... Return the height */
|
||
|
|
/* ; : [ENDIF] */
|
||
|
|
/* : [ELSE] */
|
||
|
|
/* : [ERROR] */
|
||
|
|
/* ; [ENDIF] */
|
||
|
|
/* [ENDIF] */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
int CSkinProgress::GetSize
|
||
|
|
( // Get width or height of the progress bar in pixel, mostly used in CSkinSlider
|
||
|
|
)
|
||
|
|
{
|
||
|
|
#ifdef dCSP_DIALOG_PROGRESS
|
||
|
|
CRect oRectPane;
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// Process + Return
|
||
|
|
|
||
|
|
if(m_poWndProgress == NULL)
|
||
|
|
{
|
||
|
|
#endif // dCSP_DIALOG_PROGRESS
|
||
|
|
// A..... Return the current <m_nSize> value
|
||
|
|
return m_nSize;
|
||
|
|
#ifdef dCSP_DIALOG_PROGRESS
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
// B..... Return the CWnd based pane size
|
||
|
|
if(GetTargetRect(&oRectPane))
|
||
|
|
{
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
return oRectPane.Width();
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return oRectPane.Height();
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
#endif // dCSP_DIALOG_PROGRESS
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : GetPos */
|
||
|
|
/* Role : Get <m_nRight> value */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* int : Current <m_nRight> position */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* i_bPercent : Return the position in percent */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Return the current <m_nRight> position */
|
||
|
|
/* B - Return the current <m_nRight position in percent */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC SetStart */
|
||
|
|
/* */
|
||
|
|
/* [IF normal mode] */
|
||
|
|
/* : A..... Return the current <m_nRight> position */
|
||
|
|
/* [ELSE] */
|
||
|
|
/* : B..... Return the current <m_nRight> position in percent */
|
||
|
|
/* [ENDIF] */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* If return in percent, 90% gives 23040, divided by 256 (>> 8) returns 90 ! */
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
int CSkinProgress::GetPos
|
||
|
|
( // Get <m_nRight> value
|
||
|
|
BOOL i_bPercent // = false
|
||
|
|
)
|
||
|
|
{
|
||
|
|
if(i_bPercent == false)
|
||
|
|
{
|
||
|
|
// A..... Return the current <m_nRight> position
|
||
|
|
return m_nRight;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
// B..... Return the current <m_nRight> position in 8-bits fixed point percent value ('>> 8' to get the 'int' value)
|
||
|
|
return (int) ( // 100% *256 to keep a pseudo 8-bits fixed point value (0.00390625 - 1/256 - resolution)
|
||
|
|
(
|
||
|
|
(LONGLONG) // Turns the whole calculation in 64 bits
|
||
|
|
(m_nRight - m_nLower)
|
||
|
|
* 25600
|
||
|
|
)
|
||
|
|
/ (m_nUpper - m_nLower)
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : GetStep */
|
||
|
|
/* Role : Get <m_nStep> value */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* int : Current <m_nStep> value */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* None */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Return the current <m_nStep> value */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC SetStart */
|
||
|
|
/* */
|
||
|
|
/* A..... Return the current <m_nStep> value */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
int CSkinProgress::GetStep
|
||
|
|
( // Get <m_nStep> value
|
||
|
|
)
|
||
|
|
{
|
||
|
|
// A..... Return the current <m_nStep> value
|
||
|
|
return m_nStep;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : GetLower */
|
||
|
|
/* Role : Get <m_nLower> value */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* int : Current <m_nLower> value */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* None */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Return the current <m_nLower> value */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC SetStart */
|
||
|
|
/* */
|
||
|
|
/* A..... Return the current <m_nLower> value */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
int CSkinProgress::GetLower
|
||
|
|
( // Get <m_nLower> value
|
||
|
|
)
|
||
|
|
{
|
||
|
|
// A..... Return the current <m_nLower> value
|
||
|
|
return m_nLower;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : GetUpper */
|
||
|
|
/* Role : Get <m_nUpper> value */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* int : Current <m_nUpper> value */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* None */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Return the current <m_nUpper> value */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC SetStart */
|
||
|
|
/* */
|
||
|
|
/* A..... Return the current <m_nUpper> value */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
int CSkinProgress::GetUpper
|
||
|
|
( // Get <m_nUpper> value
|
||
|
|
)
|
||
|
|
{
|
||
|
|
// A..... Return the current <m_nUpper> value
|
||
|
|
return m_nUpper;
|
||
|
|
}
|
||
|
|
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : SetStart */
|
||
|
|
/* Role : None */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* int : Previous <m_nLeft> position, 0 if error */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* i_nStart : Select the new start position */
|
||
|
|
/* i_bDisplay : Display the changes */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Jump to a specified position */
|
||
|
|
/* B - Display the changes */
|
||
|
|
/* C - Return the previous position */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC SetStart */
|
||
|
|
/* */
|
||
|
|
/* A..... Jump to a specified <i_nStart> position */
|
||
|
|
/* B..... Display the changes */
|
||
|
|
/* C..... Return the previous <m_nLeft> position */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
int CSkinProgress::SetStart
|
||
|
|
( // Set <m_nLeft> value
|
||
|
|
int i_nStart // Set a new start position
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
,BOOL i_bDisplay // = true : Display the changes
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
)
|
||
|
|
{
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// Process + Return
|
||
|
|
|
||
|
|
if(IsWindow(GetSafeHwnd()))
|
||
|
|
{
|
||
|
|
ASSERT((-0x7FFFFFFF <= i_nStart) && (i_nStart <= 0x7FFFFFFF));
|
||
|
|
|
||
|
|
if(i_nStart > m_nUpper)
|
||
|
|
{ // Avoid problems
|
||
|
|
i_nStart = m_nUpper;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
if(i_nStart < m_nLower)
|
||
|
|
{ // Avoid problems
|
||
|
|
i_nStart = m_nLower;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
if(i_nStart > m_nRight)
|
||
|
|
{ // Avoid problems
|
||
|
|
i_nStart = m_nRight;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
m_nPrevLeft = m_nLeft;
|
||
|
|
// A..... Jump to a specified <i_nEnd> position
|
||
|
|
m_nLeft = i_nStart;
|
||
|
|
|
||
|
|
// B..... Display the changes
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
if(i_bDisplay != false)
|
||
|
|
{
|
||
|
|
RefreshPanes();
|
||
|
|
}else{}
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
|
||
|
|
// C..... Return the previous <m_nPrevLeft> position
|
||
|
|
return m_nPrevLeft;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : GetStart */
|
||
|
|
/* Role : Get <m_nLeft> value */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* int : Current <m_nLeft> position */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* i_bPercent : Return the position in percent */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Return the current <m_nLeft> position */
|
||
|
|
/* B - Return the current <m_nLeft> position in percent */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC SetStart */
|
||
|
|
/* */
|
||
|
|
/* [IF normal mode] */
|
||
|
|
/* : A..... Return the current <m_nLeft> position */
|
||
|
|
/* [ELSE] */
|
||
|
|
/* : B..... Return the current <m_nLeft> position in percent */
|
||
|
|
/* [ENDIF] */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* If return in percent, 90% gives 23040, divided by 256 (>> 8) returns 90 ! */
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
int CSkinProgress::GetStart
|
||
|
|
( // Get <m_nLeft> value
|
||
|
|
BOOL i_bPercent // = false
|
||
|
|
)
|
||
|
|
{
|
||
|
|
if(i_bPercent == false)
|
||
|
|
{
|
||
|
|
// A..... Return the current <m_nLeft> position
|
||
|
|
return m_nLeft;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
// B..... Return the current <m_nLeft> position in 8-bits fixed point percent value ('>> 8' to get the 'int' value)
|
||
|
|
return (int) ( // 100% *256 to keep a pseudo 8-bits fixed point value (0.00390625 - 1/256 - resolution)
|
||
|
|
(
|
||
|
|
(LONGLONG) // Turns the whole calculation in 64 bits
|
||
|
|
(m_nLeft - m_nLower)
|
||
|
|
* 25600
|
||
|
|
)
|
||
|
|
/ (m_nUpper - m_nLower)
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : Reset */
|
||
|
|
/* Role : // Restart the progress bar */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* None */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* i_bDisplay : Display the changes */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Get the creation date and time of the progress bar */
|
||
|
|
/* B - Set the position of the bar to its beginning */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC StepIt */
|
||
|
|
/* */
|
||
|
|
/* A..... Get the creation date and time of the progress bar */
|
||
|
|
/* B..... Set the position of the bar to its beginning */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
void CSkinProgress::Reset
|
||
|
|
( // Restart the progress bar
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
BOOL i_bDisplay // = true : Display the changes
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
)
|
||
|
|
{
|
||
|
|
FILETIME sStartTimeFile;
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// Process
|
||
|
|
|
||
|
|
// A..... Get the creation date and time of the progress bar
|
||
|
|
// GetSystemTime(&m_sStartTimeSystem);
|
||
|
|
GetLocalTime(&m_sStartTimeSystem);
|
||
|
|
SystemTimeToFileTime(&m_sStartTimeSystem, &sStartTimeFile);
|
||
|
|
m_nStartTimeLongLong = (
|
||
|
|
(
|
||
|
|
(LONGLONG) // Turns the whole calculation in 64 bits
|
||
|
|
sStartTimeFile.dwHighDateTime
|
||
|
|
<< 32
|
||
|
|
)
|
||
|
|
| sStartTimeFile.dwLowDateTime
|
||
|
|
);
|
||
|
|
|
||
|
|
// B..... Set the position of the bar to its beginning
|
||
|
|
SetPos
|
||
|
|
(
|
||
|
|
m_nLower
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
,i_bDisplay
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
// *** TEXT INTERFACE ***
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : SetText */
|
||
|
|
/* Role : Change the text */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* BOOL = false : NEVER */
|
||
|
|
/* true : ALWAYS */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* i_poStrMessage : New text to display */
|
||
|
|
/* i_bDisplay : Display the changes */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Set the new text */
|
||
|
|
/* B - Display the new text */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC SetText */
|
||
|
|
/* */
|
||
|
|
/* A..... Set the new text */
|
||
|
|
/* B..... Display the changes */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
BOOL CSkinProgress::SetText
|
||
|
|
( // Set the new text
|
||
|
|
LPCTSTR i_poStrMessage // New text to display
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
,BOOL i_bDisplay // = true : Display the changes
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
)
|
||
|
|
{
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// A..... Set the new text
|
||
|
|
m_oStrMessage = i_poStrMessage;
|
||
|
|
|
||
|
|
// Process
|
||
|
|
|
||
|
|
// B..... Display the changes
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
if(i_bDisplay != false)
|
||
|
|
{
|
||
|
|
RefreshPanes();
|
||
|
|
}else{}
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
|
||
|
|
// Return
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : SetProgress */
|
||
|
|
/* Role : Change the completion status text */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* BOOL = false : NEVER */
|
||
|
|
/* true : ALWAYS */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* i_nProgress : Any <eProgressSkinText> entry value */
|
||
|
|
/* i_bDisplay : Display the changes */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Set the new progress text */
|
||
|
|
/* B - Display the new progress text */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC SetProgress */
|
||
|
|
/* */
|
||
|
|
/* A..... Set the new progress text */
|
||
|
|
/* B..... Display the new progress text */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
BOOL CSkinProgress::SetProgress
|
||
|
|
( // Set <m_nProgressText> value
|
||
|
|
int i_nProgress // Set progress text
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
,BOOL i_bDisplay // = true : Display the changes
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
)
|
||
|
|
{
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// A..... Set the new progress text
|
||
|
|
m_nProgressText = i_nProgress;
|
||
|
|
|
||
|
|
// Process
|
||
|
|
|
||
|
|
// B..... Display the resized progress bar
|
||
|
|
#ifndef dCSP_TIMED_REDRAW
|
||
|
|
if(i_bDisplay != false)
|
||
|
|
{
|
||
|
|
RefreshPanes();
|
||
|
|
}else{}
|
||
|
|
#endif // dCSP_TIMED_REDRAW
|
||
|
|
|
||
|
|
// Return
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : GetProgress */
|
||
|
|
/* Role : Get the completion status message currently used */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* int : The current <m_nProgressText> value */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* None */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Return the current <m_nProgressText> value */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC GetProgress */
|
||
|
|
/* */
|
||
|
|
/* A..... Return the current <m_nProgressText> value */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
int CSkinProgress::GetProgress
|
||
|
|
( // Get <m_nProgressText> value
|
||
|
|
)
|
||
|
|
{
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// Process
|
||
|
|
|
||
|
|
// Return
|
||
|
|
|
||
|
|
// A..... Return the current <m_nProgressText> value
|
||
|
|
return m_nProgressText;
|
||
|
|
}
|
||
|
|
|
||
|
|
// *** UPDATE PROCESS ***
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : RefreshPanes */
|
||
|
|
/* Role : None */
|
||
|
|
/* Type : public */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* BOOL = false : Error while trying to resize the text */
|
||
|
|
/* true : Process completed without error */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* None */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Get the text pane pointer and dimension */
|
||
|
|
/* B - Progress pane size calculation */
|
||
|
|
/* C - Get optional message length */
|
||
|
|
/* D - Compact the text in the remaining space */
|
||
|
|
/* E - Create the complete information message */
|
||
|
|
/* F - Modify the progress bar size according of its size */
|
||
|
|
/* G - Refresh the progress bar */
|
||
|
|
/* H - Display the complete information message */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC RefreshPanes */
|
||
|
|
/* */
|
||
|
|
/* A..... Get the text pane pointer and dimension */
|
||
|
|
/* [IF it is in dialog mode, in a CWnd target pane] */
|
||
|
|
/* : [IF there is a CWnd text pane] */
|
||
|
|
/* : : AA.... Dialog CWnd text anchor */
|
||
|
|
/* : [ENDIF] */
|
||
|
|
/* [ELSE] */
|
||
|
|
/* : [IF there is a status bar] */
|
||
|
|
/* : : AB.... Status bar pane 0 */
|
||
|
|
/* : [ENDIF] */
|
||
|
|
/* [ENDIF] */
|
||
|
|
/* B..... Progress pane size calculation */
|
||
|
|
/* [IF the progress bar dimension is valid] */
|
||
|
|
/* : BA.... Set the size of the progress bar to the full width of its pane */
|
||
|
|
/* : [IF there is a text pane] */
|
||
|
|
/* : : BB.... Get text pane's DC */
|
||
|
|
/* : : [IF text in status bar] */
|
||
|
|
/* : : : BC.... Calculate the fixed size of the progress bar */
|
||
|
|
/* : : : [IF progress in pane 0 and have a fixed size] */
|
||
|
|
/* : : : : [IF size > 0] */
|
||
|
|
/* : : : : : BCA... Calculate the remaining size for the text */
|
||
|
|
/* : : : : [ELSE] */
|
||
|
|
/* : : : : : BCB... Calculate the size of the text to use */
|
||
|
|
/* : : : : [ENDIF] */
|
||
|
|
/* : : : [ELSE] */
|
||
|
|
/* : : : : BCC... Use whole width of pane 0 for the text */
|
||
|
|
/* : : : [ENDIF] */
|
||
|
|
/* : : [ELSE] */
|
||
|
|
/* : : : BD.... Use all the space of the CWnd text anchor */
|
||
|
|
/* : : [ENDIF] */
|
||
|
|
/* : : [IF text is visble] */
|
||
|
|
/* : : : C..... Get optional message length */
|
||
|
|
/* : : : [IF there is a message to add] */
|
||
|
|
/* : : : : CA.... Get the length of the cSPT_PERCENT message */
|
||
|
|
/* : : : : [IF the message is at least TIMED] */
|
||
|
|
/* : : : : : CB.... Get the length of the cSPT_TIMED message */
|
||
|
|
/* : : : : [ENDIF] */
|
||
|
|
/* : : : [ENDIF] */
|
||
|
|
/* : : : CC.... Get the length of the text to display */
|
||
|
|
/* : : : D..... Compact the text in the remaining space */
|
||
|
|
/* : : : [IF there is no message] */
|
||
|
|
/* : : : : DA.... Compact the text according to just its length */
|
||
|
|
/* : : : [ELSE] */
|
||
|
|
/* : : : : DB.... Compact the text minus the length of the cSPT_PERCENT */
|
||
|
|
/* : : : [ELSE] */
|
||
|
|
/* : : : : DC.... Compact the text minus the length of the cSPT_TIMED */
|
||
|
|
/* : : : [ELSE] */
|
||
|
|
/* : : : : DD.... Compact the text according to the remaining place */
|
||
|
|
/* : : : : [IF the message is at least TIMED] */
|
||
|
|
/* : : : : : DDA... Try to compact the text with cSPT_TIMED at first */
|
||
|
|
/* : : : : [ELSE] */
|
||
|
|
/* : : : : : [IF the message is at least TIMED] */
|
||
|
|
/* : : : : : : DDB... Reset the text */
|
||
|
|
/* : : : : : : DDC... Calculate the length of the three dots */
|
||
|
|
/* : : : : : : DDD... Compact the text minus the three doted cSPT_PERCENT */
|
||
|
|
/* : : : : : : DDE... Indicate the message used is cRTP_PERCENT */
|
||
|
|
/* : : : : : [ELSE] */
|
||
|
|
/* : : : : : : DDF... Indicate the message used is cSPT_TIMED */
|
||
|
|
/* : : : : : [ENDIF] */
|
||
|
|
/* : : : : [ENDIF] */
|
||
|
|
/* : : : [ELSE] */
|
||
|
|
/* : : : : DE.... Compact the text according to just its length */
|
||
|
|
/* : : : [ENDIF] */
|
||
|
|
/* : : : [IF there is no message] */
|
||
|
|
/* : : : : DF.... Indicate the text is completely compacted, */
|
||
|
|
/* : : : [ENDIF] */
|
||
|
|
/* : : : [IF there is no message] */
|
||
|
|
/* : : : : DG.... Indicate that there is no text, but perhaps a message */
|
||
|
|
/* : : : [ENDIF] */
|
||
|
|
/* : : : E..... Create the complete information message */
|
||
|
|
/* : : : [IF there is no message] */
|
||
|
|
/* : : : : EA.... Add the cSPT_PERCENT message */
|
||
|
|
/* : : : [ELSE] */
|
||
|
|
/* : : : : EB.... Add the cSPT_TIMED message */
|
||
|
|
/* : : : [ELSE] */
|
||
|
|
/* : : : : [IF the message is at least TIMED] */
|
||
|
|
/* : : : : : EC.... Add the cSPT_PERCENT message */
|
||
|
|
/* : : : : [ELSE] */
|
||
|
|
/* : : : : : ED.... Add the cSPT_TIMED message */
|
||
|
|
/* : : : : [ENDIF] */
|
||
|
|
/* : : : [ENDIF] */
|
||
|
|
/* : : : EE.... Scrub the text to delete trailing characters */
|
||
|
|
/* : : : F..... Modify the progress bar size according of its size */
|
||
|
|
/* : : : [IF there is no message] */
|
||
|
|
/* : : : : FA.... Get the length of the complete text plus its margin */
|
||
|
|
/* : : : [ENDIF] */
|
||
|
|
/* : : : [IF there is no message] */
|
||
|
|
/* : : : : FB.... Get the maximum length of the text pane */
|
||
|
|
/* : : : [ENDIF] */
|
||
|
|
/* : : : FC.... Set the new progress bar rectangle */
|
||
|
|
/* : : : FD.... Move the left side of the progress bar after the text */
|
||
|
|
/* : : : FE.... Move the right side of the text to the beginning of the bar */
|
||
|
|
/* : : [ENDIF] */
|
||
|
|
/* : : FF.... Make sure the previous text is erased */
|
||
|
|
/* : [ENDIF] */
|
||
|
|
/* : G..... Refresh the progress bar */
|
||
|
|
/* : [IF the progress bar is visible] */
|
||
|
|
/* : : [IF text is visble] */
|
||
|
|
/* : : : GA.... Move the progress bar */
|
||
|
|
/* : : [ELSE] */
|
||
|
|
/* : : : [IF there is no message] */
|
||
|
|
/* : : : : GB.... Display the modified progress bar */
|
||
|
|
/* : : : [ENDIF] */
|
||
|
|
/* : : [ENDIF] */
|
||
|
|
/* : [ENDIF] */
|
||
|
|
/* : H..... Display the complete information message */
|
||
|
|
/* : [IF the progress bar is visible] */
|
||
|
|
/* : : [IF text is visble] */
|
||
|
|
/* : : : [IF there is no message] */
|
||
|
|
/* : : : : HA.... Text in pane 0 of the status bar */
|
||
|
|
/* : : : [ELSE] */
|
||
|
|
/* : : : : HB.... Text in the CWnd text pane */
|
||
|
|
/* : : : [ENDIF] */
|
||
|
|
/* : : [ENDIF] */
|
||
|
|
/* : [ENDIF] */
|
||
|
|
/* [ENDIF] */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
#define cRTP_BLOCK ( 1 << 0)
|
||
|
|
#define cRTP_NOTEXT (cRTP_BLOCK << 1)
|
||
|
|
#define cRTP_PERCENT (cRTP_NOTEXT << 1)
|
||
|
|
#define cRTP_TIMED (cRTP_PERCENT << 1)
|
||
|
|
BOOL CSkinProgress::RefreshPanes
|
||
|
|
( // Resize the text pane and the progress bar
|
||
|
|
)
|
||
|
|
{
|
||
|
|
CStatusBar* poStatusBar;
|
||
|
|
CWnd* poTextCWnd;
|
||
|
|
CFont* poFontOld;
|
||
|
|
|
||
|
|
CString oStrMessage; // Working buffer for m_oStrMessage
|
||
|
|
CString oStrPercent; // Percent of completion level
|
||
|
|
CString oStrTimed; // Timed completion level
|
||
|
|
|
||
|
|
int nProgressText; // Absolute value of <m_nProgressText>
|
||
|
|
|
||
|
|
int nLenMessage; // Len of m_oStrMessage in pixel
|
||
|
|
int nLenPercent; // Len of oStrPercent in pixel
|
||
|
|
int nLenTimed; // Len of oStrTimed in pixel
|
||
|
|
int nLenMargin; // Len of 2*' ' in pixel
|
||
|
|
int nLenCompact; // Number of character packed
|
||
|
|
|
||
|
|
int nLenText; // Allowed len of the text (used to wrap it)
|
||
|
|
int nLenPane; //
|
||
|
|
int nLenBlock; // Flags for computation (text wrapping)
|
||
|
|
|
||
|
|
CRect oRectText; // Rect of pane 0 -> oRectPane at the end of the process if m_nPane == 0
|
||
|
|
CRect oRectPane; // Rect of pane m_nPane, can be also pane 0
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
poStatusBar = NULL; // AVOID /W4 -> HA.... *STUPID COMPILER*
|
||
|
|
poTextCWnd = NULL; // AVOID /W4 -> BA.... *STUPID COMPILER*
|
||
|
|
|
||
|
|
nLenPercent = 0; // AVOID /W4 -> DB.... *STUPID COMPILER*
|
||
|
|
nLenTimed = 0; // AVOID /W4 -> DDA... *STUPID COMPILER*
|
||
|
|
nLenText = 0; // AVOID /W4 -> DE.... *STUPID COMPILER*
|
||
|
|
nLenBlock = 0; // AVOID /W4 -> F..... *STUPID COMPILER*
|
||
|
|
|
||
|
|
if(m_nProgressText < 0)
|
||
|
|
{
|
||
|
|
nProgressText = 0 - m_nProgressText; // Make it positive
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
nProgressText = m_nProgressText;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Process + Return
|
||
|
|
|
||
|
|
|
||
|
|
if(IsWindow(GetSafeHwnd()))
|
||
|
|
{
|
||
|
|
// A..... Get the text pane pointer and dimension
|
||
|
|
#ifdef dCSP_DIALOG_PROGRESS
|
||
|
|
if(m_poWndProgress != NULL)
|
||
|
|
{
|
||
|
|
// AA.... Dialog CWnd text anchor
|
||
|
|
if(m_poWndMessage != NULL)
|
||
|
|
{
|
||
|
|
poTextCWnd = m_poWndMessage;
|
||
|
|
poTextCWnd->GetWindowRect(oRectText);
|
||
|
|
}else{}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
#endif // dCSP_DIALOG_PROGRESS
|
||
|
|
poStatusBar = GetStatusBar();
|
||
|
|
if(poStatusBar != NULL)
|
||
|
|
{
|
||
|
|
// AB.... Status bar pane 0
|
||
|
|
poTextCWnd = poStatusBar;
|
||
|
|
poStatusBar->GetItemRect(0, oRectText);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
#ifdef dCSP_DIALOG_PROGRESS
|
||
|
|
}
|
||
|
|
#endif // dCSP_DIALOG_PROGRESS
|
||
|
|
|
||
|
|
// B..... Progress pane size calculation
|
||
|
|
if(GetTargetRect(&oRectPane))
|
||
|
|
{
|
||
|
|
// BA.... Set the size of the progress bar to the full width of its current pane
|
||
|
|
nLenPane = oRectPane.Width();
|
||
|
|
|
||
|
|
if(poTextCWnd != NULL)
|
||
|
|
{
|
||
|
|
// BB.... Get text pane's DC
|
||
|
|
CClientDC oDC(poTextCWnd);
|
||
|
|
poFontOld = oDC.SelectObject(poTextCWnd->GetFont());
|
||
|
|
|
||
|
|
#ifdef dCSP_DIALOG_PROGRESS
|
||
|
|
if(m_poWndProgress == NULL)
|
||
|
|
{
|
||
|
|
#endif // dCSP_DIALOG_PROGRESS
|
||
|
|
// BC.... Calculate the fixed size of the progress bar
|
||
|
|
if(
|
||
|
|
(m_nPane == 0)
|
||
|
|
&& (m_nSize != 0)
|
||
|
|
)
|
||
|
|
{ // If the text pane is shared with the progress bar, calculate how much space the text takes up
|
||
|
|
if(m_nSize > 0)
|
||
|
|
{ // Force progress bar size
|
||
|
|
// BCA... Calculate the remaining size for the text once removed the fixed size of the progress bar
|
||
|
|
nLenPane = oRectText.Width() - (m_nSize - 3); // Minus 3 to keep the same spacing with the others ways just below, to resize the text
|
||
|
|
nLenText = nLenPane; // Use the remaining space left by the resized progress bar
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Resize the progress bar if the text is too long
|
||
|
|
// BCB... Calculate the size of the text to use (here the whole width of pane 0)
|
||
|
|
nLenPane = oRectText.Width() + m_nSize; // *BEWARE* : m_nSize < 0 -> Get the optimal width of the progress bar before resizing it if necessary
|
||
|
|
nLenText = oRectText.Width() - 3; // Use the whole space of pane 0, minus 3 to avoid a complete pane 0 disclosure leading to a windows bug
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Resize the text if it is too long (even in pane 0 if m_nSize == 0)
|
||
|
|
// BCC... Use whole width of pane 0 for the text, and what remains for the progress bar
|
||
|
|
nLenPane = 0; // Full length for the progress bar, might be resized for pane 0
|
||
|
|
nLenText = oRectText.Width() - 3; // Use the whole space of pane 0, minus 3 to avoid a complete pane 0 disclosure leading to a windows bug
|
||
|
|
}
|
||
|
|
#ifdef dCSP_DIALOG_PROGRESS
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
// BD.... Use all the space of the CWnd text anchor
|
||
|
|
if(poTextCWnd != NULL)
|
||
|
|
{ // Use the whole lenght of the CWnd text pane
|
||
|
|
nLenText = oRectText.Width();
|
||
|
|
}else{}
|
||
|
|
}
|
||
|
|
#endif // dCSP_DIALOG_PROGRESS
|
||
|
|
|
||
|
|
if(poTextCWnd->IsWindowVisible())
|
||
|
|
{ // Redraw the text window
|
||
|
|
// C..... Get optional message length
|
||
|
|
if(nProgressText != cSPT_NONE)
|
||
|
|
{ // Calculate progress text
|
||
|
|
// CA.... Get the length of the cSPT_PERCENT message
|
||
|
|
oStrPercent.Format
|
||
|
|
(
|
||
|
|
_T("%d%%"),
|
||
|
|
(int) // Result on 'int'
|
||
|
|
( // From 0 to 100
|
||
|
|
(
|
||
|
|
(LONGLONG) // Turns the whole calculation in 64 bits
|
||
|
|
(m_nRight - m_nLower)
|
||
|
|
* 100
|
||
|
|
)
|
||
|
|
/ (m_nUpper - m_nLower)
|
||
|
|
)
|
||
|
|
);
|
||
|
|
|
||
|
|
if(m_nProgressText > 0)
|
||
|
|
{
|
||
|
|
oStrPercent = _T("(") + oStrPercent + _T(")");
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
oStrPercent = _T(" ") + oStrPercent;
|
||
|
|
nLenPercent = oDC.GetTextExtent(oStrPercent).cx; // Length of Percent
|
||
|
|
|
||
|
|
if(nProgressText >= cSPT_TIMED)
|
||
|
|
{
|
||
|
|
// CB.... Get the length of the cSPT_TIMED message
|
||
|
|
GetTimed(&oStrTimed);
|
||
|
|
nLenTimed = oDC.GetTextExtent(oStrTimed).cx; // Length of Timed
|
||
|
|
}else{}
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// CC.... Get the length of the text to display
|
||
|
|
oStrMessage = m_oStrMessage;
|
||
|
|
nLenMessage = oDC.GetTextExtent(oStrMessage).cx; // Length of Message
|
||
|
|
nLenMargin = oDC.GetTextExtent(_T(" ")).cx << 1; // Text margin
|
||
|
|
|
||
|
|
// D..... Compact the text in the remaining space
|
||
|
|
// Dompact the text
|
||
|
|
switch(nProgressText)
|
||
|
|
{
|
||
|
|
case cSPT_NONE :
|
||
|
|
// DA.... Compact the text according to just its length
|
||
|
|
nLenCompact = CompactText(&oStrMessage, &oDC, nLenText, nLenMargin);
|
||
|
|
break;
|
||
|
|
case cSPT_PERCENT :
|
||
|
|
// DB.... Compact the text according to its length minus the length of the cSPT_PERCENT message
|
||
|
|
nLenCompact = CompactText(&oStrMessage, &oDC, nLenText, nLenMargin + nLenPercent);
|
||
|
|
break;
|
||
|
|
case cSPT_TIMED :
|
||
|
|
// DC.... Compact the text according to its length minus the length of the cSPT_TIMED message
|
||
|
|
nLenCompact = CompactText(&oStrMessage, &oDC, nLenText, nLenMargin + nLenTimed);
|
||
|
|
break;
|
||
|
|
case cSPT_AUTOSIZE :
|
||
|
|
// DD.... Compact the text according to the most usable remaining place between the text and the progress bar
|
||
|
|
// DDA... Try to compact the text with the cSPT_TIMED message at first
|
||
|
|
nLenCompact = CompactText(&oStrMessage, &oDC, nLenText, nLenMargin + nLenTimed);
|
||
|
|
if(
|
||
|
|
(nLenCompact != 0)
|
||
|
|
&& (nLenCompact != oStrMessage.GetLength())
|
||
|
|
)
|
||
|
|
{ // If the message was compacted, try with Percent
|
||
|
|
// DDB... Reset the text
|
||
|
|
oStrMessage = m_oStrMessage; // Restore the message
|
||
|
|
|
||
|
|
// DDC... Calculate the length of the three dots that will be displayed after the cSPT_PERCENT message
|
||
|
|
// In case of Timed wrapping, use Percent instead, but add "..." to show that the Timed information was wrapped
|
||
|
|
oStrPercent += "...";
|
||
|
|
nLenPercent = oDC.GetTextExtent(oStrPercent).cx; // Length of Percent
|
||
|
|
|
||
|
|
// DDD... Compact the text according to its length minus the length of the cSPT_PERCENT message and the added three dots
|
||
|
|
// Dompact the Percent + "..." information
|
||
|
|
nLenCompact = CompactText(&oStrMessage, &oDC, nLenText, nLenMargin + nLenPercent);
|
||
|
|
// DDE... Indicate the message used is cRTP_PERCENT
|
||
|
|
nLenBlock |= cRTP_PERCENT;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // There was enough place to add the Timed information
|
||
|
|
// DDF... Indicate the message used is cSPT_TIMED
|
||
|
|
nLenBlock |= cRTP_TIMED;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
default :
|
||
|
|
// DE.... Compact the text according to just its length
|
||
|
|
nLenCompact = CompactText(&oStrMessage, &oDC, nLenText, nLenMargin);
|
||
|
|
}
|
||
|
|
|
||
|
|
#ifdef dCSP_DIALOG_PROGRESS
|
||
|
|
if(m_poWndProgress == NULL)
|
||
|
|
{
|
||
|
|
#endif // dCSP_DIALOG_PROGRESS
|
||
|
|
// Block the text wrapping if there is nothing more to wrap
|
||
|
|
if(
|
||
|
|
(nLenCompact < 0)
|
||
|
|
|| (
|
||
|
|
(oStrMessage.GetLength() <= 4)
|
||
|
|
&& (oStrMessage.Right(3) == "...")
|
||
|
|
)
|
||
|
|
)
|
||
|
|
{
|
||
|
|
// DF.... Indicate the text is completely compacted,
|
||
|
|
nLenBlock |= cRTP_BLOCK;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
if(oStrMessage == "")
|
||
|
|
{
|
||
|
|
// DG.... Indicate that there is no text, but there might be a message
|
||
|
|
nLenBlock |= cRTP_NOTEXT;
|
||
|
|
}else{}
|
||
|
|
#ifdef dCSP_DIALOG_PROGRESS
|
||
|
|
}else{}
|
||
|
|
#endif // dCSP_DIALOG_PROGRESS
|
||
|
|
|
||
|
|
// E..... Create the complete information message with the user text and the completion report
|
||
|
|
// Add the information
|
||
|
|
switch(nProgressText)
|
||
|
|
{
|
||
|
|
case cSPT_NONE :
|
||
|
|
break;
|
||
|
|
case cSPT_PERCENT :
|
||
|
|
// EA.... Add the cSPT_PERCENT message
|
||
|
|
oStrMessage += oStrPercent;
|
||
|
|
break;
|
||
|
|
case cSPT_TIMED :
|
||
|
|
// EB.... Add the cSPT_TIMED message
|
||
|
|
oStrMessage += oStrTimed;
|
||
|
|
break;
|
||
|
|
case cSPT_AUTOSIZE :
|
||
|
|
if((nLenBlock & cRTP_PERCENT) != 0)
|
||
|
|
{ // If the message was compacted, try with Percent
|
||
|
|
// EC.... Add the cSPT_PERCENT message
|
||
|
|
oStrMessage += oStrPercent;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // There was enough place to add the Timed information
|
||
|
|
// ED.... Add the cSPT_TIMED message
|
||
|
|
oStrMessage += oStrTimed;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
default :
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
// EE.... Scrub the text to delete trailing characters
|
||
|
|
oStrMessage.TrimLeft();
|
||
|
|
|
||
|
|
#ifdef dCSP_DIALOG_PROGRESS
|
||
|
|
if(m_poWndProgress == NULL)
|
||
|
|
{
|
||
|
|
#endif // dCSP_DIALOG_PROGRESS
|
||
|
|
// F..... Modify the progress bar size according of its size
|
||
|
|
if(m_nPane == 0)
|
||
|
|
{ // If the text pane is shared with the progress bar, calculate how much space the text takes up to
|
||
|
|
nLenMessage = oDC.GetTextExtent(oStrMessage).cx; // Length of the compacted Message
|
||
|
|
|
||
|
|
if(
|
||
|
|
(
|
||
|
|
(
|
||
|
|
(nLenMessage + nLenMargin) // Lenght of Message + Margin
|
||
|
|
> (nLenPane) // Lenght of remaining space for text
|
||
|
|
)
|
||
|
|
&& (
|
||
|
|
(m_nSize <= 0) // Resize of the progress bar if the text is longer, also used for m_nSize == 0
|
||
|
|
|| (
|
||
|
|
(nLenMessage > 0)
|
||
|
|
&& ((nLenBlock & cRTP_NOTEXT) != 0)
|
||
|
|
)
|
||
|
|
)
|
||
|
|
)
|
||
|
|
|| ((nLenBlock & cRTP_BLOCK) != 0) // Avoid paning if the text is wrapped to the max (when only "...'+information remains)
|
||
|
|
)
|
||
|
|
{ // *IF* the packed text is larger than the space left by the resized progress bar *AND* the resizing of the progress bar is allowed *OR* the wrapping is blocked
|
||
|
|
// FA.... Get the length of the complete text plus its margin
|
||
|
|
nLenPane = nLenMessage;
|
||
|
|
|
||
|
|
if(nLenMessage > 0)
|
||
|
|
{
|
||
|
|
nLenPane += nLenMargin;
|
||
|
|
}else{}
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
if(nLenPane > oRectText.Width())
|
||
|
|
{ // Make sure the length will stay positive
|
||
|
|
// FB.... Get the maximum length of the text pane
|
||
|
|
nLenPane = oRectText.Width();
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
if(nLenPane < 2)
|
||
|
|
{
|
||
|
|
nLenPane = 2;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// FC.... Set the new progress bar rectangle
|
||
|
|
// This is the pane to display
|
||
|
|
oRectPane = oRectText;
|
||
|
|
|
||
|
|
// FD.... Move the left side of the progress bar to the right of the text
|
||
|
|
// Move left edge of the progress bar to the right, to leave some place for the text
|
||
|
|
oRectPane.left = nLenPane;
|
||
|
|
|
||
|
|
// FE.... Move the right side of the text to the beginning of the bar
|
||
|
|
oRectText.right = nLenPane;
|
||
|
|
}else{}
|
||
|
|
#ifdef dCSP_DIALOG_PROGRESS
|
||
|
|
}else{}
|
||
|
|
#endif // dCSP_DIALOG_PROGRESS
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// FF.... Make sure the previous text is erased, so display at least a space character
|
||
|
|
if(oStrMessage == "")
|
||
|
|
{
|
||
|
|
oStrMessage = " "; // If no text, force the pane to be cleared
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// Release DC
|
||
|
|
oDC.SelectObject(poFontOld);
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
if(IsWindowVisible())
|
||
|
|
{
|
||
|
|
// G..... Refresh the progress bar
|
||
|
|
if(
|
||
|
|
(m_oRectPane != oRectPane)
|
||
|
|
&& ( // Avoid pane disclosure, so that you can reopen the window and the pane won't stay closed
|
||
|
|
(oRectPane.Width() > 2)
|
||
|
|
&& (oRectPane.Height() > 2)
|
||
|
|
)
|
||
|
|
)
|
||
|
|
{
|
||
|
|
// GA.... Move the progress bar
|
||
|
|
m_oRectPane = oRectPane; // The new progress rectangle
|
||
|
|
MoveWindow(&oRectPane);
|
||
|
|
Invalidate(); // Display the progress bar on its new position
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
if(UpdateProgress())
|
||
|
|
{
|
||
|
|
// GB.... Display the modified progress bar
|
||
|
|
Invalidate(); // Display the changes
|
||
|
|
}else{}
|
||
|
|
}
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
if(poTextCWnd != NULL)
|
||
|
|
{
|
||
|
|
if(m_oStrPrevMessage != oStrMessage)
|
||
|
|
{ // If the new message has changed from the previous, set it
|
||
|
|
// H..... Display the complete information message
|
||
|
|
#ifdef dCSP_DIALOG_PROGRESS
|
||
|
|
if(m_poWndProgress == NULL)
|
||
|
|
{
|
||
|
|
#endif // dCSP_DIALOG_PROGRESS
|
||
|
|
// HA.... Text in pane 0 of the status bar
|
||
|
|
poStatusBar->SetPaneText(0, oStrMessage); // Force text in pane 0
|
||
|
|
m_oStrPrevMessage = oStrMessage;
|
||
|
|
#ifdef dCSP_DIALOG_PROGRESS
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
if(m_poWndMessage != NULL)
|
||
|
|
{
|
||
|
|
// HB.... Text in the CWnd text pane
|
||
|
|
m_poWndMessage->SetWindowText(oStrMessage);
|
||
|
|
m_oStrPrevMessage = oStrMessage;
|
||
|
|
}else{}
|
||
|
|
}
|
||
|
|
#endif // dCSP_DIALOG_PROGRESS
|
||
|
|
}else{}
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// *** DATA PROCESS ***
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : CompactText */
|
||
|
|
/* Role : None */
|
||
|
|
/* Type : PROTECTED */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* int : > 0 = Number of character packed */
|
||
|
|
/* 0 = Nothing packed */
|
||
|
|
/* < 0 = Pack blocked */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* io_poString : Packed and three-doted text */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* io_poString : Text to compact */
|
||
|
|
/* i_poDC : Target DC */
|
||
|
|
/* i_nMaxWidth : Width in pixel the text should fits in */
|
||
|
|
/* i_nAddWidth : Additional width for some purposes */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Get the current DC */
|
||
|
|
/* B - Remove any ending dots */
|
||
|
|
/* C - Verify there is something to do */
|
||
|
|
/* D - Check if the text can be compacted */
|
||
|
|
/* E - Compact the string */
|
||
|
|
/* F - Add the three dots at the end of the string */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC CompactText */
|
||
|
|
/* */
|
||
|
|
/* [IF a string is provided to process] */
|
||
|
|
/* : [IF no DC specified] */
|
||
|
|
/* : : A..... Get the current DC */
|
||
|
|
/* : [ENDIF] */
|
||
|
|
/* : [IF there is ending dots] */
|
||
|
|
/* : : B..... Remove any ending dots */
|
||
|
|
/* : [ENDIF] */
|
||
|
|
/* : C..... Verify there is something to do */
|
||
|
|
/* : [IF something have to be done] */
|
||
|
|
/* : : D..... Check if the text can be compacted */
|
||
|
|
/* : : [IF the text can be compacted] */
|
||
|
|
/* : : : E..... Compact the string as long as it does'nt fit */
|
||
|
|
/* : : : D..... Add the three dots at the end of the string */
|
||
|
|
/* : : [ENDIF] */
|
||
|
|
/* : [ENDIF] */
|
||
|
|
/* [ENDIF] */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* Quite easy and fun to use... No trailing blank characters ! */
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
int CSkinProgress::CompactText
|
||
|
|
(
|
||
|
|
CString* io_poString,
|
||
|
|
CDC* i_poDC,
|
||
|
|
int i_nMaxWidth,
|
||
|
|
int i_nAddWidth
|
||
|
|
)
|
||
|
|
{
|
||
|
|
int nLenString;
|
||
|
|
int nLenDots;
|
||
|
|
int nCountChar;
|
||
|
|
TCHAR nFirstChar;
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
if(io_poString != NULL)
|
||
|
|
{
|
||
|
|
if(i_poDC == NULL)
|
||
|
|
{ // If no target device context provided, use the current one
|
||
|
|
// A..... Get the current DC
|
||
|
|
CClientDC oDC(this);
|
||
|
|
i_poDC = &oDC;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
nLenString = io_poString->GetLength();
|
||
|
|
if(io_poString->Right(3) == "...")
|
||
|
|
{
|
||
|
|
// B..... Remove any ending dots
|
||
|
|
nLenString -= 3;
|
||
|
|
*io_poString = io_poString->Left(nLenString);
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// Process + Return
|
||
|
|
|
||
|
|
// C..... Verify there is something to do
|
||
|
|
if(
|
||
|
|
(nLenString == 0) // No text
|
||
|
|
|| ( // Enough space for the unmodified text and the margin
|
||
|
|
(i_poDC->GetTextExtent(*io_poString, nLenString).cx + i_nAddWidth)
|
||
|
|
<= i_nMaxWidth
|
||
|
|
)
|
||
|
|
)
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
// D..... Check if the three doted first character is longer than the whole string (VERY few characters only)
|
||
|
|
nFirstChar = io_poString->GetAt(0);
|
||
|
|
nLenDots = i_poDC->GetTextExtent(anThreeDots, sizeof(anThreeDots)).cx;
|
||
|
|
|
||
|
|
if(
|
||
|
|
i_poDC->GetTextExtent(*io_poString, nLenString).cx
|
||
|
|
<= (i_poDC->GetTextExtent(&nFirstChar, sizeof(nFirstChar)).cx + nLenDots)
|
||
|
|
)
|
||
|
|
{
|
||
|
|
return (0 - nLenString);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
nCountChar = 0;
|
||
|
|
|
||
|
|
// E..... Compact the string as long as it does'nt fit in the desired space
|
||
|
|
while( // As long as something remains *AND* the stuff is bigger than the allowed space
|
||
|
|
(nLenString > 1) // Leading character must remain at least
|
||
|
|
&& (
|
||
|
|
(i_poDC->GetTextExtent(*io_poString, nLenString).cx + (nLenDots >> 1) + i_nAddWidth)
|
||
|
|
> i_nMaxWidth
|
||
|
|
)
|
||
|
|
)
|
||
|
|
{
|
||
|
|
*io_poString = io_poString->Left(io_poString->GetLength() - 1); // BEWARE : Modify the original object
|
||
|
|
io_poString->TrimRight(); // Kill spaces
|
||
|
|
nLenString = io_poString->GetLength(); // Get the real length after trim
|
||
|
|
nCountChar += 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
// F..... Add the three dots at the end of the string
|
||
|
|
*io_poString += anThreeDots;
|
||
|
|
|
||
|
|
return nCountChar;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : GetTimed */
|
||
|
|
/* Role : Get a complete and accurate timed text message */
|
||
|
|
/* Type : PROTECTED */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* BOOL = false : NEVER */
|
||
|
|
/* true : ALWAYS */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* o_poTimed : Timed message */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* None */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Get current date and time */
|
||
|
|
/* B - Add start date in timed message if necessary */
|
||
|
|
/* C - Add start time int timed message */
|
||
|
|
/* D - Add the time elapsed from start */
|
||
|
|
/* E - Add the current progress completion status */
|
||
|
|
/* F - Add the remaining progress completion */
|
||
|
|
/* G - Get the remaining time before end */
|
||
|
|
/* H - Display the expected date and time of the end */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC GetTimed */
|
||
|
|
/* */
|
||
|
|
/* A..... Get current date and time */
|
||
|
|
/* B..... Add start date in timed message if necessary */
|
||
|
|
/* C..... Add start time int timed message */
|
||
|
|
/* D..... Add the time elapsed from start */
|
||
|
|
/* E..... Add the current progress completion status */
|
||
|
|
/* F..... Add the remaining progress completion */
|
||
|
|
/* G..... Get the remaining time before end */
|
||
|
|
/* H..... Display the expected date and time of the end */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* I will in the next update recode a bit this mess because if the progress */
|
||
|
|
/* is not linear, the end time is far from being accurate. You might see that */
|
||
|
|
/* when grabing the bottom-right corner of the main window to resize it. It */
|
||
|
|
/* block the progress, but the timer continue to elapse, so the end time */
|
||
|
|
/* grows fast. Then, once you release the corner, the progress restart, but */
|
||
|
|
/* then the time to finish is quite short so the remaining time decrease very */
|
||
|
|
/* fast, instead to readapt to show a 1:1 linear timer till the end. */
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
BOOL CSkinProgress::GetTimed
|
||
|
|
(
|
||
|
|
CString* o_poTimed
|
||
|
|
)
|
||
|
|
{
|
||
|
|
CString oStrTempo;
|
||
|
|
unsigned long nTempo;
|
||
|
|
|
||
|
|
SYSTEMTIME sCurrentTimeSystem;
|
||
|
|
SYSTEMTIME sTempoTimeSystem;
|
||
|
|
FILETIME sTempoTimeFile;
|
||
|
|
LONGLONG nTempoTimeLongLong;
|
||
|
|
LONGLONG nDeltaTimeLongLong;
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// A..... Get current date and time
|
||
|
|
// GetSystemTime(&nCurrentTime);
|
||
|
|
GetLocalTime(&sTempoTimeSystem);
|
||
|
|
sCurrentTimeSystem = sTempoTimeSystem; // For the Date of End and Time of End
|
||
|
|
SystemTimeToFileTime(&sTempoTimeSystem, &sTempoTimeFile);
|
||
|
|
nTempoTimeLongLong = (
|
||
|
|
(
|
||
|
|
(LONGLONG) // Turns the whole calculation in 64 bits
|
||
|
|
sTempoTimeFile.dwHighDateTime
|
||
|
|
<< 32
|
||
|
|
)
|
||
|
|
| sTempoTimeFile.dwLowDateTime
|
||
|
|
);
|
||
|
|
|
||
|
|
// Process
|
||
|
|
|
||
|
|
*o_poTimed = _T(" ");
|
||
|
|
if(m_nProgressText > 0)
|
||
|
|
{
|
||
|
|
*o_poTimed += _T("(");
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// B..... Add start date in timed message if necessary
|
||
|
|
if( // *IF* Date of Start is different from Current Date
|
||
|
|
(sTempoTimeSystem.wDay != m_sStartTimeSystem.wDay) // Check what change first, days
|
||
|
|
|| (sTempoTimeSystem.wMonth != m_sStartTimeSystem.wMonth)
|
||
|
|
|| (sTempoTimeSystem.wYear != m_sStartTimeSystem.wYear)
|
||
|
|
)
|
||
|
|
{ // Date of Start
|
||
|
|
oStrTempo.Format
|
||
|
|
(
|
||
|
|
_T("%04d/%02d/%02d/%02d "),
|
||
|
|
m_sStartTimeSystem.wYear,
|
||
|
|
m_sStartTimeSystem.wMonth,
|
||
|
|
m_sStartTimeSystem.wDay,
|
||
|
|
m_sStartTimeSystem.wDayOfWeek + 1
|
||
|
|
);
|
||
|
|
*o_poTimed += oStrTempo;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// C..... Add start time in timed message
|
||
|
|
// Time of Start
|
||
|
|
oStrTempo.Format
|
||
|
|
(
|
||
|
|
_T("%02d:%02d:%02d - "),
|
||
|
|
m_sStartTimeSystem.wHour,
|
||
|
|
m_sStartTimeSystem.wMinute,
|
||
|
|
m_sStartTimeSystem.wSecond
|
||
|
|
);
|
||
|
|
*o_poTimed += oStrTempo;
|
||
|
|
|
||
|
|
// D..... Add the time elapsed from start
|
||
|
|
// Calculate time from start
|
||
|
|
nDeltaTimeLongLong = nTempoTimeLongLong - m_nStartTimeLongLong;
|
||
|
|
nTempoTimeLongLong = nDeltaTimeLongLong; // Keep nDeltaTimeLongLong safe
|
||
|
|
sTempoTimeFile.dwLowDateTime = (DWORD) nTempoTimeLongLong;
|
||
|
|
sTempoTimeFile.dwHighDateTime = (DWORD) ((LONGLONG) nTempoTimeLongLong >> 32);
|
||
|
|
FileTimeToSystemTime(&sTempoTimeFile, &sTempoTimeSystem);
|
||
|
|
sTempoTimeSystem.wYear -= 1600; // Starts from 1601, so if 1601 you get year 1
|
||
|
|
|
||
|
|
// Day from start
|
||
|
|
if(
|
||
|
|
(sTempoTimeSystem.wYear != 1)
|
||
|
|
|| (sTempoTimeSystem.wMonth != 1)
|
||
|
|
|| (sTempoTimeSystem.wDay != 1)
|
||
|
|
)
|
||
|
|
{ // If not the same day, calculate the number of days elapsed from start
|
||
|
|
nTempo = (unsigned long) (
|
||
|
|
nTempoTimeLongLong // Already in 64 bits, so the calculation will be done in 64 bits
|
||
|
|
/ (nDeltaTimeLongLong / 864000000000) // Number of days given in 100 nanosecond (0.1us)
|
||
|
|
);
|
||
|
|
|
||
|
|
if(nTempo != 0)
|
||
|
|
{ // If there is some days elapsed
|
||
|
|
oStrTempo.Format(_T("%d:"), nTempo);
|
||
|
|
*o_poTimed += oStrTempo;
|
||
|
|
}else{}
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// Time from start
|
||
|
|
oStrTempo.Format
|
||
|
|
(
|
||
|
|
_T("%02d:%02d:%02d - "),
|
||
|
|
sTempoTimeSystem.wHour,
|
||
|
|
sTempoTimeSystem.wMinute,
|
||
|
|
sTempoTimeSystem.wSecond
|
||
|
|
);
|
||
|
|
*o_poTimed += oStrTempo;
|
||
|
|
|
||
|
|
// E..... Add the current progress completion status
|
||
|
|
// Elapsed percent
|
||
|
|
#ifndef dCSP_SLIDERBAR_METHOD
|
||
|
|
nTempo = (int) ( // 100% *256 to keep a pseudo 8-bits fixed point value (0.00390625 - 1/256 - resolution)
|
||
|
|
(
|
||
|
|
(LONGLONG) // Turns the whole calculation in 64 bits
|
||
|
|
(m_nRight - m_nLower)
|
||
|
|
* 25600
|
||
|
|
)
|
||
|
|
/ (m_nUpper - m_nLower)
|
||
|
|
);
|
||
|
|
#else
|
||
|
|
nTempo = (int) ( // 100% *256 to keep a pseudo 8-bits fixed point value (0.00390625 - 1/256 - resolution)
|
||
|
|
(
|
||
|
|
(LONGLONG) // Turns the whole calculation in 64 bits
|
||
|
|
(m_nRight - m_nLeft)
|
||
|
|
* 25600
|
||
|
|
)
|
||
|
|
/ (m_nUpper - m_nLower)
|
||
|
|
);
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
oStrTempo.Format(_T("%d%% / "), nTempo >> 8); // '>> 8' == '/ 256'
|
||
|
|
*o_poTimed += oStrTempo;
|
||
|
|
|
||
|
|
// F..... Add the remaining progress completion
|
||
|
|
// Remaining percent
|
||
|
|
oStrTempo.Format(_T("%d%% - "), 100 - (nTempo >> 8));
|
||
|
|
*o_poTimed += oStrTempo;
|
||
|
|
|
||
|
|
// G..... Get the remaining time before end
|
||
|
|
// Remaining time
|
||
|
|
if(nTempo == 0)
|
||
|
|
{ // Avoid zero divide
|
||
|
|
nTempoTimeLongLong = 0; // No more time to wait
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
nTempoTimeLongLong = ((nDeltaTimeLongLong * 25600) / nTempo) - nDeltaTimeLongLong; // The remaining time, 100% - Elasped (100% = Elapsed / Percent)
|
||
|
|
}
|
||
|
|
sTempoTimeFile.dwLowDateTime = (DWORD) nTempoTimeLongLong;
|
||
|
|
sTempoTimeFile.dwHighDateTime = (DWORD) ((LONGLONG) nTempoTimeLongLong >> 32);
|
||
|
|
FileTimeToSystemTime(&sTempoTimeFile, &sTempoTimeSystem);
|
||
|
|
sTempoTimeSystem.wYear -= 1600;
|
||
|
|
|
||
|
|
// Day to end
|
||
|
|
if(
|
||
|
|
(sTempoTimeSystem.wDay != 1) // Check what change first, days
|
||
|
|
|| (sTempoTimeSystem.wMonth != 1)
|
||
|
|
|| (sTempoTimeSystem.wYear != 1)
|
||
|
|
)
|
||
|
|
{ // If not the same day, calculate the number of days elapsed from start
|
||
|
|
nTempo = (unsigned long) (nDeltaTimeLongLong / 864000000000); // Number of days given in 100 nanosecond (0.1us)
|
||
|
|
|
||
|
|
if(nTempo != 0)
|
||
|
|
{ // If there is some days elapsed
|
||
|
|
oStrTempo.Format(_T("%d:"), nTempo);
|
||
|
|
*o_poTimed += oStrTempo;
|
||
|
|
}else{}
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// Time to end
|
||
|
|
oStrTempo.Format(_T("%02d:%02d:%02d - "), sTempoTimeSystem.wHour, sTempoTimeSystem.wMinute, sTempoTimeSystem.wSecond);
|
||
|
|
*o_poTimed += oStrTempo;
|
||
|
|
|
||
|
|
// H..... Display the expected date and time of the end
|
||
|
|
// Date of End
|
||
|
|
if(nTempo == 0)
|
||
|
|
{ // Avoid zero divide
|
||
|
|
nTempoTimeLongLong = m_nStartTimeLongLong + nDeltaTimeLongLong; // Current time, Delta = Tempo - Start, see above
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
nTempoTimeLongLong = m_nStartTimeLongLong + ((nDeltaTimeLongLong * 25600) / nTempo); // Start + 100% (100% = Elapsed / Percent)
|
||
|
|
}
|
||
|
|
sTempoTimeFile.dwLowDateTime = (DWORD) nTempoTimeLongLong;
|
||
|
|
sTempoTimeFile.dwHighDateTime = (DWORD) ((LONGLONG) nTempoTimeLongLong >> 32);
|
||
|
|
FileTimeToSystemTime(&sTempoTimeFile, &sTempoTimeSystem);
|
||
|
|
|
||
|
|
if(
|
||
|
|
(sTempoTimeSystem.wYear != sCurrentTimeSystem.wYear)
|
||
|
|
&& (sTempoTimeSystem.wMonth != sCurrentTimeSystem.wMonth)
|
||
|
|
&& (sTempoTimeSystem.wDay != sCurrentTimeSystem.wDay)
|
||
|
|
)
|
||
|
|
{
|
||
|
|
oStrTempo.Format
|
||
|
|
(
|
||
|
|
_T("%04d/%02d/%02d/%02d "),
|
||
|
|
sTempoTimeSystem.wYear,
|
||
|
|
sTempoTimeSystem.wMonth,
|
||
|
|
sTempoTimeSystem.wDay,
|
||
|
|
sTempoTimeSystem.wDayOfWeek + 1
|
||
|
|
);
|
||
|
|
*o_poTimed += oStrTempo;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// Time of End
|
||
|
|
oStrTempo.Format
|
||
|
|
(
|
||
|
|
_T("%02d:%02d:%02d"),
|
||
|
|
sTempoTimeSystem.wHour,
|
||
|
|
sTempoTimeSystem.wMinute,
|
||
|
|
sTempoTimeSystem.wSecond
|
||
|
|
);
|
||
|
|
*o_poTimed += oStrTempo;
|
||
|
|
|
||
|
|
if(m_nProgressText > 0)
|
||
|
|
{
|
||
|
|
*o_poTimed += _T(")");
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// Return
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
// *** UPDATE PROCESS ***
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : UpdateProgress */
|
||
|
|
/* Role : None */
|
||
|
|
/* Type : PROTECTED */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* BOOL = false : The progress bar has not changed */
|
||
|
|
/* true : The display needs to be updated */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* o_poRectPaint : Return the progress bar client rect */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* None */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Get the current progress bar dimension */
|
||
|
|
/* B - Set variables for calculation */
|
||
|
|
/* C - Calculate the elements' position in pixel */
|
||
|
|
/* D - Reverse the left and right element position */
|
||
|
|
/* E - On progress bar change, return the need to refresh it */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC UpdateProgress */
|
||
|
|
/* */
|
||
|
|
/* A..... Get the current progress bar dimension */
|
||
|
|
/* B..... Set variables for calculation */
|
||
|
|
/* C..... Calculate the elements' position */
|
||
|
|
/* CA.... Get the position of the end of the progress bar */
|
||
|
|
/* CB.... Get the length in pixel of the prgress bar */
|
||
|
|
/* CC.... Get the position of the left end of the progress bar */
|
||
|
|
/* [IF the lenght of the progress bar exceed the end position] */
|
||
|
|
/* : CD... Reset the length of the progress bar to its maximum size */
|
||
|
|
/* [ENDIF] */
|
||
|
|
/* [IF the left element is located after the right element] */
|
||
|
|
/* : CE... Set the start before the end */
|
||
|
|
/* [ENDIF] */
|
||
|
|
/* [IF the display is reversed] */
|
||
|
|
/* : D..... Reverse the left and right elements position */
|
||
|
|
/* [ENDIF] */
|
||
|
|
/* E..... On progress bar change, return the need to refresh it */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
BOOL CSkinProgress::UpdateProgress
|
||
|
|
( // Update of the progress bar values
|
||
|
|
CRect* o_poRectPaint // = NULL
|
||
|
|
)
|
||
|
|
{
|
||
|
|
CRect oRectPaint;
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
int nCurrentPos; // Pos of the current calculated position
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
int nLenPos;
|
||
|
|
int nStepPos;
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// A..... Get the current progress bar dimension
|
||
|
|
GetClientRect(&oRectPaint); // the CStatic currently being repaint
|
||
|
|
if(o_poRectPaint != NULL)
|
||
|
|
{
|
||
|
|
*o_poRectPaint = oRectPaint;
|
||
|
|
}else{}
|
||
|
|
// GetParent()->GetClientRect(&rcStatusBar); // For old test purpose, just stay here to recall me the syntax
|
||
|
|
// GetParent()->ClientToScreen(&rcStatusBar);
|
||
|
|
// ScreenToClient(&rcStatusBar);
|
||
|
|
|
||
|
|
// B...... Set variables for calculation
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
nLenPos = oRectPaint.Width();
|
||
|
|
nStepPos = m_nBmpWidth;
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
nLenPos = oRectPaint.Height();
|
||
|
|
nStepPos = m_nBmpHeight;
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
|
||
|
|
// Process
|
||
|
|
|
||
|
|
// m_nEndAff ----------------------------------------------------,
|
||
|
|
// m_nRightAff ----------------------------, |
|
||
|
|
// m_nLeftAff ---------, | m_nBmpWidth --,-, |
|
||
|
|
// |<------ bar ------>| | | |
|
||
|
|
// ProgressBar = [ : : :(:=:=:=:=:=:=:=:=:=:): : : : : : : : : : : ]
|
||
|
|
// | | | |
|
||
|
|
// | '- 0% --------- m_nRightAff --------- 100% -+-'
|
||
|
|
// '- 0% --------- m_nLeftAff ------------ 100% -'
|
||
|
|
|
||
|
|
// C..... Calculate the elements' position in pixel
|
||
|
|
// CA.... Get the position of the end of the progress bar
|
||
|
|
m_nEndAff = nLenPos - nStepPos; // Position of the cSPB_RIGHT element
|
||
|
|
|
||
|
|
// CB.... Get the position of the right end of the progress bar
|
||
|
|
m_nRightAff = (int) ( // Position of the cSPB_RIGHT element
|
||
|
|
(
|
||
|
|
(LONGLONG) // Turns the whole calculation in 64 bits
|
||
|
|
(m_nRight - m_nLower)
|
||
|
|
* (nLenPos - (nStepPos << 1))
|
||
|
|
)
|
||
|
|
/ (m_nUpper - m_nLower)
|
||
|
|
) + nStepPos;
|
||
|
|
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
// CC.... Get the position of the left end of the progress bar
|
||
|
|
m_nLeftAff = (int) ( // Position of the cSPB_LEFT element
|
||
|
|
(
|
||
|
|
(LONGLONG) // Turns the whole calculation in 64 bits
|
||
|
|
(m_nLeft - m_nLower)
|
||
|
|
* (nLenPos - (nStepPos << 1))
|
||
|
|
)
|
||
|
|
/ (m_nUpper - m_nLower)
|
||
|
|
);
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
|
||
|
|
if(m_nRightAff > m_nEndAff)
|
||
|
|
{ // Cannot be be bigger than the bar itselves
|
||
|
|
// CD.... Reset the length of the progress bar to its maximum size
|
||
|
|
m_nRightAff = m_nEndAff;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
if(m_nLeftAff > (m_nRightAff - nStepPos))
|
||
|
|
{ // Cannot be be bigger than the bar itselves
|
||
|
|
// CE.... Set the start before the end
|
||
|
|
m_nLeftAff = m_nRightAff - nStepPos;
|
||
|
|
}else{}
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
|
||
|
|
// D..... Reverse the left and right elements position
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
if(m_bReverse != false)
|
||
|
|
{ // If reversing the display, just invert the positions in dCSP_SLIDERBAR_METHOD mode, TRICKY ISN'T IT !
|
||
|
|
nCurrentPos = nLenPos - m_nRightAff - nStepPos; // Will become m_nLeftAff
|
||
|
|
m_nRightAff = nLenPos - m_nLeftAff - nStepPos; // m_nLeftAff becomes m_nRightAff
|
||
|
|
m_nLeftAff = nCurrentPos; // m_nRightAff becomes m_nLeftAff
|
||
|
|
}else{}
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
|
||
|
|
// Return
|
||
|
|
|
||
|
|
// E..... On progress bar change, return the need to refresh it
|
||
|
|
if(
|
||
|
|
(m_nPrevEndAff != m_nEndAff)
|
||
|
|
|| (m_nPrevRightAff != m_nRightAff)
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
|| (m_nPrevLeftAff != m_nLeftAff)
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
)
|
||
|
|
{
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// *** WINDOWS MAPPED PROCESSING ***
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : OnEraseBkgnd */
|
||
|
|
/* Role : Erase the background (with a filled rect) before [OnPaint] */
|
||
|
|
/* Type : PROTECTED */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* None */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* i_poDC : current DC */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Erase the background */
|
||
|
|
/* B - Resize and display the text */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC OnEraseBkgnd */
|
||
|
|
/* */
|
||
|
|
/* A..... Erase the background */
|
||
|
|
/* B..... Resize and display the text */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* This function is called prior to [OnSizing] because we cannot over-ride */
|
||
|
|
/* the status bar [OnSizing] function from here. And we also cannot do it for */
|
||
|
|
/* the main window also, which is the parent window of the status bar. So, in */
|
||
|
|
/* order to resize the text in real-time while it is moved/resized, just call */
|
||
|
|
/* the [RefreshPanes] function when the status bar is asked to be erased. */
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
BOOL CSkinProgress::OnEraseBkgnd
|
||
|
|
(
|
||
|
|
CDC* i_poDC
|
||
|
|
)
|
||
|
|
{
|
||
|
|
BOOL bResult;
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// A..... Erase the background
|
||
|
|
bResult = CStatic::OnEraseBkgnd(i_poDC);
|
||
|
|
|
||
|
|
// Process
|
||
|
|
|
||
|
|
// B..... Resize and display the text
|
||
|
|
RefreshPanes();
|
||
|
|
|
||
|
|
// Return
|
||
|
|
|
||
|
|
return bResult;
|
||
|
|
}
|
||
|
|
|
||
|
|
BEGIN_MESSAGE_MAP(CSkinProgress, CStatic)
|
||
|
|
//{{AFX_MSG_MAP(CSkinProgress)
|
||
|
|
ON_WM_ERASEBKGND()
|
||
|
|
ON_WM_PAINT()
|
||
|
|
ON_WM_TIMER()
|
||
|
|
//}}AFX_MSG_MAP
|
||
|
|
END_MESSAGE_MAP()
|
||
|
|
|
||
|
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
// CSkinProgress message handlers
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : OnPaint */
|
||
|
|
/* Role : Repaint the progress bar according to its new size */
|
||
|
|
/* Type : PROTECTED */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* None */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* None */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Update values, get dimension and check refresh */
|
||
|
|
/* B - Set variables for calculation */
|
||
|
|
/* C - Draw the progress bar */
|
||
|
|
/* D - Display the progress bar */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC OnPaint */
|
||
|
|
/* */
|
||
|
|
/* A..... Update values, get dimension and check refresh */
|
||
|
|
/* [IF the progress bar needs to be refreshed] */
|
||
|
|
/* : B..... Set variables for calculation */
|
||
|
|
/* : C..... Draw the progress bar */
|
||
|
|
/* : [IF the progress bar size is different from the previous time] */
|
||
|
|
/* : : CA.... Redraw the complete bar from scratch */
|
||
|
|
/* : : [IF the progress bar was existing] */
|
||
|
|
/* : : : CAA... Delete the previous progress bar bitmap */
|
||
|
|
/* : : [ENDIF] */
|
||
|
|
/* : : CAB... Create the new progress bar bitmap with the new dimension */
|
||
|
|
/* : [ENDIF] */
|
||
|
|
/* : CB.... Select the DC on the progress bar bitmap */
|
||
|
|
/* : [IF the progress bar size is different from the previous time] */
|
||
|
|
/* : : CC.... Start the complete redraw of the progress bar from the end */
|
||
|
|
/* : : CCA... Draw the background element */
|
||
|
|
/* : : CCAA.. Draw the background element at the most right position */
|
||
|
|
/* : : [UNTIL the right end of the progress bar is not reached] */
|
||
|
|
/* : : : CCAB.. Draw background element until the right end of the bar */
|
||
|
|
/* : : [NEXT] */
|
||
|
|
/* : : CCB... Save the previous position of the end of the progress bar */
|
||
|
|
/* : : CCC... Draw the bar element */
|
||
|
|
/* : : CCCA.. Reset the drawing position on a base of an element's width */
|
||
|
|
/* : : [UNTIL the beginning is not reached] */
|
||
|
|
/* : : : CCCB.. Draw the bar element until the left end of the bar */
|
||
|
|
/* : : [NEXT] */
|
||
|
|
/* : : CCD... Draw the center element */
|
||
|
|
/* : : [IF not under the start element] */
|
||
|
|
/* : : : CCE... Draw the before-left element */
|
||
|
|
/* : : [ENDIF] */
|
||
|
|
/* : : [IF not under the end element] */
|
||
|
|
/* : : : CCF... Draw the after-right element */
|
||
|
|
/* : : [ENDIF] */
|
||
|
|
/* : : CCG... Draw the start element */
|
||
|
|
/* : : CCH... Draw the end element */
|
||
|
|
/* : : CCI... Draw the left element of the bar */
|
||
|
|
/* : : CCJ... Draw the right element of the bar */
|
||
|
|
/* : [ELSE] */
|
||
|
|
/* : : CD.... Modify the moved elements without redrawing everything */
|
||
|
|
/* : : CDA... Start to update the progress bar from the previous position */
|
||
|
|
/* : : [IF going backward (Oh my God, could it be possible ?)] */
|
||
|
|
/* : : : CDB... Going backward */
|
||
|
|
/* : : : CDBA.. Draw background to replace the end of the progress bar */
|
||
|
|
/* : : : CDBB.. Reset drawing position on a base of an element's width */
|
||
|
|
/* : : : [UNTIL the right end of the progress bar is not reached] */
|
||
|
|
/* : : : : CDBC.. Draw the background until the right end of the bar */
|
||
|
|
/* : : : [NEXT] */
|
||
|
|
/* : : [ELSE] */
|
||
|
|
/* : : : CDC... Going forward */
|
||
|
|
/* : : : CDCA.. Draw the bar element to replace the progress bar end */
|
||
|
|
/* : : : CDCB.. Reset drawing position on a base of an element's width */
|
||
|
|
/* : : : [UNTIL the right end of the progress bar is not reached] */
|
||
|
|
/* : : : : CDCC.. Draw the progress bar until the right end of the bar */
|
||
|
|
/* : : : [NEXT] */
|
||
|
|
/* : : [ENDIF] */
|
||
|
|
/* : : CDD... Draw the center element */
|
||
|
|
/* : : [IF moved AND not under the start element] */
|
||
|
|
/* : : : CDE... Draw the before-left element */
|
||
|
|
/* : : [ENDIF] */
|
||
|
|
/* : : [IF moved AND not under the end element] */
|
||
|
|
/* : : : CDF... Draw the after-right element */
|
||
|
|
/* : : [ENDIF] */
|
||
|
|
/* : : [IF modifed by BEFORE or LEFT or CENTER] */
|
||
|
|
/* : : : CDG... Draw the start element */
|
||
|
|
/* : : [ENDIF] */
|
||
|
|
/* : : [IF modifed by CENTER or RIGHT or AFTER] */
|
||
|
|
/* : : : CDH... Draw the end element */
|
||
|
|
/* : : [ENDIF] */
|
||
|
|
/* : : [IF LEFT moved OR RIGHT too close from LEFT] */
|
||
|
|
/* : : : CDI... Draw the left element of the bar */
|
||
|
|
/* : : [ENDIF] */
|
||
|
|
/* : : [IF RIGHT moved OR LEFT too close from RIGHT] */
|
||
|
|
/* : : : CDJ... Draw the right element of the bar */
|
||
|
|
/* : : [ENDIF] */
|
||
|
|
/* : [ENDIF] */
|
||
|
|
/* : D..... Display the progress bar */
|
||
|
|
/* [ENDIF] */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* Specific details about the dCSP_SLIDERBAR_METHOD or the dCSP_VERTICAL_BAR */
|
||
|
|
/* are not provided because beyon the scope of the class. The code is also */
|
||
|
|
/* fully functionnal, but is not yet intented to be used. It will surely be */
|
||
|
|
/* a near update. But right now, anyone who wants to understand how slider */
|
||
|
|
/* bars and/or vertical bars works just have to understand first how the */
|
||
|
|
/* progress bars works. Hope there is enough comments for this purpose ;p */
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
void CSkinProgress::OnPaint
|
||
|
|
( // On redraw event
|
||
|
|
)
|
||
|
|
{
|
||
|
|
CPaintDC oDC(this); // Device context for painting - Do not call CStatic::OnPaint() for painting messages
|
||
|
|
|
||
|
|
CDC oDcProgress; // CompatibleDC
|
||
|
|
CBitmap* poOldBitmap; // oDC's previous bitmap
|
||
|
|
|
||
|
|
CRect oRectPaint;
|
||
|
|
int nCurrentPos; // Pos of the current calculated position
|
||
|
|
int nStepPos;
|
||
|
|
|
||
|
|
// LPPAINTSTRUCT sPaintStruct;
|
||
|
|
|
||
|
|
// Init
|
||
|
|
|
||
|
|
// Process
|
||
|
|
|
||
|
|
// A..... Update the progress bar elements position and get the progress bar dimension
|
||
|
|
UpdateProgress(&oRectPaint); // the CStatic currently being repaint
|
||
|
|
|
||
|
|
// BeginPaint(sPaintStruct);
|
||
|
|
|
||
|
|
// B...... Set variables for calculation
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
nStepPos = m_nBmpWidth;
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
nStepPos = m_nBmpHeight;
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
|
||
|
|
// C..... Draw the progress bar
|
||
|
|
if( // If the SIZE (don't mind the position) of the ProgressBar has changed
|
||
|
|
(oRectPaint.Width() != m_oRectPaint.Width())
|
||
|
|
|| (oRectPaint.Height() != m_oRectPaint.Height())
|
||
|
|
)
|
||
|
|
{ // If the progress bar size has changed
|
||
|
|
// CA.... Redraw the complete bar from scratch
|
||
|
|
if(m_poProgressBmp != NULL)
|
||
|
|
{ // If the ProgressBitmap already exists, delete it and create a new one with the new dimension of the pane
|
||
|
|
// CAA... Delete the previous progress bar bitmap
|
||
|
|
delete m_poProgressBmp;
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// CAB... Create the new progress bar bitmap with the new dimension
|
||
|
|
m_poProgressBmp = new CBitmap;
|
||
|
|
m_poProgressBmp->CreateCompatibleBitmap(&oDC, oRectPaint.Width(), oRectPaint.Height()); // *ALWAYS* use '&oDC', *NEVER* '&oDcProgress' otherwise you'll get a monochrom image
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// CB.... Select the DC on the progress bar bitmap
|
||
|
|
oDcProgress.CreateCompatibleDC(&oDC);
|
||
|
|
poOldBitmap = oDcProgress.SelectObject(m_poProgressBmp);
|
||
|
|
|
||
|
|
if( // If the SIZE (don't mind the position) of the ProgressBar has changed
|
||
|
|
(oRectPaint.Width() != m_oRectPaint.Width())
|
||
|
|
|| (oRectPaint.Height() != m_oRectPaint.Height())
|
||
|
|
)
|
||
|
|
{ // If the ProgressBar has changed, redraw it completly
|
||
|
|
// CC.... Start the complete redraw of the progress bar from the end
|
||
|
|
// Background
|
||
|
|
// CCA... Draw the background element
|
||
|
|
// CCAA.. Draw the background element from the most right position
|
||
|
|
nCurrentPos = m_nEndAff - (m_nEndAff % nStepPos);
|
||
|
|
for(; nCurrentPos > m_nRightAff; nCurrentPos -= nStepPos)
|
||
|
|
{
|
||
|
|
// CCAB.. Draw the background element until the right end of the bar
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BACKGROUND, CPoint(nCurrentPos, 0), ILD_NORMAL);
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BACKGROUND, CPoint(0, nCurrentPos), ILD_NORMAL);
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
|
||
|
|
// CCB... Save the previous position of the end of the progress bar
|
||
|
|
// Position of the end of the bar
|
||
|
|
m_nPrevRightAff = m_nRightAff;
|
||
|
|
|
||
|
|
// CCC... Draw the bar element
|
||
|
|
// Bar
|
||
|
|
// CCCA.. Reset the drawing position on a base of the image list element's width
|
||
|
|
nCurrentPos -= (nCurrentPos % nStepPos);
|
||
|
|
#ifndef dCSP_SLIDERBAR_METHOD
|
||
|
|
for(; nCurrentPos >= nStepPos; nCurrentPos -= nStepPos) // For m_nLeft-less progress bar routine
|
||
|
|
#else
|
||
|
|
for(; nCurrentPos >= m_nLeftAff; nCurrentPos -= nStepPos)
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
{
|
||
|
|
// CCCB.. Draw the bar element until the left end of the bar
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BAR, CPoint(nCurrentPos, 0), ILD_NORMAL);
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BAR, CPoint(0, nCurrentPos), ILD_NORMAL);
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
// Position of the beginning of the bar
|
||
|
|
m_nPrevLeftAff = m_nLeftAff;
|
||
|
|
|
||
|
|
// Background
|
||
|
|
nCurrentPos -= (nCurrentPos % nStepPos);
|
||
|
|
for(; nCurrentPos >= nStepPos; nCurrentPos -= nStepPos)
|
||
|
|
{
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BACKGROUND, CPoint(nCurrentPos, 0), ILD_NORMAL);
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BACKGROUND, CPoint(0, nCurrentPos), ILD_NORMAL);
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
|
||
|
|
// CCD... Draw the center element
|
||
|
|
// Center
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
#ifndef dCSP_SLIDERBAR_METHOD
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_CENTER, CPoint(m_nRightAff >> 1, 0), ILD_NORMAL);
|
||
|
|
#else
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_CENTER, CPoint((m_nLeftAff + m_nRightAff) >> 1, 0), ILD_NORMAL);
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
#ifndef dCSP_SLIDERBAR_METHOD
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_CENTER, CPoint(0, m_nRightAff >> 1), ILD_NORMAL);
|
||
|
|
#else
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_CENTER, CPoint(0, (m_nLeftAff + m_nRightAff) >> 1), ILD_NORMAL);
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
|
||
|
|
// CCE... Draw the before-left element
|
||
|
|
// Before
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
if(m_nLeftAff > nStepPos)
|
||
|
|
{
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BEFORE, CPoint(m_nLeftAff - m_nBmpWidth, 0), ILD_NORMAL);
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BEFORE, CPoint(0, m_nLeftAff - m_nBmpHeight), ILD_NORMAL);
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
}else{}
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
|
||
|
|
// CCF... Draw the after-right element
|
||
|
|
// After
|
||
|
|
if(m_nRightAff < (m_nEndAff - nStepPos))
|
||
|
|
{
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_AFTER, CPoint(m_nRightAff + m_nBmpWidth, 0), ILD_NORMAL);
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_AFTER, CPoint(0, m_nRightAff + m_nBmpHeight), ILD_NORMAL);
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// CCG... Draw the start element
|
||
|
|
// Start
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_START, CPoint(0, 0), ILD_NORMAL);
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
|
||
|
|
// CCH... Draw the end element
|
||
|
|
// End
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_END, CPoint(m_nEndAff, 0), ILD_NORMAL);
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_END, CPoint(0, m_nEndAff), ILD_NORMAL);
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
|
||
|
|
// CCI... Draw the left element of the bar
|
||
|
|
// Left
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
#ifndef dCSP_SLIDERBAR_METHOD
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_LEFT, CPoint(0, 0), ILD_NORMAL); // For m_nLeft-less progress bar routine
|
||
|
|
#else
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_LEFT, CPoint(m_nLeftAff, 0), ILD_NORMAL);
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
#ifndef dCSP_SLIDERBAR_METHOD
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_TOP, CPoint(0, 0), ILD_NORMAL); // For m_nLeft-less progress bar routine
|
||
|
|
#else
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_TOP, CPoint(0, m_nLeftAff), ILD_NORMAL);
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
|
||
|
|
// CCJ// Car... Draw the right element of the bar
|
||
|
|
// Right
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_RIGHT, CPoint(m_nRightAff, 0), ILD_NORMAL);
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BOTTOM, CPoint(0, m_nRightAff), ILD_NORMAL);
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
|
||
|
|
m_nPrevEndAff = m_nEndAff;
|
||
|
|
m_oRectPaint = oRectPaint;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
// CD.... Modify the moved elements without redrawing the complete progress bar
|
||
|
|
if(m_nPrevRightAff != m_nRightAff)
|
||
|
|
{
|
||
|
|
// CDA... Start to update the progress bar from the previous position
|
||
|
|
nCurrentPos = m_nPrevRightAff;
|
||
|
|
|
||
|
|
if(m_nRightAff < m_nPrevRightAff)
|
||
|
|
{ // If going backward, draw BACKGROUND and last with RIGHT
|
||
|
|
// CDB... Going backward
|
||
|
|
// CDBA.. Draw the background element to replace the end of the progress bar
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BACKGROUND, CPoint(nCurrentPos, 0), ILD_NORMAL);
|
||
|
|
// CDBB.. Reset the drawing position on a base of the image list element's width
|
||
|
|
nCurrentPos -= (nCurrentPos % nStepPos);
|
||
|
|
for(; nCurrentPos > m_nRightAff; nCurrentPos -= nStepPos)
|
||
|
|
{
|
||
|
|
// CDBC.. Draw the background element until the right end of the bar
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BACKGROUND, CPoint(nCurrentPos, 0), ILD_NORMAL);
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BACKGROUND, CPoint(0, nCurrentPos), ILD_NORMAL);
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // If going forward, draw BAR and last with RIGHT
|
||
|
|
// CDC... Going forward
|
||
|
|
// CDCA.. Draw the progress bar element to replace the end of the progress bar
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BAR, CPoint(nCurrentPos, 0), ILD_NORMAL);
|
||
|
|
// CDCB.. Reset the drawing position on a base of the image list element's width
|
||
|
|
nCurrentPos += nStepPos;
|
||
|
|
nCurrentPos -= (nCurrentPos % nStepPos);
|
||
|
|
for(; nCurrentPos < m_nRightAff; nCurrentPos += nStepPos)
|
||
|
|
{
|
||
|
|
// CDCC.. Draw the progress bar element until the right end of the bar
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BAR, CPoint(nCurrentPos, 0), ILD_NORMAL);
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BAR, CPoint(0, nCurrentPos), ILD_NORMAL);
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
if(m_nLeftAff!= m_nPrevLeftAff)
|
||
|
|
{
|
||
|
|
nCurrentPos = m_nPrevLeftAff;
|
||
|
|
|
||
|
|
if(m_nLeftAff < m_nPrevLeftAff)
|
||
|
|
{ // If going backward, draw BAR and last with LEFT
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BAR, CPoint(nCurrentPos, 0), ILD_NORMAL);
|
||
|
|
nCurrentPos -= (nCurrentPos % nStepPos);
|
||
|
|
for(; nCurrentPos > m_nLeftAff; nCurrentPos -= nStepPos)
|
||
|
|
{
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BAR, CPoint(nCurrentPos, 0), ILD_NORMAL);
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BAR, CPoint(0, nCurrentPos), ILD_NORMAL);
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // If going forward, draw BACKGROUND and last with LEFT
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BACKGROUND, CPoint(nCurrentPos, 0), ILD_NORMAL);
|
||
|
|
nCurrentPos += nStepPos;
|
||
|
|
nCurrentPos -= (nCurrentPos % nStepPos);
|
||
|
|
for(; nCurrentPos < m_nLeftAff; nCurrentPos += nStepPos)
|
||
|
|
{
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BACKGROUND, CPoint(nCurrentPos, 0), ILD_NORMAL);
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BACKGROUND, CPoint(0, nCurrentPos), ILD_NORMAL);
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}else{}
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
|
||
|
|
// CDD... Draw the center element
|
||
|
|
if(
|
||
|
|
(m_nPrevRightAff != m_nRightAff)
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
|| (m_nPrevLeftAff != m_nLeftAff)
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
)
|
||
|
|
{
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
#ifndef dCSP_SLIDERBAR_METHOD
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_CENTER, CPoint(m_nRightAff >> 1, 0), ILD_NORMAL);
|
||
|
|
#else
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_CENTER, CPoint((m_nLeftAff + m_nRightAff) >> 1, 0), ILD_NORMAL);
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
#ifndef dCSP_SLIDERBAR_METHOD
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_CENTER, CPoint(0, m_nRightAff >> 1), ILD_NORMAL);
|
||
|
|
#else
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_CENTER, CPoint(0, (m_nLeftAff + m_nRightAff) >> 1), ILD_NORMAL);
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
|
||
|
|
// CDE... Draw the before-left element
|
||
|
|
// Before
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
if(m_nPrevLeftAff != m_nLeftAff)
|
||
|
|
{
|
||
|
|
if(m_nLeftAff > nStepPos)
|
||
|
|
{
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BEFORE, CPoint(m_nLeftAff - nStepPos, 0), ILD_NORMAL);
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BEFORE, CPoint(0, m_nLeftAff - nStepPos), ILD_NORMAL);
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
}else{}
|
||
|
|
}else{}
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
|
||
|
|
// CDF... Draw the after-right element
|
||
|
|
// After
|
||
|
|
if(m_nRightAff != m_nPrevRightAff)
|
||
|
|
{
|
||
|
|
if(m_nRightAff < (m_nEndAff - nStepPos))
|
||
|
|
{
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_AFTER, CPoint(m_nRightAff + nStepPos, 0), ILD_NORMAL);
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_AFTER, CPoint(0, m_nRightAff + nStepPos), ILD_NORMAL);
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
}else{}
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// CDG... Draw the start element
|
||
|
|
// Start
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
if(m_nPrevLeftAff != m_nLeftAff)
|
||
|
|
#else
|
||
|
|
if(m_nPrevRightAff != m_nRightAff) // In non-<dCSP_SLIDERBAR_METHOD> mode, only the right end can move
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
{
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
if(m_nLeftAff < (nStepPos << 1))
|
||
|
|
#else
|
||
|
|
if(m_nRightAff < (nStepPos << 1)) // In non-<dCSP_SLIDERBAR_METHOD> mode, only the right end can move
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
{ // If the START element was over-written, refresh it
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_START, CPoint(0, 0), ILD_NORMAL);
|
||
|
|
}else{}
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// CDH... Draw the end element
|
||
|
|
// End
|
||
|
|
if(m_nPrevRightAff != m_nRightAff)
|
||
|
|
{
|
||
|
|
if(m_nRightAff > (m_nEndAff - (nStepPos << 1)))
|
||
|
|
{ // If the END element was over-written, refresh it
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_END, CPoint(m_nEndAff, 0), ILD_NORMAL);
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_END, CPoint(0, m_nEndAff), ILD_NORMAL);
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
}else{}
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// CDI... Draw the left element of the bar
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
if( // In case of slider display, the closeness of the RIGHT element from the LEFT can cause an over-write of the LEFT element with BAR and/or CENTER
|
||
|
|
(m_nPrevLeftAff != m_nLeftAff)
|
||
|
|
|| (m_nRightAff < (m_nLeftAff + (nStepPos << 1)))
|
||
|
|
)
|
||
|
|
{
|
||
|
|
// Position of the start of the bar
|
||
|
|
m_nPrevLeftAff = m_nLeftAff;
|
||
|
|
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
// Left
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_LEFT, CPoint(m_nLeftAff, 0), ILD_NORMAL);
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
// Top
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_TOP, CPoint(0, m_nLeftAff), ILD_NORMAL);
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
}else{}
|
||
|
|
#else
|
||
|
|
// As long as the RIGHT element is too close from the LEFT element, the CENTER element over-writes the LEFT element, thus we have to refresh the LEFT element
|
||
|
|
if(m_nRightAff < (nStepPos << 1))
|
||
|
|
{
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
// Left
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_LEFT, CPoint(0, 0), ILD_NORMAL);
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
// Top
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_TOP, CPoint(0, 0), ILD_NORMAL);
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
}else{}
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
|
||
|
|
// CDJ... Draw the right element of the bar
|
||
|
|
if( // In case of slider display, the closeness of the LEFT element from the RIGHT can cause an over-write of the RIGHT element with BAR and/or CENTER
|
||
|
|
(m_nPrevRightAff != m_nRightAff)
|
||
|
|
#ifdef dCSP_SLIDERBAR_METHOD
|
||
|
|
|| (m_nLeftAff> (m_nRightAff - (nStepPos << 1)))
|
||
|
|
#endif // dCSP_SLIDERBAR_METHOD
|
||
|
|
)
|
||
|
|
{
|
||
|
|
// Position of the end of the bar
|
||
|
|
m_nPrevRightAff = m_nRightAff;
|
||
|
|
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
if(m_bVertical == false)
|
||
|
|
{ // Horizontal bar
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
// Right
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_RIGHT, CPoint(m_nRightAff, 0), ILD_NORMAL);
|
||
|
|
#ifdef dCSP_VERTICAL_BAR
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{ // Vertical bar
|
||
|
|
// Cottom
|
||
|
|
m_oBarImgLst.Draw(&oDcProgress, cSPB_BOTTOM, CPoint(0, m_nRightAff), ILD_NORMAL);
|
||
|
|
}
|
||
|
|
#endif // dCSP_VERTICAL_BAR
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
if(m_nPrevEndAff != m_nEndAff)
|
||
|
|
{
|
||
|
|
m_nPrevEndAff = m_nEndAff;
|
||
|
|
}else{}
|
||
|
|
}
|
||
|
|
|
||
|
|
// D..... Display the progress bar
|
||
|
|
// Copy the progress bitmap each time the object have to be refreshed
|
||
|
|
#ifndef dCSP_DISPLAY_STRETCH
|
||
|
|
oDC.BitBlt(0, 0, oRectPaint.Width(), oRectPaint.Height(), &oDcProgress, 0, 0, SRCCOPY);
|
||
|
|
#else
|
||
|
|
CDC oDcStretch; // CompatibleDC
|
||
|
|
CBitmap* poOldStretch; // oDC's previous bitmap
|
||
|
|
BITMAP sStretchBmp;
|
||
|
|
|
||
|
|
oDcStretch.CreateCompatibleDC(&oDC);
|
||
|
|
poOldStretch = oDcStretch.SelectObject(m_poStretchBmp);
|
||
|
|
|
||
|
|
m_poStretchBmp->GetBitmap(&sStretchBmp);
|
||
|
|
oDC.BitBlt(0, 0, sStretchBmp.bmWidth, sStretchBmp.bmHeight, &oDcStretch, 0, 0, SRCCOPY);
|
||
|
|
|
||
|
|
oDcStretch.SelectObject(poOldStretch);
|
||
|
|
oDcStretch.DeleteDC();
|
||
|
|
#endif // dCSP_DISPLAY_STRETCH
|
||
|
|
|
||
|
|
// Release the DC
|
||
|
|
oDcProgress.SelectObject(poOldBitmap);
|
||
|
|
oDcProgress.DeleteDC();
|
||
|
|
|
||
|
|
// EndPaint(sPaintStruct);
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : OnSizing */
|
||
|
|
/* Role : Before things are resized */
|
||
|
|
/* Type : PROTECTED */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* None */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* fwSide : Edge of window to be moved */
|
||
|
|
/* pRect : New rectangle */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Resize the object */
|
||
|
|
/* B - Resize the text */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC OnSizing */
|
||
|
|
/* */
|
||
|
|
/* A..... Resize the object */
|
||
|
|
/* B..... Resize the text */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* In normal cases, this is NEVER called */
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
void CSkinProgress::OnSizing
|
||
|
|
(
|
||
|
|
UINT fwSide, // Edge of window to be moved
|
||
|
|
LPRECT pRect // New rectangle
|
||
|
|
)
|
||
|
|
{
|
||
|
|
// A..... Resize the object
|
||
|
|
CStatic::OnSizing(fwSide, pRect);
|
||
|
|
|
||
|
|
// Process
|
||
|
|
|
||
|
|
// B..... Resize the text
|
||
|
|
RefreshPanes(); // Recalculate text layout on sizing the window
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : OnSize */
|
||
|
|
/* Role : Once things were resized */
|
||
|
|
/* Type : PROTECTED */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* None */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* nType : Type of resizing requested */
|
||
|
|
/* cx : Width */
|
||
|
|
/* cy : Height */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Transmit the new dimensions */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC OnSize */
|
||
|
|
/* */
|
||
|
|
/* A..... Transmit the new dimensions */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* Just over-ridden, ready to use for various purposes ;) */
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
void CSkinProgress::OnSize
|
||
|
|
(
|
||
|
|
UINT nType, // Type of resizing requested
|
||
|
|
int cx, // Width
|
||
|
|
int cy // Height
|
||
|
|
)
|
||
|
|
{
|
||
|
|
// A..... Transmit the new dimensions
|
||
|
|
CStatic::OnSize(nType, cx, cy);
|
||
|
|
}
|
||
|
|
|
||
|
|
/*--- START FUNCTION HEADER --------------------------------------------------*/
|
||
|
|
/* Name : OnTimer */
|
||
|
|
/* Role : The object timer has elapsed */
|
||
|
|
/* Type : PROTECTED */
|
||
|
|
/* Interface : RETURN (direct value) */
|
||
|
|
/* None */
|
||
|
|
/* OUTPUT (pointer to value) */
|
||
|
|
/* None */
|
||
|
|
/* INPUT (pointer to value, direct/default value) */
|
||
|
|
/* nIDEvent : The Timer handle that elapsed */
|
||
|
|
/* Pre-condition : None */
|
||
|
|
/* Constraints : None */
|
||
|
|
/* Behavior : A - Refresh the text and the progress bar */
|
||
|
|
/* B - Transmit the Timer handle to the parent */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* PROC OnTimer */
|
||
|
|
/* */
|
||
|
|
/* A..... Refresh the text and the progress bar */
|
||
|
|
/* B..... Transmit the Timer handle to the parent */
|
||
|
|
/*----------------------------------------------------------------------------*/
|
||
|
|
/* Just used to refresh the timed message when things are going too slow... */
|
||
|
|
/* Also used when on time redrawing the progress bar, to limit to 50 refresh */
|
||
|
|
/* per second... */
|
||
|
|
/*--- END FUNCTION HEADER ----------------------------------------------------*/
|
||
|
|
void CSkinProgress::OnTimer
|
||
|
|
( // On a Timer event
|
||
|
|
UINT nIDEvent
|
||
|
|
)
|
||
|
|
{
|
||
|
|
if(nIDEvent == (UINT)(UINT_PTR) this) // Use object's unique address as timer identifier
|
||
|
|
{
|
||
|
|
// A..... Refresh the text and the progress bar
|
||
|
|
RefreshPanes(); // Refresh the whole stuff, each 500 ms or 20 ms if in dCSP_TIMED_REDRAW mode
|
||
|
|
}else{}
|
||
|
|
|
||
|
|
// B..... Transmit the Timer handle to the parent
|
||
|
|
CStatic::OnTimer(nIDEvent);
|
||
|
|
}
|