⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atlctrlsext.h

📁 这是一本学习 window编程的很好的参考教材
💻 H
📖 第 1 页 / 共 2 页
字号:
#ifndef __ATLCTRLSEXT_H__
#define __ATLCTRLSEXT_H__

/////////////////////////////////////////////////////////////////////////////
// Additional Windows control wrappers
//
// Written by Bjarke Viksoe (bjarke@viksoe.dk)
// Copyright (c) 2002-2003 Bjarke Viksoe.
//
// This code may be used in compiled form in any way you desire. This
// file may be redistributed by any means PROVIDING it is 
// not sold for profit without the authors written consent, and 
// providing that this notice and the authors name is included. 
//
// This file is provided "as is" with no expressed or implied warranty.
// The author accepts no liability if it causes any damage to you or your
// computer whatsoever. It's free, so don't hassle me about it.
//
// Beware of bugs.
//

#pragma once

#ifndef __cplusplus
   #error ATL requires C++ compilation (use a .cpp suffix)
#endif

#ifndef __ATLCTRLS_H__
   #error atlctrlsext.h requires atlctrls.h to be included first
#endif

#if (_WTL_VER < 0x0700)
   #error This file requires WTL version 7.0 or higher
#endif


namespace WTL
{

/////////////////////////////////////////////////////////////////////////////
// A mananged ImageList control

class CImageListCtrl : public CImageList
{
public:
   ~CImageListCtrl()
   {
      Destroy();
   }
};

typedef CImageList CImageListHandle;


/////////////////////////////////////////////////////////////////////////////
// CSimpleValStack

template< class T >
class CSimpleValStack : public CSimpleValArray< T >
{
public:
   BOOL Push(T t)
   {
      return Add(t);
   }
   T Pop()
   {
      int nLast = GetSize() - 1;
      if( nLast < 0 ) return NULL;   // must be able to convert to NULL
      T t = m_aT[nLast];
      if( !RemoveAt(nLast) ) return NULL;
      return t;
   }
   T GetCurrent()
   {
      int nLast = GetSize() - 1;
      if( nLast < 0 ) return NULL;   // must be able to convert to NULL
      return m_aT[nLast];
   }
};


/////////////////////////////////////////////////////////////////////////////
// MDI Frame command message map

template< class T >
class CMDICommands
{
public:
   BEGIN_MSG_MAP(CMDICommands)
      COMMAND_ID_HANDLER(ID_WINDOW_CASCADE, OnWindowCascade)
      COMMAND_ID_HANDLER(ID_WINDOW_TILE_HORZ, OnWindowTileHorz)
      COMMAND_ID_HANDLER(ID_WINDOW_TILE_VERT, OnWindowTileVert)
      COMMAND_ID_HANDLER(ID_WINDOW_ARRANGE, OnWindowArrangeIcons)
   END_MSG_MAP()

   LRESULT OnWindowCascade(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
   {
      T* pT = static_cast<T*>(this);
      pT->MDICascade();
      return 0;
   }
   LRESULT OnWindowTileHorz(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
   {
      T* pT = static_cast<T*>(this);
      pT->MDITile(MDITILE_HORIZONTAL);
      return 0;
   }
   LRESULT OnWindowTileVert(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
   {
      T* pT = static_cast<T*>(this);
      pT->MDITile(MDITILE_VERTICAL);
      return 0;
   }   
   LRESULT OnWindowArrangeIcons(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
   {
      T* pT = static_cast<T*>(this);
      pT->MDIIconArrange();
      return 0;
   }
};


/////////////////////////////////////////////////////////////////////////////
// CCustomXXXDraw - MI class for Common Controls custom-draw support

// NOTE: WTL 7 includes a fine CCustomDraw class, but my class supports
//       the correct NM_CUSTOMDRAW structures for each control type.
template< class T, typename TNMCUSTOMDRAW >
class CCustomDrawEx
{
public:
   typedef CCustomDrawEx< T, TNMCUSTOMDRAW > thisClass;

#if (_ATL_VER < 0x0700)
   BOOL m_bHandledCD;

   BOOL IsMsgHandled() const
   {
      return m_bHandledCD;
   }
   void SetMsgHandled(BOOL bHandled)
   {
      m_bHandledCD = bHandled;
   }
#endif // _ATL_VER

   // Message map and handlers
   
   BEGIN_MSG_MAP( thisClass )
      NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw)
   ALT_MSG_MAP(1)
      REFLECTED_NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw)
   END_MSG_MAP()

   LRESULT OnCustomDraw(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
   {
      T* pT = static_cast<T*>(this);
      pT->SetMsgHandled(TRUE);
      TNMCUSTOMDRAW lpNM = (TNMCUSTOMDRAW) pnmh;
      DWORD dwRet = 0;
      switch( lpNM->nmcd.dwDrawStage ) {
      case CDDS_PREPAINT:
         dwRet = pT->OnPrePaint(idCtrl, lpNM);
         break;
      case CDDS_POSTPAINT:
         dwRet = pT->OnPostPaint(idCtrl, lpNM);
         break;
      case CDDS_PREERASE:
         dwRet = pT->OnPreErase(idCtrl, lpNM);
         break;
      case CDDS_POSTERASE:
         dwRet = pT->OnPostErase(idCtrl, lpNM);
         break;
      case CDDS_ITEMPREPAINT:
         dwRet = pT->OnItemPrePaint(idCtrl, lpNM);
         break;
      case CDDS_ITEMPOSTPAINT:
         dwRet = pT->OnItemPostPaint(idCtrl, lpNM);
         break;
#if (_WIN32_IE >= 0x0400)
      case CDDS_ITEMPREPAINT|CDDS_SUBITEM:
         dwRet = pT->OnSubItemPrePaint(idCtrl, lpNM);
         break;
      case CDDS_ITEMPOSTPAINT|CDDS_SUBITEM:
         dwRet = pT->OnSubItemPostPaint(idCtrl, lpNM);
         break;
#endif // _WIN32_IE
      case CDDS_ITEMPREERASE:
         dwRet = pT->OnItemPreErase(idCtrl, lpNM);
         break;
      case CDDS_ITEMPOSTERASE:
         dwRet = pT->OnItemPostErase(idCtrl, lpNM);
         break;
      default:
         pT->SetMsgHandled(FALSE);
         break;
      }
      bHandled = pT->IsMsgHandled();
      return dwRet;
   }

   // Overrideables

   DWORD OnPrePaint(int /*idCtrl*/, TNMCUSTOMDRAW /*lpNM*/)
   {
      return CDRF_DODEFAULT;
   }
   DWORD OnPostPaint(int /*idCtrl*/, TNMCUSTOMDRAW /*lpNM*/)
   {
      return CDRF_DODEFAULT;
   }
   DWORD OnPreErase(int /*idCtrl*/, TNMCUSTOMDRAW /*lpNM*/)
   {
      return CDRF_DODEFAULT;
   }
   DWORD OnPostErase(int /*idCtrl*/, TNMCUSTOMDRAW /*lpNM*/)
   {
      return CDRF_DODEFAULT;
   }
   DWORD OnItemPrePaint(int /*idCtrl*/, TNMCUSTOMDRAW /*lpNM*/)
   {
      return CDRF_DODEFAULT;
   }
   DWORD OnItemPostPaint(int /*idCtrl*/, TNMCUSTOMDRAW /*lpNM*/)
   {
      return CDRF_DODEFAULT;
   }
#if (_WIN32_IE >= 0x0400)
   DWORD OnSubItemPrePaint(int /*idCtrl*/, TNMCUSTOMDRAW /*lpNM*/)
   {
      return CDRF_DODEFAULT;
   }
   DWORD OnSubItemPostPaint(int /*idCtrl*/, TNMCUSTOMDRAW /*lpNM*/)
   {
      return CDRF_DODEFAULT;
   }
#endif // _WIN32_IE
   DWORD OnItemPreErase(int /*idCtrl*/, TNMCUSTOMDRAW /*lpNM*/)
   {
      return CDRF_DODEFAULT;
   }
   DWORD OnItemPostErase(int /*idCtrl*/, TNMCUSTOMDRAW /*lpNM*/)
   {
      return CDRF_DODEFAULT;
   }
};

template< class T >
class CCustomTreeViewDraw : public CCustomDrawEx<T, LPNMTVCUSTOMDRAW> { };

template< class T >
class CCustomListViewDraw : public CCustomDrawEx<T, LPNMCUSTOMDRAW> { };

template< class T >
class CCustomToolBarDraw : public CCustomDrawEx<T, LPNMTBCUSTOMDRAW> { };

template< class T >
class CCustomToolTipDraw : public CCustomDrawEx<T, LPNMTTCUSTOMDRAW> { };


/////////////////////////////////////////////////////////////////////////////
// Helper macros

#define LISTITEM_SELECTED(pnmlv)    ( ((pnmlv->uOldState & LVIS_SELECTED)==0) && ((pnmlv->uNewState & LVIS_SELECTED)!=0) )
#define LISTITEM_UNSELECTED(pnmlv)  ( ((pnmlv->uOldState & LVIS_SELECTED)!=0) && ((pnmlv->uNewState & LVIS_SELECTED)==0) )
#define LISTITEM_CHECKED(pnmlv)     ( (pnmlv->uNewState & LVIS_STATEIMAGEMASK)!=0 )


/////////////////////////////////////////////////////////////////////////////
// CCheckTreeViewCtrl - Better support for a checked TreeView

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -