使用IDeskBand2接口在Windows任务栏创建自己的窗口

 

IDeskBand2 Interface


从MSDN拷贝的关于IDeskBand2说明。查看实现源码

 

IDeskBand2 Members

CanRenderCompositedIndicates the deskband's ability to be displayed as translucent.
CloseDWNotifies 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.
GetBandInfoGets state information for a band object.
GetCompositionStateGets the composition state.
ResizeBorderDWNotifies 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.
SetCompositionStateSets the composition state.
ShowDWInstructs 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;
}


 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值