123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279 |
- #include "StdAfx.h"
- #include <zmouse.h>
- #include <stdlib.h>
- DECLARE_HANDLE(HZIP); // An HZIP identifies a zip file that has been opened
- typedef DWORD ZRESULT;
- #define OpenZip OpenZipU
- #define CloseZip(hz) CloseZipU(hz)
- extern HZIP OpenZipU(void *z,unsigned int len,DWORD flags);
- extern ZRESULT CloseZipU(HZIP hz);
- namespace DuiLib {
- /////////////////////////////////////////////////////////////////////////////////////
- //
- //
- static UINT MapKeyState()
- {
- UINT uState = 0;
- if( ::GetKeyState(VK_CONTROL) < 0 ) uState |= MK_CONTROL;
- if( ::GetKeyState(VK_RBUTTON) < 0 ) uState |= MK_RBUTTON;
- if( ::GetKeyState(VK_LBUTTON) < 0 ) uState |= MK_LBUTTON;
- if( ::GetKeyState(VK_SHIFT) < 0 ) uState |= MK_SHIFT;
- if( ::GetKeyState(VK_MENU) < 0 ) uState |= MK_ALT;
- return uState;
- }
- typedef struct tagFINDTABINFO
- {
- CControlUI* pFocus;
- CControlUI* pLast;
- bool bForward;
- bool bNextIsIt;
- } FINDTABINFO;
- typedef struct tagFINDSHORTCUT
- {
- TCHAR ch;
- bool bPickNext;
- } FINDSHORTCUT;
- typedef struct tagTIMERINFO
- {
- CControlUI* pSender;
- UINT nLocalID;
- HWND hWnd;
- UINT uWinTimer;
- bool bKilled;
- } TIMERINFO;
- /////////////////////////////////////////////////////////////////////////////////////
- tagTDrawInfo::tagTDrawInfo()
- {
- Clear();
- }
- tagTDrawInfo::tagTDrawInfo(LPCTSTR lpsz)
- {
- Clear();
- sDrawString = lpsz;
- }
- void tagTDrawInfo::Clear()
- {
- sDrawString.Empty();
- sImageName.Empty();
- ::ZeroMemory(&bLoaded, sizeof(tagTDrawInfo) - offsetof(tagTDrawInfo, bLoaded));
- uFade = 255;
- }
- /////////////////////////////////////////////////////////////////////////////////////
- static void GetChildWndRect(HWND hWnd, HWND hChildWnd, RECT& rcChildWnd)
- {
- ::GetWindowRect(hChildWnd, &rcChildWnd);
- POINT pt;
- pt.x = rcChildWnd.left;
- pt.y = rcChildWnd.top;
- ::ScreenToClient(hWnd, &pt);
- rcChildWnd.left = pt.x;
- rcChildWnd.top = pt.y;
- pt.x = rcChildWnd.right;
- pt.y = rcChildWnd.bottom;
- ::ScreenToClient(hWnd, &pt);
- rcChildWnd.right = pt.x;
- rcChildWnd.bottom = pt.y;
- }
- /////////////////////////////////////////////////////////////////////////////////////
- typedef BOOL (__stdcall *PFUNCUPDATELAYEREDWINDOW)(HWND, HDC, POINT*, SIZE*, HDC, POINT*, COLORREF, BLENDFUNCTION*, DWORD);
- PFUNCUPDATELAYEREDWINDOW g_fUpdateLayeredWindow = NULL;
- HPEN m_hUpdateRectPen = NULL;
- HINSTANCE CPaintManagerUI::m_hResourceInstance = NULL;
- CDuiString CPaintManagerUI::m_pStrResourcePath;
- CDuiString CPaintManagerUI::m_pStrResourceZip;
- HANDLE CPaintManagerUI::m_hResourceZip = NULL;
- bool CPaintManagerUI::m_bCachedResourceZip = true;
- TResInfo CPaintManagerUI::m_SharedResInfo;
- HINSTANCE CPaintManagerUI::m_hInstance = NULL;
- bool CPaintManagerUI::m_bUseHSL = false;
- short CPaintManagerUI::m_H = 180;
- short CPaintManagerUI::m_S = 100;
- short CPaintManagerUI::m_L = 100;
- CStdPtrArray CPaintManagerUI::m_aPreMessages;
- CStdPtrArray CPaintManagerUI::m_aPlugins;
- CPaintManagerUI::CPaintManagerUI() :
- m_hWndPaint(NULL),
- m_hDcPaint(NULL),
- m_hDcOffscreen(NULL),
- m_hDcBackground(NULL),
- m_hbmpOffscreen(NULL),
- m_pOffscreenBits(NULL),
- m_hbmpBackground(NULL),
- m_pBackgroundBits(NULL),
- m_iTooltipWidth(-1),
- m_hwndTooltip(NULL),
- m_iHoverTime(1000),
- m_bShowUpdateRect(false),
- m_uTimerID(0x1000),
- m_pRoot(NULL),
- m_pFocus(NULL),
- m_pEventHover(NULL),
- m_pEventClick(NULL),
- m_pEventKey(NULL),
- m_bFirstLayout(true),
- m_bFocusNeeded(false),
- m_bUpdateNeeded(false),
- m_bMouseTracking(false),
- m_bMouseCapture(false),
- m_bIsPainting(false),
- m_bOffscreenPaint(true),
- m_bUsedVirtualWnd(false),
- m_bAsyncNotifyPosted(false),
- m_bForceUseSharedRes(false),
- m_nOpacity(0xFF),
- m_bLayered(false),
- m_bLayeredChanged(false)
- {
- if (m_SharedResInfo.m_DefaultFontInfo.sFontName.IsEmpty())
- {
- m_SharedResInfo.m_dwDefaultDisabledColor = 0xFFA7A6AA;
- m_SharedResInfo.m_dwDefaultFontColor = 0xFF000000;
- m_SharedResInfo.m_dwDefaultLinkFontColor = 0xFF0000FF;
- m_SharedResInfo.m_dwDefaultLinkHoverFontColor = 0xFFD3215F;
- m_SharedResInfo.m_dwDefaultSelectedBkColor = 0xFFBAE4FF;
- LOGFONT lf = { 0 };
- ::GetObject(::GetStockObject(DEFAULT_GUI_FONT), sizeof(LOGFONT), &lf);
- lf.lfCharSet = DEFAULT_CHARSET;
- HFONT hDefaultFont = ::CreateFontIndirect(&lf);
- m_SharedResInfo.m_DefaultFontInfo.hFont = hDefaultFont;
- m_SharedResInfo.m_DefaultFontInfo.sFontName = lf.lfFaceName;
- m_SharedResInfo.m_DefaultFontInfo.iSize = -lf.lfHeight;
- m_SharedResInfo.m_DefaultFontInfo.bBold = (lf.lfWeight >= FW_BOLD);
- m_SharedResInfo.m_DefaultFontInfo.bUnderline = (lf.lfUnderline == TRUE);
- m_SharedResInfo.m_DefaultFontInfo.bItalic = (lf.lfItalic == TRUE);
- ::ZeroMemory(&m_SharedResInfo.m_DefaultFontInfo.tm, sizeof(m_SharedResInfo.m_DefaultFontInfo.tm));
- }
- m_ResInfo.m_dwDefaultDisabledColor = m_SharedResInfo.m_dwDefaultDisabledColor;
- m_ResInfo.m_dwDefaultFontColor = m_SharedResInfo.m_dwDefaultFontColor;
- m_ResInfo.m_dwDefaultLinkFontColor = m_SharedResInfo.m_dwDefaultLinkFontColor;
- m_ResInfo.m_dwDefaultLinkHoverFontColor = m_SharedResInfo.m_dwDefaultLinkHoverFontColor;
- m_ResInfo.m_dwDefaultSelectedBkColor = m_SharedResInfo.m_dwDefaultSelectedBkColor;
- if( m_hUpdateRectPen == NULL ) {
- m_hUpdateRectPen = ::CreatePen(PS_SOLID, 1, RGB(220, 0, 0));
- // Boot Windows Common Controls (for the ToolTip control)
- ::InitCommonControls();
- ::LoadLibrary(_T("msimg32.dll"));
- }
- m_szMinWindow.cx = 0;
- m_szMinWindow.cy = 0;
- m_szMaxWindow.cx = 0;
- m_szMaxWindow.cy = 0;
- m_szInitWindowSize.cx = 0;
- m_szInitWindowSize.cy = 0;
- m_szRoundCorner.cx = m_szRoundCorner.cy = 0;
- ::ZeroMemory(&m_rcSizeBox, sizeof(m_rcSizeBox));
- ::ZeroMemory(&m_rcCaption, sizeof(m_rcCaption));
- ::ZeroMemory(&m_rcLayeredInset, sizeof(m_rcLayeredInset));
- ::ZeroMemory(&m_rcLayeredUpdate, sizeof(m_rcLayeredUpdate));
- m_ptLastMousePos.x = m_ptLastMousePos.y = -1;
- }
- CPaintManagerUI::~CPaintManagerUI()
- {
- // Delete the control-tree structures
- for( int i = 0; i < m_aDelayedCleanup.GetSize(); i++ ) delete static_cast<CControlUI*>(m_aDelayedCleanup[i]);
- for( int i = 0; i < m_aAsyncNotify.GetSize(); i++ ) delete static_cast<TNotifyUI*>(m_aAsyncNotify[i]);
- m_mNameHash.Resize(0);
- if( m_pRoot != NULL ) delete m_pRoot;
- ::DeleteObject(m_ResInfo.m_DefaultFontInfo.hFont);
- RemoveAllFonts();
- RemoveAllImages();
- RemoveAllDefaultAttributeList();
- RemoveAllWindowCustomAttribute();
- RemoveAllOptionGroups();
- RemoveAllTimers();
- // Reset other parts...
- if( m_hwndTooltip != NULL )
- {
- ::DestroyWindow(m_hwndTooltip);
- m_hwndTooltip = NULL;
- }
- if( m_hDcOffscreen != NULL ) ::DeleteDC(m_hDcOffscreen);
- if( m_hDcBackground != NULL ) ::DeleteDC(m_hDcBackground);
- if( m_hbmpOffscreen != NULL ) ::DeleteObject(m_hbmpOffscreen);
- if( m_hbmpBackground != NULL ) ::DeleteObject(m_hbmpBackground);
- if( m_hDcPaint != NULL ) ::ReleaseDC(m_hWndPaint, m_hDcPaint);
- m_aPreMessages.Remove(m_aPreMessages.Find(this));
- }
- void CPaintManagerUI::Init(HWND hWnd, LPCTSTR pstrName)
- {
- ASSERT(::IsWindow(hWnd));
- m_mNameHash.Resize();
- RemoveAllFonts();
- RemoveAllImages();
- RemoveAllDefaultAttributeList();
- RemoveAllWindowCustomAttribute();
- RemoveAllOptionGroups();
- RemoveAllTimers();
- m_sName.Empty();
- if( pstrName != NULL ) m_sName = pstrName;
- if( m_hWndPaint != hWnd ) {
- m_hWndPaint = hWnd;
- m_hDcPaint = ::GetDC(hWnd);
- m_aPreMessages.Add(this);
- }
- }
- HINSTANCE CPaintManagerUI::GetInstance()
- {
- return m_hInstance;
- }
- CDuiString CPaintManagerUI::GetInstancePath()
- {
- if( m_hInstance == NULL ) return _T('\0');
-
- TCHAR tszModule[MAX_PATH + 1] = { 0 };
- ::GetModuleFileName(m_hInstance, tszModule, MAX_PATH);
- CDuiString sInstancePath = tszModule;
- int pos = sInstancePath.ReverseFind(_T('\\'));
- if( pos >= 0 ) sInstancePath = sInstancePath.Left(pos + 1);
- return sInstancePath;
- }
- CDuiString CPaintManagerUI::GetCurrentPath()
- {
- TCHAR tszModule[MAX_PATH + 1] = { 0 };
- ::GetCurrentDirectory(MAX_PATH, tszModule);
- return tszModule;
- }
- HINSTANCE CPaintManagerUI::GetResourceDll()
- {
- if( m_hResourceInstance == NULL ) return m_hInstance;
- return m_hResourceInstance;
- }
- const CDuiString& CPaintManagerUI::GetResourcePath()
- {
- return m_pStrResourcePath;
- }
- const CDuiString& CPaintManagerUI::GetResourceZip()
- {
- return m_pStrResourceZip;
- }
- bool CPaintManagerUI::IsCachedResourceZip()
- {
- return m_bCachedResourceZip;
- }
- HANDLE CPaintManagerUI::GetResourceZipHandle()
- {
- return m_hResourceZip;
- }
- void CPaintManagerUI::SetInstance(HINSTANCE hInst)
- {
- m_hInstance = hInst;
- CShadowUI::Initialize(hInst);
- }
- void CPaintManagerUI::SetCurrentPath(LPCTSTR pStrPath)
- {
- ::SetCurrentDirectory(pStrPath);
- }
- void CPaintManagerUI::SetResourceDll(HINSTANCE hInst)
- {
- m_hResourceInstance = hInst;
- }
- void CPaintManagerUI::SetResourcePath(LPCTSTR pStrPath)
- {
- m_pStrResourcePath = pStrPath;
- if( m_pStrResourcePath.IsEmpty() ) return;
- TCHAR cEnd = m_pStrResourcePath.GetAt(m_pStrResourcePath.GetLength() - 1);
- if( cEnd != _T('\\') && cEnd != _T('/') ) m_pStrResourcePath += _T('\\');
- }
- void CPaintManagerUI::SetResourceZip(LPVOID pVoid, unsigned int len)
- {
- if( m_pStrResourceZip == _T("membuffer") ) return;
- if( m_bCachedResourceZip && m_hResourceZip != NULL ) {
- CloseZip((HZIP)m_hResourceZip);
- m_hResourceZip = NULL;
- }
- m_pStrResourceZip = _T("membuffer");
- if( m_bCachedResourceZip )
- m_hResourceZip = (HANDLE)OpenZip(pVoid, len, 3);
- }
- void CPaintManagerUI::SetResourceZip(LPCTSTR pStrPath, bool bCachedResourceZip)
- {
- if( m_pStrResourceZip == pStrPath && m_bCachedResourceZip == bCachedResourceZip ) return;
- if( m_bCachedResourceZip && m_hResourceZip != NULL ) {
- CloseZip((HZIP)m_hResourceZip);
- m_hResourceZip = NULL;
- }
- m_pStrResourceZip = pStrPath;
- m_bCachedResourceZip = bCachedResourceZip;
- if( m_bCachedResourceZip ) {
- CDuiString sFile = CPaintManagerUI::GetResourcePath();
- sFile += CPaintManagerUI::GetResourceZip();
- m_hResourceZip = (HANDLE)OpenZip((void*)sFile.GetData(), 0, 2);
- }
- }
- bool CPaintManagerUI::GetHSL(short* H, short* S, short* L)
- {
- *H = m_H;
- *S = m_S;
- *L = m_L;
- return m_bUseHSL;
- }
- void CPaintManagerUI::SetHSL(bool bUseHSL, short H, short S, short L)
- {
- if( m_bUseHSL || m_bUseHSL != bUseHSL ) {
- m_bUseHSL = bUseHSL;
- if( H == m_H && S == m_S && L == m_L ) return;
- m_H = CLAMP(H, 0, 360);
- m_S = CLAMP(S, 0, 200);
- m_L = CLAMP(L, 0, 200);
- AdjustSharedImagesHSL();
- for( int i = 0; i < m_aPreMessages.GetSize(); i++ ) {
- CPaintManagerUI* pManager = static_cast<CPaintManagerUI*>(m_aPreMessages[i]);
- if( pManager != NULL ) pManager->AdjustImagesHSL();
- }
- }
- }
- void CPaintManagerUI::ReloadSkin()
- {
- ReloadSharedImages();
- for( int i = 0; i < m_aPreMessages.GetSize(); i++ ) {
- CPaintManagerUI* pManager = static_cast<CPaintManagerUI*>(m_aPreMessages[i]);
- pManager->ReloadImages();
- }
- }
- CPaintManagerUI* CPaintManagerUI::GetPaintManager(LPCTSTR pstrName)
- {
- if( pstrName == NULL ) return NULL;
- CDuiString sName = pstrName;
- if( sName.IsEmpty() ) return NULL;
- for( int i = 0; i < m_aPreMessages.GetSize(); i++ ) {
- CPaintManagerUI* pManager = static_cast<CPaintManagerUI*>(m_aPreMessages[i]);
- if( pManager != NULL && sName == pManager->GetName() ) return pManager;
- }
- return NULL;
- }
- CStdPtrArray* CPaintManagerUI::GetPaintManagers()
- {
- return &m_aPreMessages;
- }
- bool CPaintManagerUI::LoadPlugin(LPCTSTR pstrModuleName)
- {
- ASSERT( !::IsBadStringPtr(pstrModuleName,-1) || pstrModuleName == NULL );
- if( pstrModuleName == NULL ) return false;
- HMODULE hModule = ::LoadLibrary(pstrModuleName);
- if( hModule != NULL ) {
- LPCREATECONTROL lpCreateControl = (LPCREATECONTROL)::GetProcAddress(hModule, "CreateControl");
- if( lpCreateControl != NULL ) {
- if( m_aPlugins.Find(lpCreateControl) >= 0 ) return true;
- m_aPlugins.Add(lpCreateControl);
- return true;
- }
- }
- return false;
- }
- CStdPtrArray* CPaintManagerUI::GetPlugins()
- {
- return &m_aPlugins;
- }
- HWND CPaintManagerUI::GetPaintWindow() const
- {
- return m_hWndPaint;
- }
- HWND CPaintManagerUI::GetTooltipWindow() const
- {
- return m_hwndTooltip;
- }
- int CPaintManagerUI::GetTooltipWindowWidth() const
- {
- return m_iTooltipWidth;
- }
- void CPaintManagerUI::SetTooltipWindowWidth(int iWidth)
- {
- if( m_iTooltipWidth != iWidth ) {
- m_iTooltipWidth = iWidth;
- if( m_hwndTooltip != NULL && m_iTooltipWidth >= 0 ) {
- m_iTooltipWidth = (int)::SendMessage(m_hwndTooltip, TTM_SETMAXTIPWIDTH, 0, m_iTooltipWidth);
- }
- }
- }
- int CPaintManagerUI::GetHoverTime() const
- {
- return m_iHoverTime;
- }
- void CPaintManagerUI::SetHoverTime(int iTime)
- {
- m_iHoverTime = iTime;
- }
- LPCTSTR CPaintManagerUI::GetName() const
- {
- return m_sName;
- }
- HDC CPaintManagerUI::GetPaintDC() const
- {
- return m_hDcPaint;
- }
- HDC CPaintManagerUI::GetOffscreenDC () const
- {
- return m_hDcOffscreen;
- }
- POINT CPaintManagerUI::GetMousePos () const
- {
- return m_ptLastMousePos;
- }
- SIZE CPaintManagerUI::GetClientSize() const
- {
- RECT rcClient = { 0 };
- ::GetClientRect(m_hWndPaint, &rcClient);
- return CDuiSize(rcClient.right - rcClient.left, rcClient.bottom - rcClient.top);
- }
- SIZE CPaintManagerUI::GetInitSize()
- {
- return m_szInitWindowSize;
- }
- void CPaintManagerUI::SetInitSize(int cx, int cy)
- {
- m_szInitWindowSize.cx = cx;
- m_szInitWindowSize.cy = cy;
- if( m_pRoot == NULL && m_hWndPaint != NULL ) {
- ::SetWindowPos(m_hWndPaint, NULL, 0, 0, cx, cy, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE);
- }
- }
- RECT& CPaintManagerUI::GetSizeBox()
- {
- return m_rcSizeBox;
- }
- void CPaintManagerUI::SetSizeBox(RECT& rcSizeBox)
- {
- m_rcSizeBox = rcSizeBox;
- }
- RECT& CPaintManagerUI::GetCaptionRect()
- {
- return m_rcCaption;
- }
- void CPaintManagerUI::SetCaptionRect(RECT& rcCaption)
- {
- m_rcCaption = rcCaption;
- }
- SIZE CPaintManagerUI::GetRoundCorner() const
- {
- return m_szRoundCorner;
- }
- void CPaintManagerUI::SetRoundCorner(int cx, int cy)
- {
- m_szRoundCorner.cx = cx;
- m_szRoundCorner.cy = cy;
- }
- SIZE CPaintManagerUI::GetMinInfo() const
- {
- return m_szMinWindow;
- }
- void CPaintManagerUI::SetMinInfo(int cx, int cy)
- {
- ASSERT(cx>=0 && cy>=0);
- m_szMinWindow.cx = cx;
- m_szMinWindow.cy = cy;
- }
- SIZE CPaintManagerUI::GetMaxInfo() const
- {
- return m_szMaxWindow;
- }
- void CPaintManagerUI::SetMaxInfo(int cx, int cy)
- {
- ASSERT(cx>=0 && cy>=0);
- m_szMaxWindow.cx = cx;
- m_szMaxWindow.cy = cy;
- }
- bool CPaintManagerUI::IsShowUpdateRect() const
- {
- return m_bShowUpdateRect;
- }
- void CPaintManagerUI::SetShowUpdateRect(bool show)
- {
- m_bShowUpdateRect = show;
- }
- BYTE CPaintManagerUI::GetOpacity() const
- {
- return m_nOpacity;
- }
- void CPaintManagerUI::SetOpacity(BYTE nOpacity)
- {
- m_nOpacity = nOpacity;
- if( m_hWndPaint != NULL ) {
- typedef BOOL (__stdcall *PFUNCSETLAYEREDWINDOWATTR)(HWND, COLORREF, BYTE, DWORD);
- PFUNCSETLAYEREDWINDOWATTR fSetLayeredWindowAttributes;
- HMODULE hUser32 = ::GetModuleHandle(_T("User32.dll"));
- if (hUser32)
- {
- fSetLayeredWindowAttributes =
- (PFUNCSETLAYEREDWINDOWATTR)::GetProcAddress(hUser32, "SetLayeredWindowAttributes");
- if( fSetLayeredWindowAttributes == NULL ) return;
- }
- DWORD dwStyle = ::GetWindowLong(m_hWndPaint, GWL_EXSTYLE);
- DWORD dwNewStyle = dwStyle;
- if( nOpacity >= 0 && nOpacity < 256 ) dwNewStyle |= WS_EX_LAYERED;
- else dwNewStyle &= ~WS_EX_LAYERED;
- if(dwStyle != dwNewStyle) ::SetWindowLong(m_hWndPaint, GWL_EXSTYLE, dwNewStyle);
- fSetLayeredWindowAttributes(m_hWndPaint, 0, nOpacity, LWA_ALPHA);
- }
- }
- bool CPaintManagerUI::IsLayered()
- {
- return m_bLayered;
- }
- void CPaintManagerUI::SetLayered(bool bLayered)
- {
- if( m_hWndPaint != NULL && bLayered != m_bLayered ) {
- UINT uStyle = GetWindowStyle(m_hWndPaint);
- if( (uStyle & WS_CHILD) != 0 ) return;
- if( g_fUpdateLayeredWindow == NULL ) {
- HMODULE hUser32 = ::GetModuleHandle(_T("User32.dll"));
- if (hUser32) {
- g_fUpdateLayeredWindow =
- (PFUNCUPDATELAYEREDWINDOW)::GetProcAddress(hUser32, "UpdateLayeredWindow");
- if( g_fUpdateLayeredWindow == NULL ) return;
- }
- }
- DWORD dwExStyle = ::GetWindowLong(m_hWndPaint, GWL_EXSTYLE);
- DWORD dwNewExStyle = dwExStyle;
- if( bLayered ) {
- dwNewExStyle |= WS_EX_LAYERED;
- ::SetTimer(m_hWndPaint, LAYEREDUPDATE_TIMERID, 10L, NULL);
- }
- else {
- dwNewExStyle &= ~WS_EX_LAYERED;
- ::KillTimer(m_hWndPaint, LAYEREDUPDATE_TIMERID);
- }
- if(dwExStyle != dwNewExStyle) ::SetWindowLong(m_hWndPaint, GWL_EXSTYLE, dwNewExStyle);
- m_bLayered = bLayered;
- if( m_pRoot != NULL ) m_pRoot->NeedUpdate();
- Invalidate();
- }
- }
- RECT& CPaintManagerUI::GetLayeredInset()
- {
- return m_rcLayeredInset;
- }
- void CPaintManagerUI::SetLayeredInset(RECT& rcLayeredInset)
- {
- m_rcLayeredInset = rcLayeredInset;
- m_bLayeredChanged = true;
- Invalidate();
- }
- BYTE CPaintManagerUI::GetLayeredOpacity()
- {
- return m_nOpacity;
- }
- void CPaintManagerUI::SetLayeredOpacity(BYTE nOpacity)
- {
- m_nOpacity = nOpacity;
- m_bLayeredChanged = true;
- Invalidate();
- }
- LPCTSTR CPaintManagerUI::GetLayeredImage()
- {
- return m_diLayered.sDrawString;
- }
- void CPaintManagerUI::SetLayeredImage(LPCTSTR pstrImage)
- {
- m_diLayered.sDrawString = pstrImage;
- RECT rcNull = {0};
- CRenderEngine::DrawImage(NULL, this, rcNull, rcNull, m_diLayered);
- }
- bool CPaintManagerUI::PreMessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& /*lRes*/)
- {
- for( int i = 0; i < m_aPreMessageFilters.GetSize(); i++ )
- {
- bool bHandled = false;
- LRESULT lResult = static_cast<IMessageFilterUI*>(m_aPreMessageFilters[i])->MessageHandler(uMsg, wParam, lParam, bHandled);
- if( bHandled ) {
- return true;
- }
- }
- switch( uMsg ) {
- case WM_KEYDOWN:
- {
- // Tabbing between controls
- if( wParam == VK_TAB ) {
- if( m_pFocus && m_pFocus->IsVisible() && m_pFocus->IsEnabled() && _tcsstr(m_pFocus->GetClass(), _T("RichEditUI")) != NULL ) {
- if( static_cast<CRichEditUI*>(m_pFocus)->IsWantTab() ) return false;
- }
- SetNextTabControl(::GetKeyState(VK_SHIFT) >= 0);
- return true;
- }
- }
- break;
- case WM_SYSCHAR:
- {
- if( m_pRoot == NULL ) return false;
- // Handle ALT-shortcut key-combinations
- FINDSHORTCUT fs = { 0 };
- fs.ch = toupper((int)wParam);
- CControlUI* pControl = m_pRoot->FindControl(__FindControlFromShortcut, &fs, UIFIND_ENABLED | UIFIND_ME_FIRST | UIFIND_TOP_FIRST);
- if( pControl != NULL ) {
- pControl->SetFocus();
- pControl->Activate();
- return true;
- }
- }
- break;
- case WM_SYSKEYDOWN:
- {
- if( m_pFocus != NULL ) {
- TEventUI event = { 0 };
- event.Type = UIEVENT_SYSKEY;
- event.pSender = m_pFocus;
- event.chKey = (TCHAR)wParam;
- event.ptMouse = m_ptLastMousePos;
- event.wKeyState = MapKeyState();
- event.dwTimestamp = ::GetTickCount();
- m_pFocus->Event(event);
- }
- }
- break;
- }
- return false;
- }
- bool CPaintManagerUI::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lRes)
- {
- //#ifdef _DEBUG
- // switch( uMsg ) {
- // case WM_NCPAINT:
- // case WM_NCHITTEST:
- // case WM_SETCURSOR:
- // break;
- // default:
- // DUITRACE(_T("MSG: %-20s (%08ld)"), DUITRACEMSG(uMsg), ::GetTickCount());
- // }
- //#endif
- // Not ready yet?
- if( m_hWndPaint == NULL ) return false;
-
- // Cycle through listeners
- for( int i = 0; i < m_aMessageFilters.GetSize(); i++ )
- {
- bool bHandled = false;
- LRESULT lResult = static_cast<IMessageFilterUI*>(m_aMessageFilters[i])->MessageHandler(uMsg, wParam, lParam, bHandled);
- if( bHandled ) {
- lRes = lResult;
- switch( uMsg ) {
- case WM_MOUSEMOVE:
- case WM_LBUTTONDOWN:
- case WM_LBUTTONDBLCLK:
- case WM_LBUTTONUP:
- {
- POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
- m_ptLastMousePos = pt;
- }
- break;
- case WM_CONTEXTMENU:
- case WM_MOUSEWHEEL:
- {
- POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
- ::ScreenToClient(m_hWndPaint, &pt);
- m_ptLastMousePos = pt;
- }
- break;
- }
- return true;
- }
- }
- if( m_bLayered ) {
- switch( uMsg ) {
- case WM_NCACTIVATE:
- if( !::IsIconic(m_hWndPaint) ) {
- lRes = (wParam == 0) ? TRUE : FALSE;
- return true;
- }
- break;
- case WM_NCCALCSIZE:
- case WM_NCPAINT:
- lRes = 0;
- return true;
- }
- }
- // Custom handling of events
- switch( uMsg ) {
- case WM_APP + 1:
- {
- m_bAsyncNotifyPosted = false;
- for( int i = 0; i < m_aDelayedCleanup.GetSize(); i++ )
- delete static_cast<CControlUI*>(m_aDelayedCleanup[i]);
- m_aDelayedCleanup.Empty();
- TNotifyUI* pMsg = NULL;
- while( pMsg = static_cast<TNotifyUI*>(m_aAsyncNotify.GetAt(0)) ) {
- m_aAsyncNotify.Remove(0);
- if( pMsg->pSender != NULL ) {
- if( pMsg->pSender->OnNotify ) pMsg->pSender->OnNotify(pMsg);
- }
- for( int j = 0; j < m_aNotifiers.GetSize(); j++ ) {
- static_cast<INotifyUI*>(m_aNotifiers[j])->Notify(*pMsg);
- }
- delete pMsg;
- }
- }
- break;
- case WM_CLOSE:
- {
- // Make sure all matching "closing" events are sent
- TEventUI event = { 0 };
- event.ptMouse = m_ptLastMousePos;
- event.wKeyState = MapKeyState();
- event.dwTimestamp = ::GetTickCount();
- if( m_pEventHover != NULL ) {
- event.Type = UIEVENT_MOUSELEAVE;
- event.pSender = m_pEventHover;
- m_pEventHover->Event(event);
- }
- if( m_pEventClick != NULL ) {
- event.Type = UIEVENT_BUTTONUP;
- event.pSender = m_pEventClick;
- m_pEventClick->Event(event);
- }
- SetFocus(NULL);
- if( ::GetActiveWindow() == m_hWndPaint ) {
- HWND hwndParent = GetWindowOwner(m_hWndPaint);
- if( hwndParent != NULL ) ::SetFocus(hwndParent);
- }
- if (m_hwndTooltip != NULL) //by jiangdong 修改当父窗体以成员变量形式在窗口类中存在时候,当点击父窗体关闭按钮的时候
- //提示框内容还停留在页面中,没有销毁。
- {
- ::DestroyWindow(m_hwndTooltip);
- m_hwndTooltip = NULL;
- }
- }
- break;
- case WM_ERASEBKGND:
- {
- // We'll do the painting here...
- lRes = 1;
- }
- return true;
- case WM_PAINT:
- {
- if( m_pRoot == NULL ) {
- PAINTSTRUCT ps = { 0 };
- ::BeginPaint(m_hWndPaint, &ps);
- CRenderEngine::DrawColor(m_hDcPaint, ps.rcPaint, 0xFF000000);
- ::EndPaint(m_hWndPaint, &ps);
- return true;
- }
- RECT rcClient = { 0 };
- ::GetClientRect(m_hWndPaint, &rcClient);
- RECT rcPaint = { 0 };
- if( m_bLayered ) {
- m_bOffscreenPaint = true;
- rcPaint = m_rcLayeredUpdate;
- if( ::IsRectEmpty(&m_rcLayeredUpdate) ) {
- PAINTSTRUCT ps = { 0 };
- ::BeginPaint(m_hWndPaint, &ps);
- ::EndPaint(m_hWndPaint, &ps);
- return true;
- }
- if( rcPaint.right > rcClient.right ) rcPaint.right = rcClient.right;
- if( rcPaint.bottom > rcClient.bottom ) rcPaint.bottom = rcClient.bottom;
- ::ZeroMemory(&m_rcLayeredUpdate, sizeof(m_rcLayeredUpdate));
- }
- else {
- if( !::GetUpdateRect(m_hWndPaint, &rcPaint, FALSE) ) return true;
- }
-
- SetPainting(true);
- if( m_bUpdateNeeded ) {
- m_bUpdateNeeded = false;
- if( !::IsRectEmpty(&rcClient) ) {
- if( m_pRoot->IsUpdateNeeded() ) {
- RECT rcRoot = rcClient;
- if( m_hDcOffscreen != NULL ) ::DeleteDC(m_hDcOffscreen);
- if( m_hDcBackground != NULL ) ::DeleteDC(m_hDcBackground);
- if( m_hbmpOffscreen != NULL ) ::DeleteObject(m_hbmpOffscreen);
- if( m_hbmpBackground != NULL ) ::DeleteObject(m_hbmpBackground);
- m_hDcOffscreen = NULL;
- m_hDcBackground = NULL;
- m_hbmpOffscreen = NULL;
- m_hbmpBackground = NULL;
- if( m_bLayered ) {
- rcRoot.left += m_rcLayeredInset.left;
- rcRoot.top += m_rcLayeredInset.top;
- rcRoot.right -= m_rcLayeredInset.right;
- rcRoot.bottom -= m_rcLayeredInset.bottom;
- }
- m_pRoot->SetPos(rcRoot, true);
- }
- else {
- CControlUI* pControl = NULL;
- m_aFoundControls.Empty();
- m_pRoot->FindControl(__FindControlsFromUpdate, NULL, UIFIND_VISIBLE | UIFIND_ME_FIRST | UIFIND_UPDATETEST);
- for( int it = 0; it < m_aFoundControls.GetSize(); it++ ) {
- pControl = static_cast<CControlUI*>(m_aFoundControls[it]);
- if( !pControl->IsFloat() ) pControl->SetPos(pControl->GetPos(), true);
- else pControl->SetPos(pControl->GetRelativePos(), true);
- }
- }
- // We'll want to notify the window when it is first initialized
- // with the correct layout. The window form would take the time
- // to submit swipes/animations.
- if( m_bFirstLayout ) {
- m_bFirstLayout = false;
- SendNotify(m_pRoot, DUI_MSGTYPE_WINDOWINIT, 0, 0, false);
- if( m_bLayered && m_bLayeredChanged ) {
- Invalidate();
- SetPainting(false);
- return true;
- }
- }
- }
- }
- else if( m_bLayered && m_bLayeredChanged ) {
- RECT rcRoot = rcClient;
- if( m_pOffscreenBits ) ::ZeroMemory(m_pOffscreenBits, (rcRoot.right - rcRoot.left)
- * (rcRoot.bottom - rcRoot.top) * 4);
- rcRoot.left += m_rcLayeredInset.left;
- rcRoot.top += m_rcLayeredInset.top;
- rcRoot.right -= m_rcLayeredInset.right;
- rcRoot.bottom -= m_rcLayeredInset.bottom;
- m_pRoot->SetPos(rcRoot, true);
- }
- // Set focus to first control?
- if( m_bFocusNeeded ) {
- SetNextTabControl();
- }
- //
- // Render screen
- //
- // Prepare offscreen bitmap?
- if( m_bOffscreenPaint && m_hbmpOffscreen == NULL )
- {
- m_hDcOffscreen = ::CreateCompatibleDC(m_hDcPaint);
- if( m_bLayered ) m_hbmpOffscreen = CRenderEngine::CreateARGB32Bitmap(m_hDcPaint, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top, &m_pOffscreenBits);
- else m_hbmpOffscreen = ::CreateCompatibleBitmap(m_hDcPaint, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top);
- ASSERT(m_hDcOffscreen);
- ASSERT(m_hbmpOffscreen);
- }
- // Begin Windows paint
- PAINTSTRUCT ps = { 0 };
- ::BeginPaint(m_hWndPaint, &ps);
- if( m_bOffscreenPaint )
- {
- HBITMAP hOldBitmap = (HBITMAP) ::SelectObject(m_hDcOffscreen, m_hbmpOffscreen);
- int iSaveDC = ::SaveDC(m_hDcOffscreen);
- if (m_bLayered && m_diLayered.pImageInfo == NULL) {
- COLORREF* pOffscreenBits = NULL;
- for( LONG y = rcClient.bottom - rcPaint.bottom; y < rcClient.bottom - rcPaint.top; ++y ) {
- for( LONG x = rcPaint.left; x < rcPaint.right; ++x ) {
- pOffscreenBits = m_pOffscreenBits + y*(rcClient.right - rcClient.left) + x;
- *pOffscreenBits = 0;
- }
- }
- }
- m_pRoot->Paint(m_hDcOffscreen, rcPaint);
- if( m_bLayered ) {
- for( int i = 0; i < m_aNativeWindow.GetSize(); ) {
- HWND hChildWnd = static_cast<HWND>(m_aNativeWindow[i]);
- if (!::IsWindow(hChildWnd)) {
- m_aNativeWindow.Remove(i);
- m_aNativeWindowControl.Remove(i);
- continue;
- }
- ++i;
- if (!::IsWindowVisible(hChildWnd)) continue;
- RECT rcChildWnd;
- GetChildWndRect(m_hWndPaint, hChildWnd, rcChildWnd);
- RECT rcTemp = { 0 };
- if( !::IntersectRect(&rcTemp, &rcPaint, &rcChildWnd) ) continue;
- COLORREF* pChildBitmapBits = NULL;
- HDC hChildMemDC = ::CreateCompatibleDC(m_hDcOffscreen);
- HBITMAP hChildBitmap = CRenderEngine::CreateARGB32Bitmap(hChildMemDC, rcChildWnd.right-rcChildWnd.left, rcChildWnd.bottom-rcChildWnd.top, &pChildBitmapBits);
- ::ZeroMemory(pChildBitmapBits, (rcChildWnd.right - rcChildWnd.left)*(rcChildWnd.bottom - rcChildWnd.top)*4);
- HBITMAP hOldChildBitmap = (HBITMAP) ::SelectObject(hChildMemDC, hChildBitmap);
- ::SendMessage(hChildWnd, WM_PRINT, (WPARAM)hChildMemDC,(LPARAM)(PRF_CHECKVISIBLE|PRF_CHILDREN|PRF_CLIENT|PRF_OWNED));
- COLORREF* pChildBitmapBit;
- for( LONG y = 0; y < rcChildWnd.bottom-rcChildWnd.top; y++ ) {
- for( LONG x = 0; x < rcChildWnd.right-rcChildWnd.left; x++ ) {
- pChildBitmapBit = pChildBitmapBits+y*(rcChildWnd.right-rcChildWnd.left) + x;
- if (*pChildBitmapBit != 0x00000000) *pChildBitmapBit |= 0xff000000;
- }
- }
- ::BitBlt(m_hDcOffscreen, rcChildWnd.left, rcChildWnd.top, rcChildWnd.right - rcChildWnd.left,
- rcChildWnd.bottom - rcChildWnd.top, hChildMemDC, 0, 0, SRCCOPY);
- ::SelectObject(hChildMemDC, hOldChildBitmap);
- ::DeleteObject(hChildBitmap);
- ::DeleteDC(hChildMemDC);
- }
- }
- for( int i = 0; i < m_aPostPaintControls.GetSize(); i++ ) {
- CControlUI* pPostPaintControl = static_cast<CControlUI*>(m_aPostPaintControls[i]);
- pPostPaintControl->DoPostPaint(m_hDcOffscreen, rcPaint);
- }
- ::RestoreDC(m_hDcOffscreen, iSaveDC);
- if( m_bLayered ) {
- RECT rcWnd = { 0 };
- ::GetWindowRect(m_hWndPaint, &rcWnd);
- DWORD dwWidth = rcClient.right - rcClient.left;
- DWORD dwHeight = rcClient.bottom - rcClient.top;
- RECT rcLayeredClient = rcClient;
- rcLayeredClient.left += m_rcLayeredInset.left;
- rcLayeredClient.top += m_rcLayeredInset.top;
- rcLayeredClient.right -= m_rcLayeredInset.right;
- rcLayeredClient.bottom -= m_rcLayeredInset.bottom;
- COLORREF* pOffscreenBits = m_pOffscreenBits;
- COLORREF* pBackgroundBits = m_pBackgroundBits;
- BYTE A = 0;
- BYTE R = 0;
- BYTE G = 0;
- BYTE B = 0;
- if (m_diLayered.pImageInfo != NULL) {
- if( m_hbmpBackground == NULL) {
- m_hDcBackground = ::CreateCompatibleDC(m_hDcPaint);
- m_hbmpBackground = CRenderEngine::CreateARGB32Bitmap(m_hDcPaint, dwWidth, dwHeight, &m_pBackgroundBits);
- ASSERT(m_hDcBackground);
- ASSERT(m_hbmpBackground);
- ::ZeroMemory(m_pBackgroundBits, dwWidth * dwHeight * 4);
- ::SelectObject(m_hDcBackground, m_hbmpBackground);
- CRenderClip clip;
- CRenderClip::GenerateClip(m_hDcBackground, rcLayeredClient, clip);
- CRenderEngine::DrawImage(m_hDcBackground, this, rcLayeredClient, rcLayeredClient, m_diLayered);
- }
- else if( m_bLayeredChanged ) {
- ::ZeroMemory(m_pBackgroundBits, dwWidth * dwHeight * 4);
- CRenderClip clip;
- CRenderClip::GenerateClip(m_hDcBackground, rcLayeredClient, clip);
- CRenderEngine::DrawImage(m_hDcBackground, this, rcLayeredClient, rcLayeredClient, m_diLayered);
- }
- if( m_diLayered.pImageInfo->bAlpha ) {
- for( LONG y = rcClient.bottom - rcPaint.bottom; y < rcClient.bottom - rcPaint.top; ++y ) {
- for( LONG x = rcPaint.left; x < rcPaint.right; ++x ) {
- pOffscreenBits = m_pOffscreenBits + y * dwWidth + x;
- pBackgroundBits = m_pBackgroundBits + y * dwWidth + x;
- A = (BYTE)((*pBackgroundBits) >> 24);
- R = (BYTE)((*pOffscreenBits) >> 16) * A / 255;
- G = (BYTE)((*pOffscreenBits) >> 8) * A / 255;
- B = (BYTE)(*pOffscreenBits) * A / 255;
- *pOffscreenBits = RGB(B, G, R) + ((DWORD)A << 24);
- }
- }
- }
- }
- BLENDFUNCTION bf = { AC_SRC_OVER, 0, m_nOpacity, AC_SRC_ALPHA };
- POINT ptPos = { rcWnd.left, rcWnd.top };
- SIZE sizeWnd = { dwWidth, dwHeight };
- POINT ptSrc = { 0, 0 };
- g_fUpdateLayeredWindow(m_hWndPaint, m_hDcPaint, &ptPos, &sizeWnd, m_hDcOffscreen, &ptSrc, 0, &bf, ULW_ALPHA);
- }
- else
- ::BitBlt(m_hDcPaint, rcPaint.left, rcPaint.top, rcPaint.right - rcPaint.left,
- rcPaint.bottom - rcPaint.top, m_hDcOffscreen, rcPaint.left, rcPaint.top, SRCCOPY);
- ::SelectObject(m_hDcOffscreen, hOldBitmap);
- if( m_bShowUpdateRect && !m_bLayered ) {
- HPEN hOldPen = (HPEN)::SelectObject(m_hDcPaint, m_hUpdateRectPen);
- ::SelectObject(m_hDcPaint, ::GetStockObject(HOLLOW_BRUSH));
- ::Rectangle(m_hDcPaint, rcPaint.left, rcPaint.top, rcPaint.right, rcPaint.bottom);
- ::SelectObject(m_hDcPaint, hOldPen);
- }
- }
- else
- {
- // A standard paint job
- int iSaveDC = ::SaveDC(m_hDcPaint);
- m_pRoot->Paint(m_hDcPaint, rcPaint);
- ::RestoreDC(m_hDcPaint, iSaveDC);
- }
- // All Done!
- ::EndPaint(m_hWndPaint, &ps);
- SetPainting(false);
- m_bLayeredChanged = false;
- if( m_bUpdateNeeded ) Invalidate();
- }
- return true;
- case WM_PRINTCLIENT:
- {
- if( m_pRoot == NULL ) break;
- RECT rcClient;
- ::GetClientRect(m_hWndPaint, &rcClient);
- HDC hDC = (HDC) wParam;
- int save = ::SaveDC(hDC);
- m_pRoot->Paint(hDC, rcClient);
- // Check for traversing children. The crux is that WM_PRINT will assume
- // that the DC is positioned at frame coordinates and will paint the child
- // control at the wrong position. We'll simulate the entire thing instead.
- if( (lParam & PRF_CHILDREN) != 0 ) {
- HWND hWndChild = ::GetWindow(m_hWndPaint, GW_CHILD);
- while( hWndChild != NULL ) {
- RECT rcPos = { 0 };
- ::GetWindowRect(hWndChild, &rcPos);
- ::MapWindowPoints(HWND_DESKTOP, m_hWndPaint, reinterpret_cast<LPPOINT>(&rcPos), 2);
- ::SetWindowOrgEx(hDC, -rcPos.left, -rcPos.top, NULL);
- // NOTE: We use WM_PRINT here rather than the expected WM_PRINTCLIENT
- // since the latter will not print the nonclient correctly for
- // EDIT controls.
- ::SendMessage(hWndChild, WM_PRINT, wParam, lParam | PRF_NONCLIENT);
- hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT);
- }
- }
- ::RestoreDC(hDC, save);
- }
- break;
- case WM_GETMINMAXINFO:
- {
- LPMINMAXINFO lpMMI = (LPMINMAXINFO) lParam;
- if( m_szMinWindow.cx > 0 ) lpMMI->ptMinTrackSize.x = m_szMinWindow.cx;
- if( m_szMinWindow.cy > 0 ) lpMMI->ptMinTrackSize.y = m_szMinWindow.cy;
- if( m_szMaxWindow.cx > 0 ) lpMMI->ptMaxTrackSize.x = m_szMaxWindow.cx;
- if( m_szMaxWindow.cy > 0 ) lpMMI->ptMaxTrackSize.y = m_szMaxWindow.cy;
- }
- break;
- case WM_SIZE:
- {
- if( m_pFocus != NULL ) {
- TEventUI event = { 0 };
- event.Type = UIEVENT_WINDOWSIZE;
- event.pSender = m_pFocus;
- event.wParam = wParam;
- event.lParam = lParam;
- event.dwTimestamp = ::GetTickCount();
- event.ptMouse = m_ptLastMousePos;
- event.wKeyState = MapKeyState();
- m_pFocus->Event(event);
- }
- if( m_pRoot != NULL ) m_pRoot->NeedUpdate();
- if( m_bLayered ) Invalidate();
- }
- return true;
- case WM_TIMER:
- {
- if( LOWORD(wParam) == LAYEREDUPDATE_TIMERID ) {
- if( m_bLayered && !::IsRectEmpty(&m_rcLayeredUpdate) ) {
- LRESULT lRes = 0;
- if( !::IsIconic(m_hWndPaint) ) MessageHandler(WM_PAINT, 0, 0L, lRes);
- break;
- }
- }
- for( int i = 0; i < m_aTimers.GetSize(); i++ ) {
- const TIMERINFO* pTimer = static_cast<TIMERINFO*>(m_aTimers[i]);
- if( pTimer->hWnd == m_hWndPaint && pTimer->uWinTimer == LOWORD(wParam) && pTimer->bKilled == false) {
- TEventUI event = { 0 };
- event.Type = UIEVENT_TIMER;
- event.pSender = pTimer->pSender;
- event.dwTimestamp = ::GetTickCount();
- event.ptMouse = m_ptLastMousePos;
- event.wKeyState = MapKeyState();
- event.wParam = pTimer->nLocalID;
- event.lParam = lParam;
- pTimer->pSender->Event(event);
- break;
- }
- }
- }
- break;
- case WM_MOUSEHOVER:
- {
- if( m_pRoot == NULL ) break;
- m_bMouseTracking = false;
- POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
- CControlUI* pHover = FindControl(pt);
- if( pHover == NULL ) break;
- // Generate mouse hover event
- if( m_pEventHover != NULL ) {
- TEventUI event = { 0 };
- event.Type = UIEVENT_MOUSEHOVER;
- event.pSender = m_pEventHover;
- event.wParam = wParam;
- event.lParam = lParam;
- event.dwTimestamp = ::GetTickCount();
- event.ptMouse = pt;
- event.wKeyState = MapKeyState();
- m_pEventHover->Event(event);
- }
- // Create tooltip information
- CDuiString sToolTip = pHover->GetToolTip();
- if( sToolTip.IsEmpty() ) return true;
- ProcessMultiLanguageTokens(sToolTip);
- ::ZeroMemory(&m_ToolTip, sizeof(TOOLINFO));
- m_ToolTip.cbSize = sizeof(TOOLINFO);
- m_ToolTip.uFlags = TTF_IDISHWND;
- m_ToolTip.hwnd = m_hWndPaint;
- m_ToolTip.uId = (UINT_PTR) m_hWndPaint;
- m_ToolTip.hinst = m_hInstance;
- m_ToolTip.lpszText = const_cast<LPTSTR>( (LPCTSTR) sToolTip );
- m_ToolTip.rect = pHover->GetPos();
- if( m_hwndTooltip == NULL ) {
- m_hwndTooltip = ::CreateWindowEx(0, TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, m_hWndPaint, NULL, m_hInstance, NULL);
- if( m_hwndTooltip != NULL && m_iTooltipWidth >= 0 ) {
- m_iTooltipWidth = (int)::SendMessage(m_hwndTooltip, TTM_SETMAXTIPWIDTH, 0, m_iTooltipWidth);
- }
- ::SendMessage(m_hwndTooltip, TTM_ADDTOOL, 0, (LPARAM) &m_ToolTip);
- }
- ::SendMessage( m_hwndTooltip,TTM_SETMAXTIPWIDTH,0, pHover->GetToolTipWidth());
- ::SendMessage(m_hwndTooltip, TTM_SETTOOLINFO, 0, (LPARAM) &m_ToolTip);
- ::SendMessage(m_hwndTooltip, TTM_TRACKACTIVATE, TRUE, (LPARAM) &m_ToolTip);
- }
- return true;
- case WM_MOUSELEAVE:
- {
- if( m_pRoot == NULL ) break;
- if( m_hwndTooltip != NULL ) ::SendMessage(m_hwndTooltip, TTM_TRACKACTIVATE, FALSE, (LPARAM) &m_ToolTip);
- if( m_bMouseTracking ) {
- POINT pt = { 0 };
- RECT rcWnd = { 0 };
- ::GetCursorPos(&pt);
- ::GetWindowRect(m_hWndPaint, &rcWnd);
- if( !::IsIconic(m_hWndPaint) && ::GetActiveWindow() == m_hWndPaint && ::PtInRect(&rcWnd, pt) ) {
- if( ::SendMessage(m_hWndPaint, WM_NCHITTEST, 0, MAKELPARAM(pt.x, pt.y)) == HTCLIENT ) {
- ::ScreenToClient(m_hWndPaint, &pt);
- ::SendMessage(m_hWndPaint, WM_MOUSEMOVE, 0, MAKELPARAM(pt.x, pt.y));
- }
- else
- ::SendMessage(m_hWndPaint, WM_MOUSEMOVE, 0, (LPARAM)-1);
- }
- else
- ::SendMessage(m_hWndPaint, WM_MOUSEMOVE, 0, (LPARAM)-1);
- }
- m_bMouseTracking = false;
- }
- break;
- case WM_MOUSEMOVE:
- {
- if( m_pRoot == NULL ) break;
- // Start tracking this entire window again...
- if( !m_bMouseTracking ) {
- TRACKMOUSEEVENT tme = { 0 };
- tme.cbSize = sizeof(TRACKMOUSEEVENT);
- tme.dwFlags = TME_HOVER | TME_LEAVE;
- tme.hwndTrack = m_hWndPaint;
- tme.dwHoverTime = m_hwndTooltip == NULL ? m_iHoverTime : (DWORD) ::SendMessage(m_hwndTooltip, TTM_GETDELAYTIME, TTDT_INITIAL, 0L);
- _TrackMouseEvent(&tme);
- m_bMouseTracking = true;
- }
- // Generate the appropriate mouse messages
- POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
- m_ptLastMousePos = pt;
- CControlUI* pNewHover = FindControl(pt);
- if( pNewHover != NULL && pNewHover->GetManager() != this ) break;
- TEventUI event = { 0 };
- event.ptMouse = pt;
- event.wParam = wParam;
- event.lParam = lParam;
- event.dwTimestamp = ::GetTickCount();
- event.wKeyState = MapKeyState();
- if( !IsCaptured() ) {
- pNewHover = FindControl(pt);
- if( pNewHover != NULL && pNewHover->GetManager() != this ) break;
- if( pNewHover != m_pEventHover && m_pEventHover != NULL ) {
- event.Type = UIEVENT_MOUSELEAVE;
- event.pSender = m_pEventHover;
- m_pEventHover->Event(event);
- m_pEventHover = NULL;
- if( m_hwndTooltip != NULL ) ::SendMessage(m_hwndTooltip, TTM_TRACKACTIVATE, FALSE, (LPARAM) &m_ToolTip);
- }
- if( pNewHover != m_pEventHover && pNewHover != NULL ) {
- event.Type = UIEVENT_MOUSEENTER;
- event.pSender = pNewHover;
- pNewHover->Event(event);
- m_pEventHover = pNewHover;
- }
- }
- if( m_pEventClick != NULL ) {
- event.Type = UIEVENT_MOUSEMOVE;
- event.pSender = m_pEventClick;
- m_pEventClick->Event(event);
- }
- else if( pNewHover != NULL ) {
- event.Type = UIEVENT_MOUSEMOVE;
- event.pSender = pNewHover;
- pNewHover->Event(event);
- }
- }
- break;
- case WM_LBUTTONDOWN:
- {
- // We alway set focus back to our app (this helps
- // when Win32 child windows are placed on the dialog
- // and we need to remove them on focus change).
- ::SetFocus(m_hWndPaint);
- if( m_pRoot == NULL ) break;
- POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
- m_ptLastMousePos = pt;
- CControlUI* pControl = FindControl(pt);
- if( pControl == NULL ) break;
- if( pControl->GetManager() != this ) break;
- m_pEventClick = pControl;
- pControl->SetFocus();
- SetCapture();
- TEventUI event = { 0 };
- event.Type = UIEVENT_BUTTONDOWN;
- event.pSender = pControl;
- event.wParam = wParam;
- event.lParam = lParam;
- event.ptMouse = pt;
- event.wKeyState = (WORD)wParam;
- event.dwTimestamp = ::GetTickCount();
- pControl->Event(event);
- }
- break;
- case WM_LBUTTONDBLCLK:
- {
- ::SetFocus(m_hWndPaint);
- POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
- m_ptLastMousePos = pt;
- CControlUI* pControl = FindControl(pt);
- if( pControl == NULL ) break;
- if( pControl->GetManager() != this ) break;
- SetCapture();
- TEventUI event = { 0 };
- event.Type = UIEVENT_DBLCLICK;
- event.pSender = pControl;
- event.ptMouse = pt;
- event.wKeyState = (WORD)wParam;
- event.dwTimestamp = ::GetTickCount();
- pControl->Event(event);
- m_pEventClick = pControl;
- }
- break;
- case WM_LBUTTONUP:
- {
- POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
- m_ptLastMousePos = pt;
- if( m_pEventClick == NULL ) break;
- ReleaseCapture();
- TEventUI event = { 0 };
- event.Type = UIEVENT_BUTTONUP;
- event.pSender = m_pEventClick;
- event.wParam = wParam;
- event.lParam = lParam;
- event.ptMouse = pt;
- event.wKeyState = (WORD)wParam;
- event.dwTimestamp = ::GetTickCount();
- // By daviyang35 at 2015-6-5 16:10:13
- // 在Click事件中弹出了模态对话框,退出阶段窗口实例可能已经删除
- // this成员属性赋值将会导致heap错误
- // this成员函数调用将会导致野指针异常
- // 使用栈上的成员来调用响应,提前清空成员
- // 当阻塞的模态窗口返回时,回栈阶段不访问任何类实例方法或属性
- // 将不会触发异常
- CControlUI* pClick = m_pEventClick;
- m_pEventClick = NULL;
- pClick->Event(event);
- }
- break;
- case WM_RBUTTONDOWN:
- {
- ::SetFocus(m_hWndPaint);
- POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
- m_ptLastMousePos = pt;
- CControlUI* pControl = FindControl(pt);
- if( pControl == NULL ) break;
- if( pControl->GetManager() != this ) break;
- pControl->SetFocus();
- TEventUI event = { 0 };
- event.Type = UIEVENT_RBUTTONDOWN;
- event.pSender = pControl;
- event.wParam = wParam;
- event.lParam = lParam;
- event.ptMouse = pt;
- event.wKeyState = (WORD)wParam;
- event.dwTimestamp = ::GetTickCount();
- pControl->Event(event);
- m_pEventClick = pControl;
- }
- break;
- case WM_CONTEXTMENU:
- {
- if( m_pRoot == NULL ) break;
- if( IsCaptured() ) break;
- POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
- ::ScreenToClient(m_hWndPaint, &pt);
- m_ptLastMousePos = pt;
- if( m_pEventClick == NULL ) break;
- TEventUI event = { 0 };
- event.Type = UIEVENT_CONTEXTMENU;
- event.pSender = m_pEventClick;
- event.ptMouse = pt;
- event.wKeyState = (WORD)wParam;
- event.lParam = (LPARAM)m_pEventClick;
- event.dwTimestamp = ::GetTickCount();
- m_pEventClick->Event(event);
- m_pEventClick = NULL;
- }
- break;
- case WM_MOUSEWHEEL:
- {
- if( m_pRoot == NULL ) break;
- POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
- ::ScreenToClient(m_hWndPaint, &pt);
- m_ptLastMousePos = pt;
- CControlUI* pControl = FindControl(pt);
- if( pControl == NULL ) break;
- if( pControl->GetManager() != this ) break;
- int zDelta = (int) (short) HIWORD(wParam);
- TEventUI event = { 0 };
- event.Type = UIEVENT_SCROLLWHEEL;
- event.pSender = pControl;
- event.wParam = MAKELPARAM(zDelta < 0 ? SB_LINEDOWN : SB_LINEUP, 0);
- event.lParam = lParam;
- event.wKeyState = MapKeyState();
- event.dwTimestamp = ::GetTickCount();
- pControl->Event(event);
- // Let's make sure that the scroll item below the cursor is the same as before...
- ::SendMessage(m_hWndPaint, WM_MOUSEMOVE, 0, (LPARAM) MAKELPARAM(m_ptLastMousePos.x, m_ptLastMousePos.y));
- }
- break;
- case WM_CHAR:
- {
- if( m_pRoot == NULL ) break;
- if( m_pFocus == NULL ) break;
- TEventUI event = { 0 };
- event.Type = UIEVENT_CHAR;
- event.pSender = m_pFocus;
- event.wParam = wParam;
- event.lParam = lParam;
- event.chKey = (TCHAR)wParam;
- event.ptMouse = m_ptLastMousePos;
- event.wKeyState = MapKeyState();
- event.dwTimestamp = ::GetTickCount();
- m_pFocus->Event(event);
- }
- break;
- case WM_KEYDOWN:
- {
- if( m_pRoot == NULL ) break;
- if( m_pFocus == NULL ) break;
- TEventUI event = { 0 };
- event.Type = UIEVENT_KEYDOWN;
- event.pSender = m_pFocus;
- event.wParam = wParam;
- event.lParam = lParam;
- event.chKey = (TCHAR)wParam;
- event.ptMouse = m_ptLastMousePos;
- event.wKeyState = MapKeyState();
- event.dwTimestamp = ::GetTickCount();
- m_pFocus->Event(event);
- m_pEventKey = m_pFocus;
- }
- break;
- case WM_KEYUP:
- {
- if( m_pRoot == NULL ) break;
- if( m_pEventKey == NULL ) break;
- TEventUI event = { 0 };
- event.Type = UIEVENT_KEYUP;
- event.pSender = m_pEventKey;
- event.wParam = wParam;
- event.lParam = lParam;
- event.chKey = (TCHAR)wParam;
- event.ptMouse = m_ptLastMousePos;
- event.wKeyState = MapKeyState();
- event.dwTimestamp = ::GetTickCount();
- m_pEventKey->Event(event);
- m_pEventKey = NULL;
- }
- break;
- case WM_SETCURSOR:
- {
- if( m_pRoot == NULL ) break;
- if( LOWORD(lParam) != HTCLIENT ) break;
- if( m_bMouseCapture ) return true;
- POINT pt = { 0 };
- ::GetCursorPos(&pt);
- ::ScreenToClient(m_hWndPaint, &pt);
- CControlUI* pControl = FindControl(pt);
- if( pControl == NULL ) break;
- if( (pControl->GetControlFlags() & UIFLAG_SETCURSOR) == 0 ) break;
- TEventUI event = { 0 };
- event.Type = UIEVENT_SETCURSOR;
- event.pSender = pControl;
- event.wParam = wParam;
- event.lParam = lParam;
- event.ptMouse = pt;
- event.wKeyState = MapKeyState();
- event.dwTimestamp = ::GetTickCount();
- pControl->Event(event);
- }
- return true;
- case WM_KILLFOCUS:
- {
- if( wParam != NULL ) {
- HWND hWnd = ::GetFocus();
- HWND hParentWnd = NULL;
- while( hParentWnd = ::GetParent(hWnd) ) {
- if( m_hWndPaint == hParentWnd ) {
- for( int i = 0; i < m_aNativeWindow.GetSize(); i++ ) {
- if( static_cast<HWND>(m_aNativeWindow[i]) == hWnd ) {
- if( static_cast<CControlUI*>(m_aNativeWindowControl[i]) != m_pFocus ) {
- SetFocus(static_cast<CControlUI*>(m_aNativeWindowControl[i]), false);
- }
- break;
- }
- }
- break;
- }
- hWnd = hParentWnd;
- }
- }
- }
- break;
- case WM_NOTIFY:
- {
- LPNMHDR lpNMHDR = (LPNMHDR) lParam;
- if( lpNMHDR != NULL ) lRes = ::SendMessage(lpNMHDR->hwndFrom, OCM__BASE + uMsg, wParam, lParam);
- return true;
- }
- break;
- case WM_COMMAND:
- {
- if( lParam == 0 ) break;
- HWND hWndChild = (HWND) lParam;
- lRes = ::SendMessage(hWndChild, OCM__BASE + uMsg, wParam, lParam);
- return true;
- }
- break;
- case WM_CTLCOLOREDIT:
- case WM_CTLCOLORSTATIC:
- {
- // Refer To: http://msdn.microsoft.com/en-us/library/bb761691(v=vs.85).aspx
- // Read-only or disabled edit controls do not send the WM_CTLCOLOREDIT message; instead, they send the WM_CTLCOLORSTATIC message.
- if( lParam == 0 ) break;
- HWND hWndChild = (HWND) lParam;
- lRes = ::SendMessage(hWndChild, OCM__BASE + uMsg, wParam, lParam);
- return true;
- }
- break;
- default:
- break;
- }
- return false;
- }
- bool CPaintManagerUI::IsUpdateNeeded() const
- {
- return m_bUpdateNeeded;
- }
- void CPaintManagerUI::NeedUpdate()
- {
- m_bUpdateNeeded = true;
- }
- void CPaintManagerUI::Invalidate()
- {
- if( !m_bLayered ) ::InvalidateRect(m_hWndPaint, NULL, FALSE);
- else {
- RECT rcClient = { 0 };
- ::GetClientRect(m_hWndPaint, &rcClient);
- ::UnionRect(&m_rcLayeredUpdate, &m_rcLayeredUpdate, &rcClient);
- }
- }
- void CPaintManagerUI::Invalidate(RECT& rcItem)
- {
- if( rcItem.left < 0 ) rcItem.left = 0;
- if( rcItem .top < 0 ) rcItem.top = 0;
- if( rcItem.right < rcItem.left ) rcItem.right = rcItem.left;
- if( rcItem.bottom < rcItem.top ) rcItem.bottom = rcItem.top;
- if( !m_bLayered ) ::InvalidateRect(m_hWndPaint, &rcItem, FALSE);
- else ::UnionRect(&m_rcLayeredUpdate, &m_rcLayeredUpdate, &rcItem);
- }
- bool CPaintManagerUI::AttachDialog(CControlUI* pControl)
- {
- ASSERT(::IsWindow(m_hWndPaint));
- // Reset any previous attachment
- SetFocus(NULL);
- m_pEventKey = NULL;
- m_pEventHover = NULL;
- m_pEventClick = NULL;
- // Remove the existing control-tree. We might have gotten inside this function as
- // a result of an event fired or similar, so we cannot just delete the objects and
- // pull the internal memory of the calling code. We'll delay the cleanup.
- if( m_pRoot != NULL ) {
- m_aPostPaintControls.Empty();
- m_aNativeWindow.Empty();
- AddDelayedCleanup(m_pRoot);
- }
- // Set the dialog root element
- m_pRoot = pControl;
- // Go ahead...
- m_bUpdateNeeded = true;
- m_bFirstLayout = true;
- m_bFocusNeeded = true;
- // Initiate all control
- m_shadow.Create(this);
- return InitControls(pControl);
- }
- bool CPaintManagerUI::InitControls(CControlUI* pControl, CControlUI* pParent /*= NULL*/)
- {
- ASSERT(pControl);
- if( pControl == NULL ) return false;
- pControl->SetManager(this, pParent != NULL ? pParent : pControl->GetParent(), true);
- pControl->FindControl(__FindControlFromNameHash, this, UIFIND_ALL);
- return true;
- }
- void CPaintManagerUI::ReapObjects(CControlUI* pControl)
- {
- if( pControl == NULL ) return;
- if( pControl == m_pEventKey ) m_pEventKey = NULL;
- if( pControl == m_pEventHover ) m_pEventHover = NULL;
- if( pControl == m_pEventClick ) m_pEventClick = NULL;
- if( pControl == m_pFocus ) m_pFocus = NULL;
- KillTimer(pControl);
- const CDuiString& sName = pControl->GetName();
- if( !sName.IsEmpty() ) {
- if( pControl == FindControl(sName) ) m_mNameHash.Remove(sName);
- }
- for( int i = 0; i < m_aAsyncNotify.GetSize(); i++ ) {
- TNotifyUI* pMsg = static_cast<TNotifyUI*>(m_aAsyncNotify[i]);
- if( pMsg->pSender == pControl ) pMsg->pSender = NULL;
- }
- }
- bool CPaintManagerUI::AddOptionGroup(LPCTSTR pStrGroupName, CControlUI* pControl)
- {
- LPVOID lp = m_mOptionGroup.Find(pStrGroupName);
- if( lp ) {
- CStdPtrArray* aOptionGroup = static_cast<CStdPtrArray*>(lp);
- for( int i = 0; i < aOptionGroup->GetSize(); i++ ) {
- if( static_cast<CControlUI*>(aOptionGroup->GetAt(i)) == pControl ) {
- return false;
- }
- }
- aOptionGroup->Add(pControl);
- }
- else {
- CStdPtrArray* aOptionGroup = new CStdPtrArray(6);
- aOptionGroup->Add(pControl);
- m_mOptionGroup.Insert(pStrGroupName, aOptionGroup);
- }
- return true;
- }
- CStdPtrArray* CPaintManagerUI::GetOptionGroup(LPCTSTR pStrGroupName)
- {
- LPVOID lp = m_mOptionGroup.Find(pStrGroupName);
- if( lp ) return static_cast<CStdPtrArray*>(lp);
- return NULL;
- }
- void CPaintManagerUI::RemoveOptionGroup(LPCTSTR pStrGroupName, CControlUI* pControl)
- {
- LPVOID lp = m_mOptionGroup.Find(pStrGroupName);
- if( lp ) {
- CStdPtrArray* aOptionGroup = static_cast<CStdPtrArray*>(lp);
- if( aOptionGroup == NULL ) return;
- for( int i = 0; i < aOptionGroup->GetSize(); i++ ) {
- if( static_cast<CControlUI*>(aOptionGroup->GetAt(i)) == pControl ) {
- aOptionGroup->Remove(i);
- break;
- }
- }
- if( aOptionGroup->IsEmpty() ) {
- delete aOptionGroup;
- m_mOptionGroup.Remove(pStrGroupName);
- }
- }
- }
- void CPaintManagerUI::RemoveAllOptionGroups()
- {
- CStdPtrArray* aOptionGroup;
- for( int i = 0; i< m_mOptionGroup.GetSize(); i++ ) {
- if(LPCTSTR key = m_mOptionGroup.GetAt(i)) {
- aOptionGroup = static_cast<CStdPtrArray*>(m_mOptionGroup.Find(key));
- delete aOptionGroup;
- }
- }
- m_mOptionGroup.RemoveAll();
- }
- void CPaintManagerUI::MessageLoop()
- {
- MSG msg = {0};
- while( ::GetMessage(&msg,NULL, 0, 0) ) {
- if( !CPaintManagerUI::TranslateMessage(&msg) ) {
- ::TranslateMessage(&msg);
- ::DispatchMessage(&msg);
- //try{
- // ::DispatchMessage(&msg);
- //} catch(...) {
- // DUITRACE(_T("EXCEPTION: %s(%d)\n"), __FILET__, __LINE__);
- // #ifdef _DEBUG
- // throw "CPaintManagerUI::MessageLoop";
- // #endif
- //}
- }
- }
- }
- void CPaintManagerUI::Term()
- {
- if( m_bCachedResourceZip && m_hResourceZip != NULL ) {
- CloseZip((HZIP)m_hResourceZip);
- m_hResourceZip = NULL;
- }
- }
- CControlUI* CPaintManagerUI::GetFocus() const
- {
- return m_pFocus;
- }
- void CPaintManagerUI::SetFocus(CControlUI* pControl, bool bFocusWnd)
- {
- // Paint manager window has focus?
- HWND hFocusWnd = ::GetFocus();
- if( bFocusWnd && hFocusWnd != m_hWndPaint && pControl != m_pFocus ) ::SetFocus(m_hWndPaint);
- // Already has focus?
- if( pControl == m_pFocus ) return;
- // Remove focus from old control
- if( m_pFocus != NULL )
- {
- TEventUI event = { 0 };
- event.Type = UIEVENT_KILLFOCUS;
- event.pSender = pControl;
- event.dwTimestamp = ::GetTickCount();
- m_pFocus->Event(event);
- SendNotify(m_pFocus, DUI_MSGTYPE_KILLFOCUS);
- m_pFocus = NULL;
- }
- if( pControl == NULL ) return;
- // Set focus to new control
- if( pControl != NULL
- && pControl->GetManager() == this
- && pControl->IsVisible()
- && pControl->IsEnabled() )
- {
- m_pFocus = pControl;
- TEventUI event = { 0 };
- event.Type = UIEVENT_SETFOCUS;
- event.pSender = pControl;
- event.dwTimestamp = ::GetTickCount();
- m_pFocus->Event(event);
- SendNotify(m_pFocus, DUI_MSGTYPE_SETFOCUS);
- }
- }
- void CPaintManagerUI::SetFocusNeeded(CControlUI* pControl)
- {
- ::SetFocus(m_hWndPaint);
- if( pControl == NULL ) return;
- if( m_pFocus != NULL ) {
- TEventUI event = { 0 };
- event.Type = UIEVENT_KILLFOCUS;
- event.pSender = pControl;
- event.dwTimestamp = ::GetTickCount();
- m_pFocus->Event(event);
- SendNotify(m_pFocus, DUI_MSGTYPE_KILLFOCUS);
- m_pFocus = NULL;
- }
- FINDTABINFO info = { 0 };
- info.pFocus = pControl;
- info.bForward = false;
- m_pFocus = m_pRoot->FindControl(__FindControlFromTab, &info, UIFIND_VISIBLE | UIFIND_ENABLED | UIFIND_ME_FIRST);
- m_bFocusNeeded = true;
- if( m_pRoot != NULL ) m_pRoot->NeedUpdate();
- }
- bool CPaintManagerUI::SetTimer(CControlUI* pControl, UINT nTimerID, UINT uElapse)
- {
- ASSERT(pControl!=NULL);
- ASSERT(uElapse>0);
- for( int i = 0; i< m_aTimers.GetSize(); i++ ) {
- TIMERINFO* pTimer = static_cast<TIMERINFO*>(m_aTimers[i]);
- if( pTimer->pSender == pControl
- && pTimer->hWnd == m_hWndPaint
- && pTimer->nLocalID == nTimerID ) {
- if( pTimer->bKilled == true ) {
- if( ::SetTimer(m_hWndPaint, pTimer->uWinTimer, uElapse, NULL) ) {
- pTimer->bKilled = false;
- return true;
- }
- return false;
- }
- return false;
- }
- }
- m_uTimerID = (++m_uTimerID) % 0xFF;
- if( !::SetTimer(m_hWndPaint, m_uTimerID, uElapse, NULL) ) return FALSE;
- TIMERINFO* pTimer = new TIMERINFO;
- if( pTimer == NULL ) return FALSE;
- pTimer->hWnd = m_hWndPaint;
- pTimer->pSender = pControl;
- pTimer->nLocalID = nTimerID;
- pTimer->uWinTimer = m_uTimerID;
- pTimer->bKilled = false;
- return m_aTimers.Add(pTimer);
- }
- bool CPaintManagerUI::KillTimer(CControlUI* pControl, UINT nTimerID)
- {
- ASSERT(pControl!=NULL);
- for( int i = 0; i< m_aTimers.GetSize(); i++ ) {
- TIMERINFO* pTimer = static_cast<TIMERINFO*>(m_aTimers[i]);
- if( pTimer->pSender == pControl
- && pTimer->hWnd == m_hWndPaint
- && pTimer->nLocalID == nTimerID )
- {
- if( pTimer->bKilled == false ) {
- if( ::IsWindow(m_hWndPaint) ) ::KillTimer(pTimer->hWnd, pTimer->uWinTimer);
- pTimer->bKilled = true;
- return true;
- }
- }
- }
- return false;
- }
- void CPaintManagerUI::KillTimer(CControlUI* pControl)
- {
- ASSERT(pControl!=NULL);
- int count = m_aTimers.GetSize();
- for( int i = 0, j = 0; i < count; i++ ) {
- TIMERINFO* pTimer = static_cast<TIMERINFO*>(m_aTimers[i - j]);
- if( pTimer->pSender == pControl && pTimer->hWnd == m_hWndPaint ) {
- if( pTimer->bKilled == false ) ::KillTimer(pTimer->hWnd, pTimer->uWinTimer);
- delete pTimer;
- m_aTimers.Remove(i - j);
- j++;
- }
- }
- }
- void CPaintManagerUI::RemoveAllTimers()
- {
- for( int i = 0; i < m_aTimers.GetSize(); i++ ) {
- TIMERINFO* pTimer = static_cast<TIMERINFO*>(m_aTimers[i]);
- if( pTimer->hWnd == m_hWndPaint ) {
- if( pTimer->bKilled == false ) {
- if( ::IsWindow(m_hWndPaint) ) ::KillTimer(m_hWndPaint, pTimer->uWinTimer);
- }
- delete pTimer;
- }
- }
- m_aTimers.Empty();
- }
- void CPaintManagerUI::SetCapture()
- {
- ::SetCapture(m_hWndPaint);
- m_bMouseCapture = true;
- }
- void CPaintManagerUI::ReleaseCapture()
- {
- ::ReleaseCapture();
- m_bMouseCapture = false;
- }
- bool CPaintManagerUI::IsCaptured()
- {
- return m_bMouseCapture;
- }
- bool CPaintManagerUI::IsPainting()
- {
- return m_bIsPainting;
- }
- void CPaintManagerUI::SetPainting(bool bIsPainting)
- {
- m_bIsPainting = bIsPainting;
- }
- bool CPaintManagerUI::SetNextTabControl(bool bForward)
- {
- // If we're in the process of restructuring the layout we can delay the
- // focus calulation until the next repaint.
- if( m_bUpdateNeeded && bForward ) {
- m_bFocusNeeded = true;
- ::InvalidateRect(m_hWndPaint, NULL, FALSE);
- return true;
- }
- // Find next/previous tabbable control
- FINDTABINFO info1 = { 0 };
- info1.pFocus = m_pFocus;
- info1.bForward = bForward;
- CControlUI* pControl = m_pRoot->FindControl(__FindControlFromTab, &info1, UIFIND_VISIBLE | UIFIND_ENABLED | UIFIND_ME_FIRST);
- if( pControl == NULL ) {
- if( bForward ) {
- // Wrap around
- FINDTABINFO info2 = { 0 };
- info2.pFocus = bForward ? NULL : info1.pLast;
- info2.bForward = bForward;
- pControl = m_pRoot->FindControl(__FindControlFromTab, &info2, UIFIND_VISIBLE | UIFIND_ENABLED | UIFIND_ME_FIRST);
- }
- else {
- pControl = info1.pLast;
- }
- }
- if( pControl != NULL ) SetFocus(pControl);
- m_bFocusNeeded = false;
- return true;
- }
- bool CPaintManagerUI::AddNotifier(INotifyUI* pNotifier)
- {
- ASSERT(m_aNotifiers.Find(pNotifier)<0);
- return m_aNotifiers.Add(pNotifier);
- }
- bool CPaintManagerUI::RemoveNotifier(INotifyUI* pNotifier)
- {
- for( int i = 0; i < m_aNotifiers.GetSize(); i++ ) {
- if( static_cast<INotifyUI*>(m_aNotifiers[i]) == pNotifier ) {
- return m_aNotifiers.Remove(i);
- }
- }
- return false;
- }
- bool CPaintManagerUI::AddPreMessageFilter(IMessageFilterUI* pFilter)
- {
- ASSERT(m_aPreMessageFilters.Find(pFilter)<0);
- return m_aPreMessageFilters.Add(pFilter);
- }
- bool CPaintManagerUI::RemovePreMessageFilter(IMessageFilterUI* pFilter)
- {
- for( int i = 0; i < m_aPreMessageFilters.GetSize(); i++ ) {
- if( static_cast<IMessageFilterUI*>(m_aPreMessageFilters[i]) == pFilter ) {
- return m_aPreMessageFilters.Remove(i);
- }
- }
- return false;
- }
- bool CPaintManagerUI::AddMessageFilter(IMessageFilterUI* pFilter)
- {
- ASSERT(m_aMessageFilters.Find(pFilter)<0);
- return m_aMessageFilters.Add(pFilter);
- }
- bool CPaintManagerUI::RemoveMessageFilter(IMessageFilterUI* pFilter)
- {
- for( int i = 0; i < m_aMessageFilters.GetSize(); i++ ) {
- if( static_cast<IMessageFilterUI*>(m_aMessageFilters[i]) == pFilter ) {
- return m_aMessageFilters.Remove(i);
- }
- }
- return false;
- }
- int CPaintManagerUI::GetPostPaintCount() const
- {
- return m_aPostPaintControls.GetSize();
- }
- bool CPaintManagerUI::AddPostPaint(CControlUI* pControl)
- {
- ASSERT(m_aPostPaintControls.Find(pControl) < 0);
- return m_aPostPaintControls.Add(pControl);
- }
- bool CPaintManagerUI::RemovePostPaint(CControlUI* pControl)
- {
- for( int i = 0; i < m_aPostPaintControls.GetSize(); i++ ) {
- if( static_cast<CControlUI*>(m_aPostPaintControls[i]) == pControl ) {
- return m_aPostPaintControls.Remove(i);
- }
- }
- return false;
- }
- bool CPaintManagerUI::SetPostPaintIndex(CControlUI* pControl, int iIndex)
- {
- RemovePostPaint(pControl);
- return m_aPostPaintControls.InsertAt(iIndex, pControl);
- }
- int CPaintManagerUI::GetNativeWindowCount() const
- {
- return m_aNativeWindow.GetSize();
- }
- bool CPaintManagerUI::AddNativeWindow(CControlUI* pControl, HWND hChildWnd)
- {
- RECT rcChildWnd;
- GetChildWndRect(m_hWndPaint, hChildWnd, rcChildWnd);
- Invalidate(rcChildWnd);
- if (m_aNativeWindow.Find(hChildWnd) >= 0) return false;
- if (m_aNativeWindow.Add(hChildWnd)) {
- m_aNativeWindowControl.Add(pControl);
- return true;
- }
- return false;
- }
- bool CPaintManagerUI::RemoveNativeWindow(HWND hChildWnd)
- {
- for( int i = 0; i < m_aNativeWindow.GetSize(); i++ ) {
- if( static_cast<HWND>(m_aNativeWindow[i]) == hChildWnd ) {
- if( m_aNativeWindow.Remove(i) ) {
- m_aNativeWindowControl.Remove(i);
- return true;
- }
- return false;
- }
- }
- return false;
- }
- void CPaintManagerUI::AddDelayedCleanup(CControlUI* pControl)
- {
- pControl->SetManager(this, NULL, false);
- m_aDelayedCleanup.Add(pControl);
- PostAsyncNotify();
- }
- void CPaintManagerUI::SendNotify(CControlUI* pControl, LPCTSTR pstrMessage, WPARAM wParam /*= 0*/, LPARAM lParam /*= 0*/, bool bAsync /*= false*/, bool bEnableRepeat /*= true*/)
- {
- TNotifyUI Msg;
- Msg.pSender = pControl;
- Msg.sType = pstrMessage;
- Msg.wParam = wParam;
- Msg.lParam = lParam;
- SendNotify(Msg, bAsync);
- }
- void CPaintManagerUI::SendNotify(TNotifyUI& Msg, bool bAsync /*= false*/, bool bEnableRepeat /*= true*/)
- {
- Msg.ptMouse = m_ptLastMousePos;
- Msg.dwTimestamp = ::GetTickCount();
- if( m_bUsedVirtualWnd )
- {
- Msg.sVirtualWnd = Msg.pSender->GetVirtualWnd();
- }
- if( !bAsync ) {
- // Send to all listeners
- if( Msg.pSender != NULL ) {
- if( Msg.pSender->OnNotify ) Msg.pSender->OnNotify(&Msg);
- }
- for( int i = 0; i < m_aNotifiers.GetSize(); i++ ) {
- static_cast<INotifyUI*>(m_aNotifiers[i])->Notify(Msg);
- }
- }
- else {
- if( !bEnableRepeat ) {
- for( int i = 0; i < m_aAsyncNotify.GetSize(); i++ ) {
- TNotifyUI* pMsg = static_cast<TNotifyUI*>(m_aAsyncNotify[i]);
- if( pMsg->pSender == Msg.pSender && pMsg->sType == Msg.sType) {
- pMsg->wParam = Msg.wParam;
- pMsg->lParam = Msg.lParam;
- pMsg->ptMouse = Msg.ptMouse;
- pMsg->dwTimestamp = Msg.dwTimestamp;
- return;
- }
- }
- }
- TNotifyUI *pMsg = new TNotifyUI;
- pMsg->pSender = Msg.pSender;
- pMsg->sType = Msg.sType;
- pMsg->wParam = Msg.wParam;
- pMsg->lParam = Msg.lParam;
- pMsg->ptMouse = Msg.ptMouse;
- pMsg->dwTimestamp = Msg.dwTimestamp;
- m_aAsyncNotify.Add(pMsg);
- PostAsyncNotify();
- }
- }
- bool CPaintManagerUI::IsForceUseSharedRes() const
- {
- return m_bForceUseSharedRes;
- }
- void CPaintManagerUI::SetForceUseSharedRes(bool bForce)
- {
- m_bForceUseSharedRes = bForce;
- }
- DWORD CPaintManagerUI::GetDefaultDisabledColor() const
- {
- return m_ResInfo.m_dwDefaultDisabledColor;
- }
- void CPaintManagerUI::SetDefaultDisabledColor(DWORD dwColor, bool bShared)
- {
- if (bShared)
- {
- if (m_ResInfo.m_dwDefaultDisabledColor == m_SharedResInfo.m_dwDefaultDisabledColor)
- m_ResInfo.m_dwDefaultDisabledColor = dwColor;
- m_SharedResInfo.m_dwDefaultDisabledColor = dwColor;
- }
- else
- {
- m_ResInfo.m_dwDefaultDisabledColor = dwColor;
- }
- }
- DWORD CPaintManagerUI::GetDefaultFontColor() const
- {
- return m_ResInfo.m_dwDefaultFontColor;
- }
- void CPaintManagerUI::SetDefaultFontColor(DWORD dwColor, bool bShared)
- {
- if (bShared)
- {
- if (m_ResInfo.m_dwDefaultFontColor == m_SharedResInfo.m_dwDefaultFontColor)
- m_ResInfo.m_dwDefaultFontColor = dwColor;
- m_SharedResInfo.m_dwDefaultFontColor = dwColor;
- }
- else
- {
- m_ResInfo.m_dwDefaultFontColor = dwColor;
- }
- }
- DWORD CPaintManagerUI::GetDefaultLinkFontColor() const
- {
- return m_ResInfo.m_dwDefaultLinkFontColor;
- }
- void CPaintManagerUI::SetDefaultLinkFontColor(DWORD dwColor, bool bShared)
- {
- if (bShared)
- {
- if (m_ResInfo.m_dwDefaultLinkFontColor == m_SharedResInfo.m_dwDefaultLinkFontColor)
- m_ResInfo.m_dwDefaultLinkFontColor = dwColor;
- m_SharedResInfo.m_dwDefaultLinkFontColor = dwColor;
- }
- else
- {
- m_ResInfo.m_dwDefaultLinkFontColor = dwColor;
- }
- }
- DWORD CPaintManagerUI::GetDefaultLinkHoverFontColor() const
- {
- return m_ResInfo.m_dwDefaultLinkHoverFontColor;
- }
- void CPaintManagerUI::SetDefaultLinkHoverFontColor(DWORD dwColor, bool bShared)
- {
- if (bShared)
- {
- if (m_ResInfo.m_dwDefaultLinkHoverFontColor == m_SharedResInfo.m_dwDefaultLinkHoverFontColor)
- m_ResInfo.m_dwDefaultLinkHoverFontColor = dwColor;
- m_SharedResInfo.m_dwDefaultLinkHoverFontColor = dwColor;
- }
- else
- {
- m_ResInfo.m_dwDefaultLinkHoverFontColor = dwColor;
- }
- }
- DWORD CPaintManagerUI::GetDefaultSelectedBkColor() const
- {
- return m_ResInfo.m_dwDefaultSelectedBkColor;
- }
- void CPaintManagerUI::SetDefaultSelectedBkColor(DWORD dwColor, bool bShared)
- {
- if (bShared)
- {
- if (m_ResInfo.m_dwDefaultSelectedBkColor == m_SharedResInfo.m_dwDefaultSelectedBkColor)
- m_ResInfo.m_dwDefaultSelectedBkColor = dwColor;
- m_SharedResInfo.m_dwDefaultSelectedBkColor = dwColor;
- }
- else
- {
- m_ResInfo.m_dwDefaultSelectedBkColor = dwColor;
- }
- }
- TFontInfo* CPaintManagerUI::GetDefaultFontInfo()
- {
- if (m_ResInfo.m_DefaultFontInfo.sFontName.IsEmpty())
- {
- if( m_SharedResInfo.m_DefaultFontInfo.tm.tmHeight == 0 )
- {
- HFONT hOldFont = (HFONT) ::SelectObject(m_hDcPaint, m_SharedResInfo.m_DefaultFontInfo.hFont);
- ::GetTextMetrics(m_hDcPaint, &m_SharedResInfo.m_DefaultFontInfo.tm);
- ::SelectObject(m_hDcPaint, hOldFont);
- }
- return &m_SharedResInfo.m_DefaultFontInfo;
- }
- else
- {
- if( m_ResInfo.m_DefaultFontInfo.tm.tmHeight == 0 )
- {
- HFONT hOldFont = (HFONT) ::SelectObject(m_hDcPaint, m_ResInfo.m_DefaultFontInfo.hFont);
- ::GetTextMetrics(m_hDcPaint, &m_ResInfo.m_DefaultFontInfo.tm);
- ::SelectObject(m_hDcPaint, hOldFont);
- }
- return &m_ResInfo.m_DefaultFontInfo;
- }
- }
- void CPaintManagerUI::SetDefaultFont(LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic, bool bShared)
- {
- LOGFONT lf = { 0 };
- ::GetObject(::GetStockObject(DEFAULT_GUI_FONT), sizeof(LOGFONT), &lf);
- _tcsncpy(lf.lfFaceName, pStrFontName, LF_FACESIZE);
- lf.lfCharSet = DEFAULT_CHARSET;
- lf.lfHeight = -nSize;
- if( bBold ) lf.lfWeight += FW_BOLD;
- if( bUnderline ) lf.lfUnderline = TRUE;
- if( bItalic ) lf.lfItalic = TRUE;
- HFONT hFont = ::CreateFontIndirect(&lf);
- if( hFont == NULL ) return;
- if (bShared)
- {
- ::DeleteObject(m_SharedResInfo.m_DefaultFontInfo.hFont);
- m_SharedResInfo.m_DefaultFontInfo.hFont = hFont;
- m_SharedResInfo.m_DefaultFontInfo.sFontName = pStrFontName;
- m_SharedResInfo.m_DefaultFontInfo.iSize = nSize;
- m_SharedResInfo.m_DefaultFontInfo.bBold = bBold;
- m_SharedResInfo.m_DefaultFontInfo.bUnderline = bUnderline;
- m_SharedResInfo.m_DefaultFontInfo.bItalic = bItalic;
- ::ZeroMemory(&m_SharedResInfo.m_DefaultFontInfo.tm, sizeof(m_SharedResInfo.m_DefaultFontInfo.tm));
- if( m_hDcPaint ) {
- HFONT hOldFont = (HFONT) ::SelectObject(m_hDcPaint, hFont);
- ::GetTextMetrics(m_hDcPaint, &m_SharedResInfo.m_DefaultFontInfo.tm);
- ::SelectObject(m_hDcPaint, hOldFont);
- }
- }
- else
- {
- ::DeleteObject(m_ResInfo.m_DefaultFontInfo.hFont);
- m_ResInfo.m_DefaultFontInfo.hFont = hFont;
- m_ResInfo.m_DefaultFontInfo.sFontName = pStrFontName;
- m_ResInfo.m_DefaultFontInfo.iSize = nSize;
- m_ResInfo.m_DefaultFontInfo.bBold = bBold;
- m_ResInfo.m_DefaultFontInfo.bUnderline = bUnderline;
- m_ResInfo.m_DefaultFontInfo.bItalic = bItalic;
- ::ZeroMemory(&m_ResInfo.m_DefaultFontInfo.tm, sizeof(m_ResInfo.m_DefaultFontInfo.tm));
- if( m_hDcPaint ) {
- HFONT hOldFont = (HFONT) ::SelectObject(m_hDcPaint, hFont);
- ::GetTextMetrics(m_hDcPaint, &m_ResInfo.m_DefaultFontInfo.tm);
- ::SelectObject(m_hDcPaint, hOldFont);
- }
- }
- }
- DWORD CPaintManagerUI::GetCustomFontCount(bool bShared) const
- {
- if (bShared)
- return m_SharedResInfo.m_CustomFonts.GetSize();
- else
- return m_ResInfo.m_CustomFonts.GetSize();
- }
- HFONT CPaintManagerUI::AddFont(int id, LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic, bool bShared)
- {
- LOGFONT lf = { 0 };
- ::GetObject(::GetStockObject(DEFAULT_GUI_FONT), sizeof(LOGFONT), &lf);
- _tcsncpy(lf.lfFaceName, pStrFontName, LF_FACESIZE);
- lf.lfCharSet = DEFAULT_CHARSET;
- lf.lfHeight = -nSize;
- if( bBold ) lf.lfWeight += FW_BOLD;
- if( bUnderline ) lf.lfUnderline = TRUE;
- if( bItalic ) lf.lfItalic = TRUE;
- HFONT hFont = ::CreateFontIndirect(&lf);
- if( hFont == NULL ) return NULL;
- TFontInfo* pFontInfo = new TFontInfo;
- if( !pFontInfo ) return false;
- ::ZeroMemory(pFontInfo, sizeof(TFontInfo));
- pFontInfo->hFont = hFont;
- pFontInfo->sFontName = pStrFontName;
- pFontInfo->iSize = nSize;
- pFontInfo->bBold = bBold;
- pFontInfo->bUnderline = bUnderline;
- pFontInfo->bItalic = bItalic;
- if( m_hDcPaint ) {
- HFONT hOldFont = (HFONT) ::SelectObject(m_hDcPaint, hFont);
- ::GetTextMetrics(m_hDcPaint, &pFontInfo->tm);
- ::SelectObject(m_hDcPaint, hOldFont);
- }
- TCHAR idBuffer[16];
- ::ZeroMemory(idBuffer, sizeof(idBuffer));
- _itot(id, idBuffer, 10);
- if (bShared || m_bForceUseSharedRes)
- {
- TFontInfo* pOldFontInfo = static_cast<TFontInfo*>(m_SharedResInfo.m_CustomFonts.Find(idBuffer));
- if (pOldFontInfo)
- {
- ::DeleteObject(pOldFontInfo->hFont);
- delete pOldFontInfo;
- m_SharedResInfo.m_CustomFonts.Remove(idBuffer);
- }
- if( !m_SharedResInfo.m_CustomFonts.Insert(idBuffer, pFontInfo) )
- {
- ::DeleteObject(hFont);
- delete pFontInfo;
- return NULL;
- }
- }
- else
- {
- TFontInfo* pOldFontInfo = static_cast<TFontInfo*>(m_ResInfo.m_CustomFonts.Find(idBuffer));
- if (pOldFontInfo)
- {
- ::DeleteObject(pOldFontInfo->hFont);
- delete pOldFontInfo;
- m_ResInfo.m_CustomFonts.Remove(idBuffer);
- }
- if( !m_ResInfo.m_CustomFonts.Insert(idBuffer, pFontInfo) )
- {
- ::DeleteObject(hFont);
- delete pFontInfo;
- return NULL;
- }
- }
- return hFont;
- }
- HFONT CPaintManagerUI::GetFont(int id)
- {
- if (id < 0) return GetDefaultFontInfo()->hFont;
-
- TCHAR idBuffer[16];
- ::ZeroMemory(idBuffer, sizeof(idBuffer));
- _itot(id, idBuffer, 10);
- TFontInfo* pFontInfo = static_cast<TFontInfo*>(m_ResInfo.m_CustomFonts.Find(idBuffer));
- if( !pFontInfo ) pFontInfo = static_cast<TFontInfo*>(m_SharedResInfo.m_CustomFonts.Find(idBuffer));
- if (!pFontInfo) return GetDefaultFontInfo()->hFont;
- return pFontInfo->hFont;
- }
- HFONT CPaintManagerUI::GetFont(LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic)
- {
- TFontInfo* pFontInfo = NULL;
- for( int i = 0; i< m_ResInfo.m_CustomFonts.GetSize(); i++ ) {
- if(LPCTSTR key = m_ResInfo.m_CustomFonts.GetAt(i)) {
- pFontInfo = static_cast<TFontInfo*>(m_ResInfo.m_CustomFonts.Find(key));
- if (pFontInfo && pFontInfo->sFontName == pStrFontName && pFontInfo->iSize == nSize &&
- pFontInfo->bBold == bBold && pFontInfo->bUnderline == bUnderline && pFontInfo->bItalic == bItalic)
- return pFontInfo->hFont;
- }
- }
- for( int i = 0; i< m_SharedResInfo.m_CustomFonts.GetSize(); i++ ) {
- if(LPCTSTR key = m_SharedResInfo.m_CustomFonts.GetAt(i)) {
- pFontInfo = static_cast<TFontInfo*>(m_SharedResInfo.m_CustomFonts.Find(key));
- if (pFontInfo && pFontInfo->sFontName == pStrFontName && pFontInfo->iSize == nSize &&
- pFontInfo->bBold == bBold && pFontInfo->bUnderline == bUnderline && pFontInfo->bItalic == bItalic)
- return pFontInfo->hFont;
- }
- }
- return NULL;
- }
- int CPaintManagerUI::GetFontIndex(HFONT hFont, bool bShared)
- {
- TFontInfo* pFontInfo = NULL;
- if (bShared)
- {
- for( int i = 0; i< m_SharedResInfo.m_CustomFonts.GetSize(); i++ ) {
- if(LPCTSTR key = m_SharedResInfo.m_CustomFonts.GetAt(i)) {
- pFontInfo = static_cast<TFontInfo*>(m_SharedResInfo.m_CustomFonts.Find(key));
- if (pFontInfo && pFontInfo->hFont == hFont) return _ttoi(key);
- }
- }
- }
- else
- {
- for( int i = 0; i< m_ResInfo.m_CustomFonts.GetSize(); i++ ) {
- if(LPCTSTR key = m_ResInfo.m_CustomFonts.GetAt(i)) {
- pFontInfo = static_cast<TFontInfo*>(m_ResInfo.m_CustomFonts.Find(key));
- if (pFontInfo && pFontInfo->hFont == hFont) return _ttoi(key);
- }
- }
- }
- return -1;
- }
- int CPaintManagerUI::GetFontIndex(LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic, bool bShared)
- {
- TFontInfo* pFontInfo = NULL;
- if (bShared)
- {
- for( int i = 0; i< m_SharedResInfo.m_CustomFonts.GetSize(); i++ ) {
- if(LPCTSTR key = m_SharedResInfo.m_CustomFonts.GetAt(i)) {
- pFontInfo = static_cast<TFontInfo*>(m_SharedResInfo.m_CustomFonts.Find(key));
- if (pFontInfo && pFontInfo->sFontName == pStrFontName && pFontInfo->iSize == nSize &&
- pFontInfo->bBold == bBold && pFontInfo->bUnderline == bUnderline && pFontInfo->bItalic == bItalic)
- return _ttoi(key);
- }
- }
- }
- else
- {
- for( int i = 0; i< m_ResInfo.m_CustomFonts.GetSize(); i++ ) {
- if(LPCTSTR key = m_ResInfo.m_CustomFonts.GetAt(i)) {
- pFontInfo = static_cast<TFontInfo*>(m_ResInfo.m_CustomFonts.Find(key));
- if (pFontInfo && pFontInfo->sFontName == pStrFontName && pFontInfo->iSize == nSize &&
- pFontInfo->bBold == bBold && pFontInfo->bUnderline == bUnderline && pFontInfo->bItalic == bItalic)
- return _ttoi(key);
- }
- }
- }
- return -1;
- }
- void CPaintManagerUI::RemoveFont(HFONT hFont, bool bShared)
- {
- TFontInfo* pFontInfo = NULL;
- if (bShared)
- {
- for( int i = 0; i < m_SharedResInfo.m_CustomFonts.GetSize(); i++ )
- {
- if(LPCTSTR key = m_SharedResInfo.m_CustomFonts.GetAt(i))
- {
- pFontInfo = static_cast<TFontInfo*>(m_SharedResInfo.m_CustomFonts.Find(key));
- if (pFontInfo && pFontInfo->hFont == hFont)
- {
- ::DeleteObject(pFontInfo->hFont);
- delete pFontInfo;
- m_SharedResInfo.m_CustomFonts.Remove(key);
- return;
- }
- }
- }
- }
- else
- {
- for( int i = 0; i < m_ResInfo.m_CustomFonts.GetSize(); i++ )
- {
- if(LPCTSTR key = m_ResInfo.m_CustomFonts.GetAt(i))
- {
- pFontInfo = static_cast<TFontInfo*>(m_ResInfo.m_CustomFonts.Find(key));
- if (pFontInfo && pFontInfo->hFont == hFont)
- {
- ::DeleteObject(pFontInfo->hFont);
- delete pFontInfo;
- m_ResInfo.m_CustomFonts.Remove(key);
- return;
- }
- }
- }
- }
- }
- void CPaintManagerUI::RemoveFont(int id, bool bShared)
- {
- TCHAR idBuffer[16];
- ::ZeroMemory(idBuffer, sizeof(idBuffer));
- _itot(id, idBuffer, 10);
- TFontInfo* pFontInfo = NULL;
- if (bShared)
- {
- pFontInfo = static_cast<TFontInfo*>(m_SharedResInfo.m_CustomFonts.Find(idBuffer));
- if (pFontInfo)
- {
- ::DeleteObject(pFontInfo->hFont);
- delete pFontInfo;
- m_SharedResInfo.m_CustomFonts.Remove(idBuffer);
- }
- }
- else
- {
- pFontInfo = static_cast<TFontInfo*>(m_ResInfo.m_CustomFonts.Find(idBuffer));
- if (pFontInfo)
- {
- ::DeleteObject(pFontInfo->hFont);
- delete pFontInfo;
- m_ResInfo.m_CustomFonts.Remove(idBuffer);
- }
- }
- }
- void CPaintManagerUI::RemoveAllFonts(bool bShared)
- {
- TFontInfo* pFontInfo;
- if (bShared)
- {
- for( int i = 0; i< m_SharedResInfo.m_CustomFonts.GetSize(); i++ ) {
- if(LPCTSTR key = m_SharedResInfo.m_CustomFonts.GetAt(i)) {
- pFontInfo = static_cast<TFontInfo*>(m_SharedResInfo.m_CustomFonts.Find(key, false));
- if (pFontInfo) {
- ::DeleteObject(pFontInfo->hFont);
- delete pFontInfo;
- }
- }
- }
- m_SharedResInfo.m_CustomFonts.RemoveAll();
- }
- else
- {
- for( int i = 0; i< m_ResInfo.m_CustomFonts.GetSize(); i++ ) {
- if(LPCTSTR key = m_ResInfo.m_CustomFonts.GetAt(i)) {
- pFontInfo = static_cast<TFontInfo*>(m_ResInfo.m_CustomFonts.Find(key, false));
- if (pFontInfo) {
- ::DeleteObject(pFontInfo->hFont);
- delete pFontInfo;
- }
- }
- }
- m_ResInfo.m_CustomFonts.RemoveAll();
- }
- }
- TFontInfo* CPaintManagerUI::GetFontInfo(int id)
- {
- TCHAR idBuffer[16];
- ::ZeroMemory(idBuffer, sizeof(idBuffer));
- _itot(id, idBuffer, 10);
- TFontInfo* pFontInfo = static_cast<TFontInfo*>(m_ResInfo.m_CustomFonts.Find(idBuffer));
- if (!pFontInfo) pFontInfo = static_cast<TFontInfo*>(m_SharedResInfo.m_CustomFonts.Find(idBuffer));
- if (!pFontInfo) pFontInfo = GetDefaultFontInfo();
- if (pFontInfo->tm.tmHeight == 0)
- {
- HFONT hOldFont = (HFONT) ::SelectObject(m_hDcPaint, pFontInfo->hFont);
- ::GetTextMetrics(m_hDcPaint, &pFontInfo->tm);
- ::SelectObject(m_hDcPaint, hOldFont);
- }
- return pFontInfo;
- }
- TFontInfo* CPaintManagerUI::GetFontInfo(HFONT hFont)
- {
- TFontInfo* pFontInfo = NULL;
- for( int i = 0; i< m_ResInfo.m_CustomFonts.GetSize(); i++ )
- {
- if(LPCTSTR key = m_ResInfo.m_CustomFonts.GetAt(i))
- {
- pFontInfo = static_cast<TFontInfo*>(m_ResInfo.m_CustomFonts.Find(key));
- if (pFontInfo && pFontInfo->hFont == hFont) break;
- }
- }
- if (!pFontInfo)
- {
- for( int i = 0; i< m_SharedResInfo.m_CustomFonts.GetSize(); i++ )
- {
- if(LPCTSTR key = m_SharedResInfo.m_CustomFonts.GetAt(i))
- {
- pFontInfo = static_cast<TFontInfo*>(m_SharedResInfo.m_CustomFonts.Find(key));
- if (pFontInfo && pFontInfo->hFont == hFont) break;
- }
- }
- }
- if (!pFontInfo) pFontInfo = GetDefaultFontInfo();
- if( pFontInfo->tm.tmHeight == 0 ) {
- HFONT hOldFont = (HFONT) ::SelectObject(m_hDcPaint, pFontInfo->hFont);
- ::GetTextMetrics(m_hDcPaint, &pFontInfo->tm);
- ::SelectObject(m_hDcPaint, hOldFont);
- }
- return pFontInfo;
- }
- const TImageInfo* CPaintManagerUI::GetImage(LPCTSTR bitmap)
- {
- TImageInfo* data = static_cast<TImageInfo*>(m_ResInfo.m_ImageHash.Find(bitmap));
- if( !data ) data = static_cast<TImageInfo*>(m_SharedResInfo.m_ImageHash.Find(bitmap));
- return data;
- }
- const TImageInfo* CPaintManagerUI::GetImageEx(LPCTSTR bitmap, LPCTSTR type, DWORD mask, bool bUseHSL)
- {
- const TImageInfo* data = GetImage(bitmap);
- if( !data ) {
- if( AddImage(bitmap, type, mask, bUseHSL, false) ) {
- if (m_bForceUseSharedRes) data = static_cast<TImageInfo*>(m_SharedResInfo.m_ImageHash.Find(bitmap));
- else data = static_cast<TImageInfo*>(m_ResInfo.m_ImageHash.Find(bitmap));
- }
- }
- return data;
- }
- const TImageInfo* CPaintManagerUI::AddImage(LPCTSTR bitmap, LPCTSTR type, DWORD mask, bool bUseHSL, bool bShared)
- {
- if( bitmap == NULL || bitmap[0] == _T('\0') ) return NULL;
- TImageInfo* data = NULL;
- if( type != NULL ) {
- if( isdigit(*bitmap) ) {
- LPTSTR pstr = NULL;
- int iIndex = _tcstol(bitmap, &pstr, 10);
- data = CRenderEngine::LoadImage(iIndex, type, mask);
- }
- }
- else {
- data = CRenderEngine::LoadImage(bitmap, NULL, mask);
- }
- if( data == NULL ) return NULL;
- data->bUseHSL = bUseHSL;
- if( type != NULL ) data->sResType = type;
- data->dwMask = mask;
- if( data->bUseHSL ) {
- data->pSrcBits = new BYTE[data->nX * data->nY * 4];
- ::CopyMemory(data->pSrcBits, data->pBits, data->nX * data->nY * 4);
- }
- else data->pSrcBits = NULL;
- if( m_bUseHSL ) CRenderEngine::AdjustImage(true, data, m_H, m_S, m_L);
- if (data)
- {
- if (bShared || m_bForceUseSharedRes)
- {
- TImageInfo* pOldImageInfo = static_cast<TImageInfo*>(m_SharedResInfo.m_ImageHash.Find(bitmap));
- if (pOldImageInfo)
- {
- CRenderEngine::FreeImage(pOldImageInfo);
- m_SharedResInfo.m_ImageHash.Remove(bitmap);
- }
- if( !m_SharedResInfo.m_ImageHash.Insert(bitmap, data) ) {
- CRenderEngine::FreeImage(data);
- data = NULL;
- }
- }
- else
- {
- TImageInfo* pOldImageInfo = static_cast<TImageInfo*>(m_ResInfo.m_ImageHash.Find(bitmap));
- if (pOldImageInfo)
- {
- CRenderEngine::FreeImage(pOldImageInfo);
- m_ResInfo.m_ImageHash.Remove(bitmap);
- }
- if( !m_ResInfo.m_ImageHash.Insert(bitmap, data) ) {
- CRenderEngine::FreeImage(data);
- data = NULL;
- }
- }
- }
- return data;
- }
- const TImageInfo* CPaintManagerUI::AddImage(LPCTSTR bitmap, HBITMAP hBitmap, int iWidth, int iHeight, bool bAlpha, bool bShared)
- {
- // 因无法确定外部HBITMAP格式,不能使用hsl调整
- if( bitmap == NULL || bitmap[0] == _T('\0') ) return NULL;
- if( hBitmap == NULL || iWidth <= 0 || iHeight <= 0 ) return NULL;
- TImageInfo* data = new TImageInfo;
- data->hBitmap = hBitmap;
- data->pBits = NULL;
- data->nX = iWidth;
- data->nY = iHeight;
- data->bAlpha = bAlpha;
- data->bUseHSL = false;
- data->pSrcBits = NULL;
- //data->sResType = _T("");
- data->dwMask = 0;
- if (bShared || m_bForceUseSharedRes)
- {
- if( !m_SharedResInfo.m_ImageHash.Insert(bitmap, data) ) {
- CRenderEngine::FreeImage(data);
- data = NULL;
- }
- }
- else
- {
- if( !m_SharedResInfo.m_ImageHash.Insert(bitmap, data) ) {
- CRenderEngine::FreeImage(data);
- data = NULL;
- }
- }
- return data;
- }
- void CPaintManagerUI::RemoveImage(LPCTSTR bitmap, bool bShared)
- {
- TImageInfo* data = NULL;
- if (bShared)
- {
- data = static_cast<TImageInfo*>(m_SharedResInfo.m_ImageHash.Find(bitmap));
- if (data)
- {
- CRenderEngine::FreeImage(data) ;
- m_SharedResInfo.m_ImageHash.Remove(bitmap);
- }
- }
- else
- {
- data = static_cast<TImageInfo*>(m_ResInfo.m_ImageHash.Find(bitmap));
- if (data)
- {
- CRenderEngine::FreeImage(data) ;
- m_ResInfo.m_ImageHash.Remove(bitmap);
- }
- }
- }
- void CPaintManagerUI::RemoveAllImages(bool bShared)
- {
- if (bShared)
- {
- TImageInfo* data;
- for( int i = 0; i< m_SharedResInfo.m_ImageHash.GetSize(); i++ ) {
- if(LPCTSTR key = m_SharedResInfo.m_ImageHash.GetAt(i)) {
- data = static_cast<TImageInfo*>(m_SharedResInfo.m_ImageHash.Find(key, false));
- if (data) {
- CRenderEngine::FreeImage(data);
- }
- }
- }
- m_SharedResInfo.m_ImageHash.RemoveAll();
- }
- else
- {
- TImageInfo* data;
- for( int i = 0; i< m_ResInfo.m_ImageHash.GetSize(); i++ ) {
- if(LPCTSTR key = m_ResInfo.m_ImageHash.GetAt(i)) {
- data = static_cast<TImageInfo*>(m_ResInfo.m_ImageHash.Find(key, false));
- if (data) {
- CRenderEngine::FreeImage(data);
- }
- }
- }
- m_ResInfo.m_ImageHash.RemoveAll();
- }
- }
- void CPaintManagerUI::AdjustSharedImagesHSL()
- {
- TImageInfo* data;
- for( int i = 0; i< m_SharedResInfo.m_ImageHash.GetSize(); i++ ) {
- if(LPCTSTR key = m_SharedResInfo.m_ImageHash.GetAt(i)) {
- data = static_cast<TImageInfo*>(m_SharedResInfo.m_ImageHash.Find(key));
- if( data && data->bUseHSL ) {
- CRenderEngine::AdjustImage(m_bUseHSL, data, m_H, m_S, m_L);
- }
- }
- }
- }
- void CPaintManagerUI::AdjustImagesHSL()
- {
- TImageInfo* data;
- for( int i = 0; i< m_ResInfo.m_ImageHash.GetSize(); i++ ) {
- if(LPCTSTR key = m_ResInfo.m_ImageHash.GetAt(i)) {
- data = static_cast<TImageInfo*>(m_ResInfo.m_ImageHash.Find(key));
- if( data && data->bUseHSL ) {
- CRenderEngine::AdjustImage(m_bUseHSL, data, m_H, m_S, m_L);
- }
- }
- }
- Invalidate();
- }
- void CPaintManagerUI::PostAsyncNotify()
- {
- if (!m_bAsyncNotifyPosted) {
- ::PostMessage(m_hWndPaint, WM_APP + 1, 0, 0L);
- m_bAsyncNotifyPosted = true;
- }
- }
- void CPaintManagerUI::ReloadSharedImages()
- {
- TImageInfo* data;
- TImageInfo* pNewData;
- for( int i = 0; i< m_SharedResInfo.m_ImageHash.GetSize(); i++ ) {
- if(LPCTSTR bitmap = m_SharedResInfo.m_ImageHash.GetAt(i)) {
- data = static_cast<TImageInfo*>(m_SharedResInfo.m_ImageHash.Find(bitmap));
- if( data != NULL ) {
- if( !data->sResType.IsEmpty() ) {
- if( isdigit(*bitmap) ) {
- LPTSTR pstr = NULL;
- int iIndex = _tcstol(bitmap, &pstr, 10);
- pNewData = CRenderEngine::LoadImage(iIndex, data->sResType.GetData(), data->dwMask);
- }
- }
- else {
- pNewData = CRenderEngine::LoadImage(bitmap, NULL, data->dwMask);
- }
- if( pNewData == NULL ) continue;
- CRenderEngine::FreeImage(data, false);
- data->hBitmap = pNewData->hBitmap;
- data->pBits = pNewData->pBits;
- data->nX = pNewData->nX;
- data->nY = pNewData->nY;
- data->bAlpha = pNewData->bAlpha;
- data->pSrcBits = NULL;
- if( data->bUseHSL ) {
- data->pSrcBits = new BYTE[data->nX * data->nY * 4];
- ::CopyMemory(data->pSrcBits, data->pBits, data->nX * data->nY * 4);
- }
- else data->pSrcBits = NULL;
- if( m_bUseHSL ) CRenderEngine::AdjustImage(true, data, m_H, m_S, m_L);
- delete pNewData;
- }
- }
- }
- }
- void CPaintManagerUI::ReloadImages()
- {
- TImageInfo* data;
- TImageInfo* pNewData;
- for( int i = 0; i< m_ResInfo.m_ImageHash.GetSize(); i++ ) {
- if(LPCTSTR bitmap = m_ResInfo.m_ImageHash.GetAt(i)) {
- data = static_cast<TImageInfo*>(m_ResInfo.m_ImageHash.Find(bitmap));
- if( data != NULL ) {
- if( !data->sResType.IsEmpty() ) {
- if( isdigit(*bitmap) ) {
- LPTSTR pstr = NULL;
- int iIndex = _tcstol(bitmap, &pstr, 10);
- pNewData = CRenderEngine::LoadImage(iIndex, data->sResType.GetData(), data->dwMask);
- }
- }
- else {
- pNewData = CRenderEngine::LoadImage(bitmap, NULL, data->dwMask);
- }
- if( pNewData == NULL ) continue;
- CRenderEngine::FreeImage(data, false);
- data->hBitmap = pNewData->hBitmap;
- data->pBits = pNewData->pBits;
- data->nX = pNewData->nX;
- data->nY = pNewData->nY;
- data->bAlpha = pNewData->bAlpha;
- data->pSrcBits = NULL;
- if( data->bUseHSL ) {
- data->pSrcBits = new BYTE[data->nX * data->nY * 4];
- ::CopyMemory(data->pSrcBits, data->pBits, data->nX * data->nY * 4);
- }
- else data->pSrcBits = NULL;
- if( m_bUseHSL ) CRenderEngine::AdjustImage(true, data, m_H, m_S, m_L);
- delete pNewData;
- }
- }
- }
- if( m_pRoot ) m_pRoot->Invalidate();
- }
- void CPaintManagerUI::AddDefaultAttributeList(LPCTSTR pStrControlName, LPCTSTR pStrControlAttrList, bool bShared)
- {
- if (bShared || m_bForceUseSharedRes)
- {
- CDuiString* pDefaultAttr = new CDuiString(pStrControlAttrList);
- if (pDefaultAttr != NULL)
- {
- CDuiString* pOldDefaultAttr = static_cast<CDuiString*>(m_SharedResInfo.m_AttrHash.Set(pStrControlName, (LPVOID)pDefaultAttr));
- if (pOldDefaultAttr) delete pOldDefaultAttr;
- }
- }
- else
- {
- CDuiString* pDefaultAttr = new CDuiString(pStrControlAttrList);
- if (pDefaultAttr != NULL)
- {
- CDuiString* pOldDefaultAttr = static_cast<CDuiString*>(m_ResInfo.m_AttrHash.Set(pStrControlName, (LPVOID)pDefaultAttr));
- if (pOldDefaultAttr) delete pOldDefaultAttr;
- }
- }
- }
- LPCTSTR CPaintManagerUI::GetDefaultAttributeList(LPCTSTR pStrControlName) const
- {
- CDuiString* pDefaultAttr = static_cast<CDuiString*>(m_ResInfo.m_AttrHash.Find(pStrControlName));
- if( !pDefaultAttr ) pDefaultAttr = static_cast<CDuiString*>(m_SharedResInfo.m_AttrHash.Find(pStrControlName));
- if (pDefaultAttr) return pDefaultAttr->GetData();
- return NULL;
- }
- bool CPaintManagerUI::RemoveDefaultAttributeList(LPCTSTR pStrControlName, bool bShared)
- {
- if (bShared)
- {
- CDuiString* pDefaultAttr = static_cast<CDuiString*>(m_SharedResInfo.m_AttrHash.Find(pStrControlName));
- if( !pDefaultAttr ) return false;
- delete pDefaultAttr;
- return m_SharedResInfo.m_AttrHash.Remove(pStrControlName);
- }
- else
- {
- CDuiString* pDefaultAttr = static_cast<CDuiString*>(m_ResInfo.m_AttrHash.Find(pStrControlName));
- if( !pDefaultAttr ) return false;
- delete pDefaultAttr;
- return m_ResInfo.m_AttrHash.Remove(pStrControlName);
- }
- }
- void CPaintManagerUI::RemoveAllDefaultAttributeList(bool bShared)
- {
- if (bShared)
- {
- CDuiString* pDefaultAttr;
- for( int i = 0; i< m_SharedResInfo.m_AttrHash.GetSize(); i++ ) {
- if(LPCTSTR key = m_SharedResInfo.m_AttrHash.GetAt(i)) {
- pDefaultAttr = static_cast<CDuiString*>(m_SharedResInfo.m_AttrHash.Find(key));
- if (pDefaultAttr) delete pDefaultAttr;
- }
- }
- m_SharedResInfo.m_AttrHash.RemoveAll();
- }
- else
- {
- CDuiString* pDefaultAttr;
- for( int i = 0; i< m_ResInfo.m_AttrHash.GetSize(); i++ ) {
- if(LPCTSTR key = m_ResInfo.m_AttrHash.GetAt(i)) {
- pDefaultAttr = static_cast<CDuiString*>(m_ResInfo.m_AttrHash.Find(key));
- if (pDefaultAttr) delete pDefaultAttr;
- }
- }
- m_ResInfo.m_AttrHash.RemoveAll();
- }
- }
- void CPaintManagerUI::AddWindowCustomAttribute(LPCTSTR pstrName, LPCTSTR pstrAttr)
- {
- if( pstrName == NULL || pstrName[0] == _T('\0') || pstrAttr == NULL || pstrAttr[0] == _T('\0') ) return;
- CDuiString* pCostomAttr = new CDuiString(pstrAttr);
- if (pCostomAttr != NULL) {
- if (m_mWindowCustomAttrHash.Find(pstrName) == NULL)
- m_mWindowCustomAttrHash.Set(pstrName, (LPVOID)pCostomAttr);
- else
- delete pCostomAttr;
- }
- }
- LPCTSTR CPaintManagerUI::GetWindowCustomAttribute(LPCTSTR pstrName) const
- {
- if( pstrName == NULL || pstrName[0] == _T('\0') ) return NULL;
- CDuiString* pCostomAttr = static_cast<CDuiString*>(m_mWindowCustomAttrHash.Find(pstrName));
- if( pCostomAttr ) return pCostomAttr->GetData();
- return NULL;
- }
- bool CPaintManagerUI::RemoveWindowCustomAttribute(LPCTSTR pstrName)
- {
- if( pstrName == NULL || pstrName[0] == _T('\0') ) return NULL;
- CDuiString* pCostomAttr = static_cast<CDuiString*>(m_mWindowCustomAttrHash.Find(pstrName));
- if( !pCostomAttr ) return false;
- delete pCostomAttr;
- return m_mWindowCustomAttrHash.Remove(pstrName);
- }
- void CPaintManagerUI::RemoveAllWindowCustomAttribute()
- {
- CDuiString* pCostomAttr;
- for( int i = 0; i< m_mWindowCustomAttrHash.GetSize(); i++ ) {
- if(LPCTSTR key = m_mWindowCustomAttrHash.GetAt(i)) {
- pCostomAttr = static_cast<CDuiString*>(m_mWindowCustomAttrHash.Find(key));
- delete pCostomAttr;
- }
- }
- m_mWindowCustomAttrHash.Resize();
- }
- void CPaintManagerUI::AddMultiLanguageString(int id, LPCTSTR pStrMultiLanguage)
- {
- TCHAR idBuffer[16];
- ::ZeroMemory(idBuffer, sizeof(idBuffer));
- _itot(id, idBuffer, 10);
- CDuiString* pMultiLanguage = new CDuiString(pStrMultiLanguage);
- if (pMultiLanguage != NULL)
- {
- CDuiString* pOldMultiLanguage = static_cast<CDuiString*>(m_SharedResInfo.m_MultiLanguageHash.Set(idBuffer, (LPVOID)pMultiLanguage));
- if (pOldMultiLanguage) delete pOldMultiLanguage;
- }
- }
- LPCTSTR CPaintManagerUI::GetMultiLanguageString(int id)
- {
- TCHAR idBuffer[16];
- ::ZeroMemory(idBuffer, sizeof(idBuffer));
- _itot(id, idBuffer, 10);
- CDuiString* pMultiLanguage = static_cast<CDuiString*>(m_SharedResInfo.m_MultiLanguageHash.Find(idBuffer));
- if (pMultiLanguage) return pMultiLanguage->GetData();
- return NULL;
- }
- bool CPaintManagerUI::RemoveMultiLanguageString(int id)
- {
- TCHAR idBuffer[16];
- ::ZeroMemory(idBuffer, sizeof(idBuffer));
- _itot(id, idBuffer, 10);
- CDuiString* pMultiLanguage = static_cast<CDuiString*>(m_SharedResInfo.m_MultiLanguageHash.Find(idBuffer));
- if( !pMultiLanguage ) return false;
- delete pMultiLanguage;
- return m_SharedResInfo.m_MultiLanguageHash.Remove(idBuffer);
- }
- void CPaintManagerUI::RemoveAllMultiLanguageString()
- {
- CDuiString* pMultiLanguage;
- for( int i = 0; i< m_SharedResInfo.m_MultiLanguageHash.GetSize(); i++ ) {
- if(LPCTSTR key = m_SharedResInfo.m_MultiLanguageHash.GetAt(i)) {
- pMultiLanguage = static_cast<CDuiString*>(m_SharedResInfo.m_MultiLanguageHash.Find(key));
- if (pMultiLanguage) delete pMultiLanguage;
- }
- }
- m_SharedResInfo.m_MultiLanguageHash.RemoveAll();
- }
- void CPaintManagerUI::ProcessMultiLanguageTokens(CDuiString& pStrMultiLanguage)
- {
- // Replace string-tokens: %{nnn}, nnn=int
- int iPos = pStrMultiLanguage.Find(_T('%'));
- while( iPos >= 0 ) {
- if( pStrMultiLanguage.GetAt(iPos + 1) == _T('{') ) {
- int iEndPos = iPos + 2;
- while( isdigit(pStrMultiLanguage.GetAt(iEndPos)) ) iEndPos++;
- if( pStrMultiLanguage.GetAt(iEndPos) == '}' ) {
- LPCTSTR pStrTemp = CPaintManagerUI::GetMultiLanguageString((UINT)_ttoi(pStrMultiLanguage.GetData() + iPos + 2));
- if (pStrTemp)
- pStrMultiLanguage.Replace(pStrMultiLanguage.Mid(iPos, iEndPos - iPos + 1), pStrTemp);
- }
- }
- iPos = pStrMultiLanguage.Find(_T('%'), iPos + 1);
- }
- }
- CControlUI* CPaintManagerUI::GetRoot() const
- {
- // ASSERT(m_pRoot);
- return m_pRoot;
- }
- CControlUI* CPaintManagerUI::FindControl(POINT pt) const
- {
- ASSERT(m_pRoot);
- return m_pRoot->FindControl(__FindControlFromPoint, &pt, UIFIND_VISIBLE | UIFIND_HITTEST | UIFIND_TOP_FIRST);
- }
- CControlUI* CPaintManagerUI::FindControl(LPCTSTR pstrName) const
- {
- ASSERT(m_pRoot);
- return static_cast<CControlUI*>(m_mNameHash.Find(pstrName));
- }
- CControlUI* CPaintManagerUI::FindSubControlByPoint(CControlUI* pParent, POINT pt) const
- {
- if( pParent == NULL ) pParent = GetRoot();
- ASSERT(pParent);
- return pParent->FindControl(__FindControlFromPoint, &pt, UIFIND_VISIBLE | UIFIND_HITTEST | UIFIND_TOP_FIRST);
- }
- CControlUI* CPaintManagerUI::FindSubControlByName(CControlUI* pParent, LPCTSTR pstrName) const
- {
- if( pParent == NULL ) pParent = GetRoot();
- ASSERT(pParent);
- return pParent->FindControl(__FindControlFromName, (LPVOID)pstrName, UIFIND_ALL);
- }
- CControlUI* CPaintManagerUI::FindSubControlByClass(CControlUI* pParent, LPCTSTR pstrClass, int iIndex)
- {
- if( pParent == NULL ) pParent = GetRoot();
- ASSERT(pParent);
- m_aFoundControls.Resize(iIndex + 1);
- return pParent->FindControl(__FindControlFromClass, (LPVOID)pstrClass, UIFIND_ALL);
- }
- CStdPtrArray* CPaintManagerUI::FindSubControlsByClass(CControlUI* pParent, LPCTSTR pstrClass)
- {
- if( pParent == NULL ) pParent = GetRoot();
- ASSERT(pParent);
- m_aFoundControls.Empty();
- pParent->FindControl(__FindControlsFromClass, (LPVOID)pstrClass, UIFIND_ALL);
- return &m_aFoundControls;
- }
- CStdPtrArray* CPaintManagerUI::GetFoundControls()
- {
- return &m_aFoundControls;
- }
- CControlUI* CALLBACK CPaintManagerUI::__FindControlFromNameHash(CControlUI* pThis, LPVOID pData)
- {
- CPaintManagerUI* pManager = static_cast<CPaintManagerUI*>(pData);
- const CDuiString& sName = pThis->GetName();
- if( sName.IsEmpty() ) return NULL;
- // Add this control to the hash list
- pManager->m_mNameHash.Set(sName, pThis);
- return NULL; // Attempt to add all controls
- }
- CControlUI* CALLBACK CPaintManagerUI::__FindControlFromCount(CControlUI* /*pThis*/, LPVOID pData)
- {
- int* pnCount = static_cast<int*>(pData);
- (*pnCount)++;
- return NULL; // Count all controls
- }
- CControlUI* CALLBACK CPaintManagerUI::__FindControlFromPoint(CControlUI* pThis, LPVOID pData)
- {
- LPPOINT pPoint = static_cast<LPPOINT>(pData);
- return ::PtInRect(&pThis->GetPos(), *pPoint) ? pThis : NULL;
- }
- CControlUI* CALLBACK CPaintManagerUI::__FindControlFromTab(CControlUI* pThis, LPVOID pData)
- {
- FINDTABINFO* pInfo = static_cast<FINDTABINFO*>(pData);
- if( pInfo->pFocus == pThis ) {
- if( pInfo->bForward ) pInfo->bNextIsIt = true;
- return pInfo->bForward ? NULL : pInfo->pLast;
- }
- if( (pThis->GetControlFlags() & UIFLAG_TABSTOP) == 0 ) return NULL;
- pInfo->pLast = pThis;
- if( pInfo->bNextIsIt ) return pThis;
- if( pInfo->pFocus == NULL ) return pThis;
- return NULL; // Examine all controls
- }
- CControlUI* CALLBACK CPaintManagerUI::__FindControlFromShortcut(CControlUI* pThis, LPVOID pData)
- {
- if( !pThis->IsVisible() ) return NULL;
- FINDSHORTCUT* pFS = static_cast<FINDSHORTCUT*>(pData);
- if( pFS->ch == toupper(pThis->GetShortcut()) ) pFS->bPickNext = true;
- if( _tcsstr(pThis->GetClass(), _T("LabelUI")) != NULL ) return NULL; // Labels never get focus!
- return pFS->bPickNext ? pThis : NULL;
- }
- CControlUI* CALLBACK CPaintManagerUI::__FindControlFromName(CControlUI* pThis, LPVOID pData)
- {
- LPCTSTR pstrName = static_cast<LPCTSTR>(pData);
- const CDuiString& sName = pThis->GetName();
- if( sName.IsEmpty() ) return NULL;
- return (_tcsicmp(sName, pstrName) == 0) ? pThis : NULL;
- }
- CControlUI* CALLBACK CPaintManagerUI::__FindControlFromClass(CControlUI* pThis, LPVOID pData)
- {
- LPCTSTR pstrType = static_cast<LPCTSTR>(pData);
- LPCTSTR pType = pThis->GetClass();
- CStdPtrArray* pFoundControls = pThis->GetManager()->GetFoundControls();
- if( _tcscmp(pstrType, _T("*")) == 0 || _tcscmp(pstrType, pType) == 0 ) {
- int iIndex = -1;
- while( pFoundControls->GetAt(++iIndex) != NULL ) ;
- if( iIndex < pFoundControls->GetSize() ) pFoundControls->SetAt(iIndex, pThis);
- }
- if( pFoundControls->GetAt(pFoundControls->GetSize() - 1) != NULL ) return pThis;
- return NULL;
- }
- CControlUI* CALLBACK CPaintManagerUI::__FindControlsFromClass(CControlUI* pThis, LPVOID pData)
- {
- LPCTSTR pstrType = static_cast<LPCTSTR>(pData);
- LPCTSTR pType = pThis->GetClass();
- if( _tcscmp(pstrType, _T("*")) == 0 || _tcscmp(pstrType, pType) == 0 )
- pThis->GetManager()->GetFoundControls()->Add((LPVOID)pThis);
- return NULL;
- }
- CControlUI* CALLBACK CPaintManagerUI::__FindControlsFromUpdate(CControlUI* pThis, LPVOID pData)
- {
- if( pThis->IsUpdateNeeded() ) {
- pThis->GetManager()->GetFoundControls()->Add((LPVOID)pThis);
- return pThis;
- }
- return NULL;
- }
- bool CPaintManagerUI::TranslateAccelerator(LPMSG pMsg)
- {
- for (int i = 0; i < m_aTranslateAccelerator.GetSize(); i++)
- {
- LRESULT lResult = static_cast<ITranslateAccelerator *>(m_aTranslateAccelerator[i])->TranslateAccelerator(pMsg);
- if( lResult == S_OK ) return true;
- }
- return false;
- }
- bool CPaintManagerUI::TranslateMessage(const LPMSG pMsg)
- {
- // Pretranslate Message takes care of system-wide messages, such as
- // tabbing and shortcut key-combos. We'll look for all messages for
- // each window and any child control attached.
- UINT uStyle = GetWindowStyle(pMsg->hwnd);
- UINT uChildRes = uStyle & WS_CHILD;
- LRESULT lRes = 0;
- if (uChildRes != 0)
- {
- HWND hWndParent = ::GetParent(pMsg->hwnd);
- //code by redrain 2014.12.3,解决edit和webbrowser按tab无法切换焦点的bug
- // for( int i = 0; i < m_aPreMessages.GetSize(); i++ )
- for( int i = m_aPreMessages.GetSize() - 1; i >= 0 ; --i )
- {
- CPaintManagerUI* pT = static_cast<CPaintManagerUI*>(m_aPreMessages[i]);
- HWND hTempParent = hWndParent;
- while(hTempParent)
- {
- if(pMsg->hwnd == pT->GetPaintWindow() || hTempParent == pT->GetPaintWindow())
- {
- if (pT->TranslateAccelerator(pMsg))
- return true;
- pT->PreMessageHandler(pMsg->message, pMsg->wParam, pMsg->lParam, lRes);
- // if( pT->PreMessageHandler(pMsg->message, pMsg->wParam, pMsg->lParam, lRes) )
- // return true;
- //
- // return false;
- }
- hTempParent = GetParent(hTempParent);
- }
- }
- }
- else
- {
- for( int i = 0; i < m_aPreMessages.GetSize(); i++ )
- {
- int size = m_aPreMessages.GetSize();
- CPaintManagerUI* pT = static_cast<CPaintManagerUI*>(m_aPreMessages[i]);
- if(pMsg->hwnd == pT->GetPaintWindow())
- {
- if (pT->TranslateAccelerator(pMsg))
- return true;
- if( pT->PreMessageHandler(pMsg->message, pMsg->wParam, pMsg->lParam, lRes) )
- return true;
- return false;
- }
- }
- }
- return false;
- }
- bool CPaintManagerUI::AddTranslateAccelerator(ITranslateAccelerator *pTranslateAccelerator)
- {
- ASSERT(m_aTranslateAccelerator.Find(pTranslateAccelerator) < 0);
- return m_aTranslateAccelerator.Add(pTranslateAccelerator);
- }
- bool CPaintManagerUI::RemoveTranslateAccelerator(ITranslateAccelerator *pTranslateAccelerator)
- {
- for (int i = 0; i < m_aTranslateAccelerator.GetSize(); i++)
- {
- if (static_cast<ITranslateAccelerator *>(m_aTranslateAccelerator[i]) == pTranslateAccelerator)
- {
- return m_aTranslateAccelerator.Remove(i);
- }
- }
- return false;
- }
- void CPaintManagerUI::UsedVirtualWnd(bool bUsed)
- {
- m_bUsedVirtualWnd = bUsed;
- }
- CShadowUI* CPaintManagerUI::GetShadow()
- {
- return &m_shadow;
- }
- } // namespace DuiLib
|