📄 imagelistbox2.h
字号:
{
ATLASSERT(::IsWindow(m_hWnd));
HFONT hOldFont = m_hMainFont;
m_hMainFont = hFont;
Invalidate();
return hOldFont;
}
HFONT SetSmallFont(HFONT hFont)
{
ATLASSERT(::IsWindow(m_hWnd));
HFONT hOldFont = m_hSubFont;
m_hSubFont = hFont;
Invalidate();
return hOldFont;
}
void GetPreferences(PILBSETTINGS pPrefs) const
{
ATLASSERT(pPrefs);
*pPrefs = m_st;
}
void SetPreferences(ILBSETTINGS Prefs)
{
ATLASSERT(::IsWindow(m_hWnd));
m_st = Prefs;
SetBkColor(m_st.clrBackground);
}
// Implementation
void _Init()
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT((GetStyle() & LVS_REPORT)!=0);
ATLASSERT((GetStyle() & LVS_SINGLESEL)!=0);
ATLASSERT((GetStyle() & LVS_SHOWSELALWAYS)!=0);
ATLASSERT((GetStyle() & LVS_OWNERDRAWFIXED)!=0);
ATLASSERT((GetStyle() & LVS_SHAREIMAGELISTS)!=0);
SetExtendedListViewStyle(LVS_EX_FULLROWSELECT);
T* pT = static_cast<T*>(this);
pT->_InitSettings();
// Add dummy column for text to actually get displayed!
AddColumn(_T(""), 0);
}
void _InitSettings()
{
m_st.clrText = ::GetSysColor(COLOR_WINDOWTEXT);
m_st.clrBackground = ::GetSysColor(COLOR_WINDOW);
m_st.clrHighliteText = ::GetSysColor(COLOR_HIGHLIGHTTEXT);
m_st.clrHighlite =
m_st.clrHighliteBorder = ::GetSysColor(COLOR_HIGHLIGHT);
}
// Message map and handlers
BEGIN_MSG_MAP(CImageListBoxImpl)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_SIZE, OnSize)
REFLECTED_NOTIFY_CODE_HANDLER(LVN_DELETEITEM, OnDeleteItem)
CHAIN_MSG_MAP_ALT( CCustomDraw<CImageListBoxImpl>, 1 )
END_MSG_MAP()
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
LRESULT lRes = DefWindowProc(uMsg, wParam, lParam);
_Init();
return lRes;
}
LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
DeleteAllItems(); // Make sure to delete item-data memory
bHandled = FALSE;
return 0;
}
LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
SetColumnWidth(0, LVSCW_AUTOSIZE_USEHEADER);
bHandled = FALSE;
return 0;
}
LRESULT OnDeleteItem(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
{
LPNMLISTVIEW pnmlv = (LPNMLISTVIEW) pnmh;
PILBITEM pItem = reinterpret_cast<PILBITEM>( TBase::GetItemData(pnmlv->iItem) );
if( pItem->mask & ILBIF_TEXT ) delete [] pItem->pszText;
if( pItem->mask & ILBIF_SUBTEXT ) delete [] pItem->pszSubText;
delete pItem;
return 0;
}
// Custom painting
DWORD OnPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)
{
return CDRF_NOTIFYITEMDRAW; // We need per-item notifications
}
DWORD OnItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW lpNMCustomDraw)
{
LPNMLVCUSTOMDRAW lpNMLVCD = (LPNMLVCUSTOMDRAW) lpNMCustomDraw;
CDCHandle dc = lpNMLVCD->nmcd.hdc;
PILBITEM pItem = (PILBITEM) lpNMLVCD->nmcd.lItemlParam;
ATLASSERT(pItem);
RECT rcItem;
GetItemRect(lpNMLVCD->nmcd.dwItemSpec, &rcItem, LVIR_BOUNDS);
rcItem.right -= 1;
bool bSelected = lpNMLVCD->nmcd.uItemState & CDIS_SELECTED;
UINT style = (pItem->mask & ILBIF_STYLE) != 0 ? pItem->style : ILBS_IMGLEFT | ILBS_SELNORMAL;
COLORREF clrFront = bSelected ? m_st.clrHighliteText : m_st.clrText;
COLORREF clrBack = bSelected ? m_st.clrHighlite : m_st.clrBackground;
if( bSelected && (style & ILBS_SELROUND) ) {
// Draw round-rect selection
dc.FillSolidRect(&rcItem, m_st.clrBackground);
::InflateRect(&rcItem, -m_st.sizeMargin.cx, -m_st.sizeMargin.cy);
CPen pen;
pen.CreatePen(PS_SOLID, 1, m_st.clrHighliteBorder);
CBrush brush;
brush.CreateSolidBrush(m_st.clrHighlite);
HPEN hOldPen = dc.SelectPen(pen);
HBRUSH hOldBrush = dc.SelectBrush(brush);
dc.RoundRect(&rcItem, m_st.ptArc);
dc.SelectBrush(hOldBrush);
dc.SelectPen(hOldPen);
}
else {
// Fill background
dc.FillSolidRect(&rcItem, clrBack);
::InflateRect(&rcItem, -m_st.sizeMargin.cx, -m_st.sizeMargin.cy);
}
if( style & ILBS_SELROUND ) ::InflateRect(&rcItem, -m_st.ptArc.x, -m_st.ptArc.y);
// Get image information
int iImageWidth = 0, iImageHeight = 0;
if( pItem->mask & ILBIF_IMAGE ) m_imgNormal.GetIconSize(iImageWidth, iImageHeight);
// Prepare draw
HFONT hOldFont = dc.SelectFont(GetFont());
dc.SetBkMode(TRANSPARENT);
dc.SetBkColor(clrBack);
dc.SetTextColor(clrFront);
// Draw image (may be aligned left/right/top)
if( pItem->mask & ILBIF_IMAGE ) {
if( (style & ILBS_IMGRIGHT) == 0 ) {
// Left- or top-aligned image
POINT pt;
if( style & ILBS_IMGTOP ) {
pt.x = rcItem.left + ((rcItem.right - rcItem.left) / 2) - (iImageWidth / 2);
pt.y = rcItem.top;
}
else {
pt.x = rcItem.left;
pt.y = rcItem.top + ((rcItem.bottom - rcItem.top) / 2) - (iImageHeight / 2);
}
if( bSelected && (pItem->mask & ILBIF_SELIMAGE) ) {
m_imgSelected.Draw(dc, pItem->iSelImage, pt, ILD_NORMAL);
}
else {
m_imgNormal.Draw(dc, pItem->iImage, pt, ILD_NORMAL);
}
if( style & ILBS_IMGTOP ) {
rcItem.top += iImageHeight;
}
else {
rcItem.left += iImageWidth;
}
}
else {
// Right-aligned image
int x = rcItem.right - iImageWidth;
int y = rcItem.top + ((rcItem.bottom - rcItem.top) / 2) - (iImageHeight / 2);
if( bSelected && (pItem->mask & ILBIF_SELIMAGE) ) {
m_imgSelected.Draw(dc, pItem->iSelImage, x,y, ILD_NORMAL);
}
else {
m_imgNormal.Draw(dc, pItem->iImage, x,y, ILD_NORMAL);
}
rcItem.right -= iImageWidth;
}
}
// Prepare text drawing
UINT format = DT_LEFT | DT_NOPREFIX;
if( pItem->mask & ILBIF_FORMAT ) format = pItem->format;
// Draw text
if( pItem->mask & ILBIF_TEXT ) {
if( m_hMainFont != NULL ) dc.SelectFont(m_hMainFont);
::InflateRect(&rcItem, -m_st.sizeIndent.cx, -m_st.sizeIndent.cy);
RECT rcText = { 0 };
dc.DrawText(pItem->pszText, -1, &rcText, format | DT_CALCRECT);
dc.DrawText(pItem->pszText, -1, &rcItem, format);
rcItem.top += rcText.bottom-rcText.top;
}
// Draw subtext
if( pItem->mask & ILBIF_SUBTEXT ) {
if( m_hSubFont != NULL ) dc.SelectFont(m_hSubFont);
::InflateRect(&rcItem, -m_st.sizeSubIndent.cx, 0);
rcItem.top += m_st.sizeSubIndent.cy;
RECT rcText = { 0 };
dc.DrawText(pItem->pszSubText, -1, &rcText, format | DT_CALCRECT);
dc.DrawText(pItem->pszSubText, -1, &rcItem, format);
rcItem.top += rcText.bottom-rcText.top;
}
dc.SelectFont(hOldFont);
return CDRF_SKIPDEFAULT;
}
};
class CImageListBoxCtrl : public CImageListBoxImpl<CImageListBoxCtrl>
{
public:
DECLARE_WND_SUPERCLASS(_T("WTL_ImageListBox"), GetWndClassName())
};
#endif // !defined(AFX_IMAGELISTBOX_H__20040606_AF04_B15C_D1F1_0080AD509054__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -