DragonNest/Client/DnLauncher/Extern/SkinProgress.cpp
2024-12-20 16:56:44 +08:00

4979 lines
481 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/******************************************************************************/
/* 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);
}