IDeskBand2 Interface
从MSDN拷贝的关于IDeskBand2说明。查看实现源码。
IDeskBand2 Members
CanRenderComposited Indicates the deskband's ability to be displayed as translucent. CloseDW Notifies the docking window object that it is about to be removed from the frame. The docking window object should save any persistent information at this time. GetBandInfo Gets state information for a band object. GetCompositionState Gets the composition state. ResizeBorderDW Notifies the docking window object that the frame's border space has changed. In response to this method, the IDockingWindow implementation must call IDockingWindowSite::SetBorderSpaceDW, even if no border space is required or a change is not necessary. SetCompositionState Sets the composition state. ShowDW Instructs the docking window object to show or hide itself.
Remarks
IDeskBand2 is derived from IOleWindow through IDockingWindow and IDeskBand. See the following topics for details on these methods also available to IDeskBand2 through that inheritance.
Additional IDeskBand2 Methods IDeskBand2::GetWindow IDeskBand2::ContextSensitiveHelp If implemented in all active deskbands, this interface allows the taskbar to be displayed using translucent effects. If an active deskband does not implementIDeskBand2, then translucency is disabled for the entire taskbar.
A deskband can implement IDeskBand2 as a communication conduit between itself and the taskbar as follows:
- Taskbar calls IDeskBand2::CanRenderComposited to learn if a deskband supports translucency. If one or more do not, the entire taskbar is rendered opaque.
- Taskbar calls IDeskBand2::SetCompositionState as appropriate in response to a user turning translucent effects on or off. The taskbar should attempt to render itself translucent or opaque in response to this call.
- IDeskBand2::GetCompositionState is the counterpart of IDeskBand2::SetCompositionState.
COM接口声明,实现此接口供系统调用。
// DeskBandExt.h : Declaration of the CDeskBandExt
#pragma once
#include "resource.h" // main symbols
#include "theme.h"
#include "StockInfo_i.h"
#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
#endif
// CDeskBandExt
class ATL_NO_VTABLE CDeskBandExt :
public CWindowImpl<CDeskBandExt>,
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CDeskBandExt, &CLSID_DeskBandExt>,
public IObjectWithSiteImpl<CDeskBandExt>,
public IDispatchImpl<IDeskBandExt, &IID_IDeskBandExt, &LIBID_StockInfoLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IPersistStream,
public IContextMenu,
public IInputObject,
public IDeskBand2
{
public:
CDeskBandExt();
~CDeskBandExt();
DECLARE_WND_CLASS(TEXT("CDeskBandExt_XXX"))
DECLARE_REGISTRY_RESOURCEID(IDR_DESKBANDEXT)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CDeskBandExt)
COM_INTERFACE_ENTRY(IDeskBandExt)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IObjectWithSite)
COM_INTERFACE_ENTRY(IOleWindow)
COM_INTERFACE_ENTRY(IDockingWindow)
COM_INTERFACE_ENTRY(IDeskBand)
COM_INTERFACE_ENTRY(IDeskBand2)
COM_INTERFACE_ENTRY(IInputObject)
COM_INTERFACE_ENTRY(IPersist)
COM_INTERFACE_ENTRY(IPersistStream)
END_COM_MAP()
BEGIN_CATEGORY_MAP(CDeskBandExt)
IMPLEMENTED_CATEGORY(CATID_DeskBand)
END_CATEGORY_MAP()
BEGIN_MSG_MAP(CDeskBandExt)
MESSAGE_HANDLER(WM_SIZE, OnSize)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
MESSAGE_HANDLER(WM_TIMER, OnTimer)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_SETFOCUS, OnFocus)
MESSAGE_HANDLER(WM_COMMAND, OnCommand)
MESSAGE_HANDLER(WM_KILLFOCUS, OnFocus)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_RBUTTONUP, OnRButtonUp)
MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)
MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseLeave)
MESSAGE_HANDLER(WM_MOUSEHOVER, OnMouseHover)
MESSAGE_HANDLER(WM_THEMECHANGED, OnThemeChanged)
MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
MESSAGE_HANDLER(WM_POWERBROADCAST, OnPowerBroadcast)
END_MSG_MAP()
public:
HRESULT FinalConstruct();
void FinalRelease();
POINTL CalcIdealSize() const;
public:
// IObjectWithSite
STDMETHOD (SetSite)(IUnknown *);
STDMETHOD (GetSite)(REFIID, LPVOID*);
public:
// IInputObject
STDMETHOD (HasFocusIO)();
STDMETHOD (UIActivateIO)(BOOL,MSG *);
STDMETHOD (TranslateAcceleratorIO)(MSG *);
public:
// IDeskBand
STDMETHOD (GetBandInfo)(DWORD, DWORD, DESKBANDINFO *);
public:
// IDeskBand2
STDMETHOD (CanRenderComposited)(BOOL *);
STDMETHOD (SetCompositionState)(BOOL);
STDMETHOD (GetCompositionState)(BOOL *);
public:
// IOleWindow
STDMETHOD (GetWindow)(HWND *);
STDMETHOD (ContextSensitiveHelp)(BOOL);
public:
// IDockingWindow
STDMETHOD (ShowDW)(BOOL);
STDMETHOD (CloseDW)(DWORD);
STDMETHOD (ResizeBorderDW)(LPCRECT,IUnknown *, BOOL);
public:
// IPersistStream
STDMETHOD (GetClassID)(LPCLSID);
STDMETHOD (IsDirty)(void);
STDMETHOD (Load)(LPSTREAM);
STDMETHOD (Save)(LPSTREAM, BOOL);
STDMETHOD (GetSizeMax)(ULARGE_INTEGER*);
public:
// IContextMenu methods
STDMETHOD (QueryContextMenu)(HMENU, UINT, UINT, UINT, UINT);
STDMETHOD (InvokeCommand)(LPCMINVOKECOMMANDINFO);
STDMETHOD (GetCommandString)(UINT_PTR, UINT, LPUINT, LPSTR, UINT);
private:
LRESULT OnSize(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnCreate(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnFocus(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnPaint(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnTimer(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnCommand(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnRButtonUp(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnLButtonUp(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnMouseMove(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnMouseLeave(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnMouseHover(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnThemeChanged(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnPowerBroadcast(UINT, WPARAM, LPARAM, BOOL&);
LRESULT OnEraseBackground(UINT, WPARAM, LPARAM, BOOL&);
private:
BOOL m_bFocus;
int m_nBandID;
HMENU m_hMenu;
HWND m_hwndParent;
DWORD m_dwViewMode;
CAutoPtr<CStyle> m_pStyle;
BOOL m_bCompositionEnabled;
IInputObjectSite *m_pSite;
CComPtr<ISensNetEvents> m_SensNetEvent;
CString m_lastString;
CString m_Ss;
int m_sl;
};
OBJECT_ENTRY_AUTO(__uuidof(DeskBandExt), CDeskBandExt)
源文件:
// DeskBandExt.cpp : Implementation of CDeskBandExtExt
#include "stdafx.h"
#include "ChartDialog.h"
#include "DeskBandExt.h"
#include "SensNetEvents.h"
#define UPDATE_TIMER_ID 0x1520
#define IDM_COMMAND 0
// CDeskBandExt
CDeskBandExt::CDeskBandExt() :
m_pStyle(CStyle::CreateInstance()),
m_lastString(TEXT("Perry")),
m_sl(0)
{
ATLTRACE("CDeskBandExt::CDeskBandExt");
m_hMenu = ::CreatePopupMenu();
::AppendMenu(m_hMenu, MF_STRING, 199, TEXT("&Option"));
::AppendMenu(m_hMenu, MF_SEPARATOR, 0, 0);
::AppendMenu(m_hMenu, MF_STRING, 200, TEXT("&Update"));
::AppendMenu(m_hMenu, MF_SEPARATOR, 0, 0);
::AppendMenu(m_hMenu, MF_STRING, 201, TEXT("&Close"));
}
CDeskBandExt::~CDeskBandExt()
{
ATLTRACE("CDeskBandExt::~CDeskBandExt");
}
HRESULT CDeskBandExt::FinalConstruct()
{
ATLTRACE("CDeskBandExt::FinalConstruct");
m_pSite = NULL;
m_nBandID = 0;
m_bFocus = FALSE;
m_hwndParent = NULL;
m_SensNetEvent = NULL;
m_dwViewMode = DBIF_VIEWMODE_NORMAL;
m_bCompositionEnabled = TRUE;
return S_OK;
}
void CDeskBandExt::FinalRelease()
{
ATLTRACE("CDeskBandExt::FinalRelease");
if ( m_pSite )
m_pSite->Release();
m_pSite = NULL;
}
STDMETHODIMP CDeskBandExt::SetSite(
IUnknown *pUnkSite)
{
ATLTRACE("CDeskBandExt::SetSite");
if ( m_pSite )
m_pSite->Release();
m_pSite = NULL;
if ( !pUnkSite )
return E_FAIL;
CComQIPtr<IOleWindow> pOleWindow;
m_hwndParent = NULL;
if ( SUCCEEDED(pUnkSite->QueryInterface(IID_IOleWindow, (LPVOID*)&pOleWindow)) )
pOleWindow->GetWindow(&m_hwndParent);
if ( !m_hwndParent )
return E_FAIL;
if ( !IsWindow() )
Create(m_hwndParent);
if ( !IsWindow() )
return E_FAIL;
pUnkSite->QueryInterface(IID_IInputObjectSite, (LPVOID*)&m_pSite);
return S_OK;
}
STDMETHODIMP CDeskBandExt::GetSite(
REFIID riid,
LPVOID *ppvReturn)
{
ATLTRACE("CDeskBandExt::GetSite");
*ppvReturn = NULL;
if ( m_pSite )
return m_pSite->QueryInterface(riid, ppvReturn);
return E_FAIL;
}
STDMETHODIMP CDeskBandExt::UIActivateIO(
BOOL fActivate,
PMSG)
{
ATLTRACE("CDeskBandExt::UIActivateIO");
if ( fActivate )
SetFocus();
return S_OK;
}
STDMETHODIMP CDeskBandExt::HasFocusIO()
{
ATLTRACE("CDeskBandExt::HasFocusIO");
return (m_bFocus ? S_OK : S_FALSE);
}
STDMETHODIMP CDeskBandExt::TranslateAcceleratorIO(
PMSG)
{
ATLTRACE("CDeskBandExt::TranslateAcceleratorIO");
return S_FALSE;
}
STDMETHODIMP CDeskBandExt::GetBandInfo(
DWORD dwBandID,
DWORD dwViewMode,
DESKBANDINFO *pdbi)
{
ATLTRACE("CDeskBandExt::GetBandInfo");
if ( !pdbi )
return E_INVALIDARG;
m_nBandID = dwBandID;
m_dwViewMode = dwViewMode;
if ( pdbi->dwMask & DBIM_MODEFLAGS )
pdbi->dwModeFlags = DBIMF_VARIABLEHEIGHT;
if ( pdbi->dwMask & DBIM_MINSIZE )
pdbi->ptMinSize = CalcIdealSize();
if ( pdbi->dwMask & DBIM_MAXSIZE )
{
pdbi->ptMaxSize.x = -1;
pdbi->ptMaxSize.y = -1;
}
if ( pdbi->dwMask & DBIM_INTEGRAL )
{
pdbi->ptIntegral.x = 1;
pdbi->ptIntegral.y = 1;
}
if ( pdbi->dwMask & DBIM_ACTUAL )
pdbi->ptActual = CalcIdealSize();
if ( pdbi->dwMask & DBIM_TITLE )
{
if ( dwViewMode == DBIF_VIEWMODE_FLOATING )
{
lstrcpynW(pdbi->wszTitle, CT2W(m_lastString), ARRAYSIZE(pdbi->wszTitle));
}
else
{
pdbi->dwMask &= ~DBIM_TITLE;
}
}
if ( pdbi->dwMask & DBIM_BKCOLOR )
pdbi->dwMask &= ~DBIM_BKCOLOR;
return S_OK;
}
STDMETHODIMP CDeskBandExt::GetClassID(
LPCLSID pClassID)
{
ATLTRACE("CDeskBandExt::GetClassID");
*pClassID = CLSID_DeskBandExt;
return S_OK;
}
STDMETHODIMP CDeskBandExt::IsDirty(void)
{
ATLTRACE("CDeskBandExt::IsDirty");
return S_FALSE;
}
STDMETHODIMP CDeskBandExt::Load(
LPSTREAM pStream)
{
ATLTRACE("CDeskBandExt::Load");
return S_OK;
}
STDMETHODIMP CDeskBandExt::Save(
LPSTREAM pStream,
BOOL fClearDirty)
{
ATLTRACE("CDeskBandExt::Save");
return S_OK;
}
STDMETHODIMP CDeskBandExt::GetSizeMax(
ULARGE_INTEGER *pul)
{
ATLTRACE("CDeskBandExt::GetSizeMax");
return E_NOTIMPL;
}
STDMETHODIMP CDeskBandExt::CanRenderComposited(
BOOL *pfCanRenderComposited)
{
ATLTRACE("CDeskBandExt::CanRenderComposited");
if ( pfCanRenderComposited )
*pfCanRenderComposited = TRUE;
return S_OK;
}
STDMETHODIMP CDeskBandExt::SetCompositionState(
BOOL fCompositionEnabled)
{
ATLTRACE("CDeskBandExt::SetCompositionState");
m_bCompositionEnabled = fCompositionEnabled;
Invalidate();
return S_OK;
}
STDMETHODIMP CDeskBandExt::GetCompositionState(
BOOL *pfCompositionEnabled)
{
ATLTRACE("CDeskBandExt::GetCompositionState");
if ( pfCompositionEnabled )
*pfCompositionEnabled = m_bCompositionEnabled;
return S_OK;
}
STDMETHODIMP CDeskBandExt::GetWindow(
HWND *phwnd)
{
ATLTRACE("CDeskBandExt::GetWindow");
*phwnd = m_hWnd;
return S_OK;
}
STDMETHODIMP CDeskBandExt::ContextSensitiveHelp(
BOOL)
{
ATLTRACENOTIMPL("IOleWindow::ContextSensitiveHelp");
return E_NOTIMPL;
}
STDMETHODIMP CDeskBandExt::ShowDW(
BOOL fShow)
{
ATLTRACE("CDeskBandExt::ContextSensitiveHelp");
if ( IsWindow() )
ShowWindow(fShow ? SW_SHOW : SW_HIDE);
return S_OK;
}
STDMETHODIMP CDeskBandExt::CloseDW(
DWORD)
{
ATLTRACE("CDeskBandExt::CloseDW");
ShowDW(FALSE);
if ( IsWindow() )
DestroyWindow();
m_hWnd = NULL;
return S_OK;
}
STDMETHODIMP CDeskBandExt::ResizeBorderDW(
LPCRECT prcBorder,
IUnknown *punkToolbarSite,
BOOL)
{
ATLTRACE("CDeskBandExt::ResizeBorderDW");
if ( !IsWindow() )
return S_OK;
if ( punkToolbarSite )
{
BORDERWIDTHS bw = { 0 };
bw.top = bw.bottom = ::GetSystemMetrics(SM_CYBORDER);
bw.left = bw.right = ::GetSystemMetrics(SM_CXBORDER);
CComQIPtr<IDockingWindowSite> pDock = punkToolbarSite;
if ( SUCCEEDED(pDock->RequestBorderSpaceDW(static_cast<IDeskBand*>(this), &bw)) )
{
if ( SUCCEEDED(pDock->SetBorderSpaceDW(static_cast<IDeskBand*>(this), &bw)) )
{
MoveWindow(prcBorder);
return S_OK;
}
}
}
return E_FAIL;
}
STDMETHODIMP CDeskBandExt::QueryContextMenu(
HMENU hMenu,
UINT indexMenu,
UINT idCmdFirst,
UINT idCmdLast,
UINT uFlags)
{
ATLTRACE("CDeskBandExt::QueryContextMenu");
if ( !(CMF_DEFAULTONLY & uFlags) )
{
InsertMenu(hMenu, indexMenu, MF_STRING | MF_BYPOSITION, idCmdFirst + IDM_COMMAND, TEXT("&Desk Band Command"));
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, (USHORT)(IDM_COMMAND + 1));
}
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 0);
}
STDMETHODIMP CDeskBandExt::InvokeCommand(
LPCMINVOKECOMMANDINFO lpcmi)
{
ATLTRACE("CDeskBandExt::InvokeCommand");
switch ( LOWORD(lpcmi->lpVerb) )
{
case IDM_COMMAND:
break;
default:
return E_INVALIDARG;
}
return NOERROR;
}
STDMETHODIMP CDeskBandExt::GetCommandString(
UINT_PTR idCommand,
UINT uFlags,
LPUINT lpReserved,
LPSTR lpszName,
UINT uMaxNameLen)
{
ATLTRACE("CDeskBandExt::GetCommandString");
HRESULT hr = E_INVALIDARG;
switch(uFlags)
{
case GCS_HELPTEXT:
switch(idCommand)
{
case IDM_COMMAND:
lstrcpynA(lpszName, "this is a sample menu for IDeskBand study.", uMaxNameLen);
hr = NOERROR;
break;
}
break;
case GCS_VERB:
switch(idCommand)
{
case IDM_COMMAND:
lstrcpynA(lpszName, "command", uMaxNameLen);
hr = NOERROR;
break;
}
break;
case GCS_VALIDATE:
hr = NOERROR;
break;
}
return hr;
}
LRESULT CDeskBandExt::OnCreate(
UINT /*uMsg*/,
WPARAM /*wParam*/,
LPARAM /*lParam*/,
BOOL& /*bHandled*/)
{
ATLTRACE("CDeskBandExt::OnCreate");
SetTimer(UPDATE_TIMER_ID, 500);
if ( !m_SensNetEvent )
if ( SUCCEEDED(m_SensNetEvent.CoCreateInstance(CLSID_SensNetEvents)) )
m_SensNetEvent->StartMonitor((OLE_HANDLE)m_hWnd);
return 0L;
}
LRESULT CDeskBandExt::OnSize(
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& bHandled)
{
ATLTRACE("CDeskBandExt::OnSize");
return 0;
}
LRESULT CDeskBandExt::OnCommand(
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& bHandled)
{
ATLTRACE("CDeskBandExt::OnCommand");
if ( wParam == 201 )
{
CComPtr<IBandSite> spBandSite;
//if ( SUCCEEDED(spBandSite.CoCreateInstance(CLSID_TrayBandSiteService)) )
// spBandSite->RemoveBand(m_nBandID);
}
return 0;
}
LRESULT CDeskBandExt::OnRButtonUp(
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& bHandled)
{
ATLTRACE("CDeskBandExt::OnRButtonUp");
POINT pos;
::GetCursorPos(&pos);
::TrackPopupMenuEx(m_hMenu, TPM_LEFTBUTTON, pos.x, pos.y, m_hWnd, NULL);
return 0;
}
LRESULT CDeskBandExt::OnLButtonUp(
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& bHandled)
{
ATLTRACE("CDeskBandExt::OnLButtonUp");
CChartDialog Dialog;
RECT rc;
GetWindowRect(&rc);
Dialog.DoModal(m_hWnd, (LPARAM)&rc);
return 0;
}
LRESULT CDeskBandExt::OnMouseMove(
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& bHandled)
{
ATLTRACE("CDeskBandExt::OnMouseMove");
return 0;
}
LRESULT CDeskBandExt::OnMouseLeave(
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& bHandled)
{
ATLTRACE("CDeskBandExt::OnMouseLeave");
return 0;
}
LRESULT CDeskBandExt::OnMouseHover(
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& bHandled)
{
ATLTRACE("CDeskBandExt::OnMouseHover");
return 0;
}
LRESULT CDeskBandExt::OnDestroy(
UINT uMsg,
WPARAM /*wParam*/,
LPARAM /*lParam*/,
BOOL& bHandled)
{
ATLTRACE("CDeskBandExt::OnDestroy");
KillTimer(UPDATE_TIMER_ID);
if ( m_SensNetEvent )
m_SensNetEvent->StopMonitor();
if ( m_hMenu )
::DestroyMenu(m_hMenu);
m_hMenu = NULL;
m_hWnd = NULL;
return 0L;
}
LRESULT CDeskBandExt::OnFocus(
UINT uMsg,
WPARAM /*wParam*/,
LPARAM /*lParam*/,
BOOL& /*bHandled*/)
{
ATLTRACE("CDeskBandExt::OnFocus");
m_bFocus = (uMsg == WM_SETFOCUS);
m_pSite->OnFocusChangeIS((IDockingWindow*)this, m_bFocus);
return 0L;
}
LRESULT CDeskBandExt::OnEraseBackground(
UINT /*uMsg*/,
WPARAM /*wParam*/,
LPARAM /*lParam*/,
BOOL& /*bHandled*/)
{
//ATLTRACE("CDeskBandExt::OnEraseBackground");
return 1;
}
POINTL CDeskBandExt::CalcIdealSize() const
{
ATLTRACE("CDeskBandExt::CalcIdealSize");
POINTL pt;
if ( !IsWindow() )
{
pt.x = ::GetSystemMetrics(SM_CXMIN);
pt.y = ::GetSystemMetrics(SM_CYMIN);
}
else
{
CString meas;
SIZE size = { 0 };
HDC dc = CreateIC(_T("DISPLAY"), NULL, NULL, NULL);
HFONT hFont = (HFONT)::SelectObject(dc, m_pStyle->GetFont());
meas.Empty();
for ( int i = 0; i < 12; i++ )
meas += " ";
::GetTextExtentPoint32(dc, meas, meas.GetLength(), &size);
::SelectObject(dc, hFont);
::DeleteDC(dc);
pt.x = size.cx + ::GetSystemMetrics(SM_CXSMSIZE) + 5;
pt.y = ::GetSystemMetrics(SM_CYSMSIZE);
}
return pt;
}
LRESULT CDeskBandExt::OnPaint(
UINT /*uMsg*/,
WPARAM /*wParam*/,
LPARAM /*lParam*/,
BOOL& /*bHandled*/)
{
//ATLTRACE("CDeskBandExt::OnPaint");
HFONT hFont;
PAINTSTRUCT ps;
RECT rc = { 0 };
HDC hdc = BeginPaint(&ps);
HDC hMemDc = ::CreateCompatibleDC(hdc);
HBITMAP hBitmap = ::CreateCompatibleBitmap(hdc, ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top);
HBITMAP hBitmap2 = (HBITMAP)::SelectObject(hMemDc, hBitmap);
::SetWindowOrgEx(hMemDc, ps.rcPaint.left, ps.rcPaint.top, NULL);
m_pStyle->DrawBackground(m_hWnd, hMemDc, ps.rcPaint);
hFont = (HFONT)::SelectObject(hMemDc, m_pStyle->GetFont());
::SetBkMode(hMemDc, TRANSPARENT);
::SetTextColor(hMemDc, m_pStyle->GetTextColor());
GetClientRect(&rc);
rc.right -= 18;
::DrawText(hMemDc, m_lastString, m_lastString.GetLength(), &rc, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
::SelectObject(hMemDc, hFont);
::BitBlt(hdc, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top, hMemDc, 0, 0, SRCCOPY);
::SelectObject(hMemDc, hBitmap2);
::DeleteObject(hBitmap);
::DeleteDC(hMemDc);
EndPaint(&ps);
return 0;
}
LRESULT CDeskBandExt::OnTimer(
UINT /*uMsg*/,
WPARAM /*wParam*/,
LPARAM /*lParam*/,
BOOL& /*bHandled*/)
{
//ATLTRACE("CDeskBandExt::OnTimer");
SYSTEMTIME st;
::GetSystemTime(&st);
m_lastString = m_Ss.Mid(m_sl, 5);
if ( ++m_sl >= (m_Ss.GetLength() - 5) )
m_sl = 0;
Invalidate();
return 0;
}
LRESULT CDeskBandExt::OnPowerBroadcast(
UINT /*uMsg*/,
WPARAM wParam,
LPARAM /*lParam*/,
BOOL& /*bHandled*/)
{
ATLTRACE("CDeskBandExt::OnPowerBroadcast");
if ( wParam == PBT_APMRESUMECRITICAL ||
wParam == PBT_APMRESUMESUSPEND ||
wParam == PBT_APMRESUMESTANDBY )
SetTimer(UPDATE_TIMER_ID, 500);
return 0;
}
LRESULT CDeskBandExt::OnThemeChanged(
UINT /*uMsg*/,
WPARAM /*wParam*/,
LPARAM /*lParam*/,
BOOL& /*bHandled*/)
{
ATLTRACE("CDeskBandExt::OnThemeChanged");
m_pStyle.Free();
m_pStyle.Attach(CStyle::CreateInstance());
return 0;
}