📄 atlctrlsext.h
字号:
#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 + -