📄 imgtab.cpp
字号:
// ImgTab.cpp : implementation file
//
#include "stdafx.h"
#include "App_Sync728.h"
#include "ImgTab.h"
#include "Afxtempl.h"
#include "Resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//////////////////////////////////////////////////////////////////////////
//
COLORREF BACKCOL = RGB(255, 255, 255);
COLORREF BORDERCOL = RGB(0, 0, 0);
COLORREF TABNORMALTXTCOL = RGB(0, 0, 0);
COLORREF TABSELECTTXTCOL = RGB(0, 0, 0);
COLORREF MASKCOLOR = RGB(255, 0, 255);
/////////////////////////////////////////////////////////////////////////////
// CImgTab
CImgTab::CImgTab(UINT nImgNormal, UINT nImgSelect, UINT nImgWidth)
{
m_nTabWidth = nImgWidth;
m_nNormalBmp = nImgNormal;
m_nSelectBmp = nImgSelect;
m_nCurSel = 0;
m_nTotalNum = 0;
ZeroMemory(&m_rcTitle, sizeof(CRect));
}
CImgTab::~CImgTab()
{
m_fontTab.DeleteObject();
if ( m_ImgList.GetImageCount() > 0 )
{
m_ImgList.DeleteImageList();
}
if ( m_ItemStr.GetCount() > 0 )
{
m_ItemStr.RemoveAll();
}
}
BEGIN_MESSAGE_MAP(CImgTab, CStatic)
//{{AFX_MSG_MAP(CImgTab)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CImgTab message handlers
void CImgTab::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CStatic::OnLButtonDown(nFlags, point);
BOOL bReset = FALSE;
CRect rcTab(0, 0, m_nTabWidth, m_rcTitle.Height());
for (int i=0; i<m_nTotalNum; i++)
{
if (rcTab.PtInRect(point))
{
m_nCurSel = i;
Invalidate();
bReset = TRUE;
break;
}
rcTab.OffsetRect(m_nTabWidth, 0);
}
if (TRUE == bReset)
{
GetParent()->PostMessage(MSG_TAB_SEL_CHANGE);
}
}
void CImgTab::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
dc.FillSolidRect(m_rcClient, BACKCOL);
CPen pen(PS_SOLID, 1, BORDERCOL);
CPen* pOldPen = (CPen*)dc.SelectObject(&pen);
CBrush* pOldBrush = (CBrush*)dc.SelectStockObject(NULL_BRUSH);
dc.MoveTo(m_rcTitle.left, m_rcTitle.bottom);
dc.LineTo(m_rcTitle.left, m_rcClient.bottom -1);
dc.LineTo(m_rcTitle.right -1, m_rcClient.bottom -1);
dc.LineTo(m_rcTitle.right -1, m_rcTitle.bottom -1);
CPoint last(m_rcTitle.left +m_nTotalNum*m_nTabWidth -1, m_rcTitle.bottom -1);
dc.LineTo(last);
CFont* pOldFont = (CFont*)dc.SelectObject(&m_fontTab);
CString ItemStr;
CRect rcTab;
rcTab.SetRect(0, 0, m_nTabWidth, m_rcTitle.Height());
POSITION pos = m_ItemStr.GetHeadPosition();
int nIdx = 0;
while (pos)
{
int nImgIdx = 0;
COLORREF txtcol = TABNORMALTXTCOL;
if ( m_nCurSel == nIdx++ )
{
nImgIdx = 1;
txtcol = TABSELECTTXTCOL;
}
m_ImgList.Draw(&dc, nImgIdx, rcTab.TopLeft(), ILD_TRANSPARENT);
ItemStr = m_ItemStr.GetNext(pos);
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(txtcol);
dc.DrawText(ItemStr, rcTab, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
rcTab.OffsetRect(m_nTabWidth, 0);
}
dc.MoveTo(last);
dc.LineTo(last.x, 2);
dc.SelectObject(pOldBrush);
dc.SelectObject(pOldPen);
dc.SelectObject(pOldFont);
// Do not call CStatic::OnPaint() for painting messages
}
BOOL CImgTab::LoadTabImage()
{
if ( !m_ImgList.Create(m_nNormalBmp, m_nTabWidth, 3, MASKCOLOR) )
{
return FALSE;
}
CBitmap bmp;
if ( !bmp.LoadBitmap(m_nSelectBmp) )
{
return FALSE;
}
m_ImgList.Add(&bmp, MASKCOLOR);
return TRUE;
}
BOOL CImgTab::Create( const RECT& rect, CWnd* pParentWnd, UINT nID )
{
if ( FALSE == LoadTabImage() )
{
return FALSE;
}
BACKCOL = GetSysColor(COLOR_BTNFACE);
m_nCurSel = 0;
m_rcClient.SetRect(0, 0, rect.right -rect.left, rect.bottom -rect.top);
m_rcTitle.SetRect(0, 0, rect.right -rect.left, 23);
TCHAR SZ1[80];
LoadString(AfxGetInstanceHandle(), MESSAGE_MAIN_FONT_TYPE1, SZ1, sizeof(SZ1)/sizeof(TCHAR));
m_fontTab.CreatePointFont(120, SZ1);
return CStatic::Create(NULL, WS_CHILD|WS_VISIBLE, rect, pParentWnd, nID);
}
BOOL CImgTab::InsertItem( LPCTSTR lpszItem )
{
CString strNewItem = lpszItem;
m_ItemStr.AddTail(strNewItem);
m_nTotalNum++;
Invalidate();
return TRUE;
}
int CImgTab::SetCurSel( int nItem )
{
if (nItem == m_nCurSel)
{
return nItem;
}
GetParent()->PostMessage(MSG_TAB_SEL_CHANGE);
m_nCurSel = nItem;
Invalidate();
return nItem;
}
BOOL CImgTab::DeleteAllItems()
{
m_ItemStr.RemoveAll();
m_nCurSel = 0;
m_nTotalNum = 0;
Invalidate();
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -