redrawitem2 - yamaumima/hello.github.io GitHub Wiki

#include "stdafx.h"
#include "Sil.h"
#include "ListCtrlEx.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CListCtrlEx

CListCtrlEx::CListCtrlEx()
{
	int m_nSort = -1;
}

CListCtrlEx::~CListCtrlEx()
{
}


BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl)
	//{{AFX_MSG_MAP(CListCtrlEx)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CListCtrlEx message handlers
void CListCtrlEx::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
	CDC dc;
	dc.Attach(lpDIS ->hDC);
	CRect rect = lpDIS ->rcItem,rc;
	int nItem = lpDIS ->itemID;
	CHeaderCtrl* pHeader = GetHeaderCtrl();
	int i = 0,nCount =pHeader ->GetItemCount();

	while(i<nCount)
	{
		pHeader ->GetItemRect(i,rc);
		rc.top = rect.top;
		rc.bottom = rect.bottom;
		DrawBack(&dc,rc,lpDIS,i);
		rc.left += 2;
		if(!i) //i==0
		{
			DrawImage(&dc,rc,nItem);
			rc.left +=18;
		}
		dc.DrawText(GetItemText(nItem,i),rc,DT_VCENTER|DT_SINGLELINE);
		//TRACE("nItem=%d,left = %d,right=%d,top=%d,bottom=%d\n",nItem,rc.left,rc.right,rc.top,rc.bottom);
		++i;
	}
	if(lpDIS->itemState & ODS_FOCUS)
		dc.DrawFocusRect(rect);
	dc.Detach();
}

void CListCtrlEx::DrawImage(CDC *pDC, CRect &rc, int nItem)
{
	LVITEM lvi= {LVIF_IMAGE};
	lvi.iItem = nItem;
	GetItem(&lvi);
	CImageList* pImageList = GetImageList(LVSIL_SMALL);
	pImageList ->Draw(pDC,lvi.iImage,rc.TopLeft(),ILD_TRANSPARENT);
}

void CListCtrlEx::DrawBack(CDC *pDC, CRect &rc, LPDRAWITEMSTRUCT lpDIS,int nSort)
{
	int nItem = lpDIS ->itemID;
	if(ODS_SELECTED & lpDIS ->itemState)
	{//选中状态
		pDC->FillSolidRect(rc,GetSysColor(COLOR_HIGHLIGHT));
		pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));
	}
	else
	{
		if(m_nSort == nSort)
		{
			if(nItem%2)
				pDC->FillSolidRect(rc,RGB(145,180,222));
			else
				pDC->FillSolidRect(rc,RGB(233,233,233));
		}
		else
		{
			if(nItem%2)
				pDC->FillSolidRect(rc,RGB(165,203,247));
			else
				pDC->FillSolidRect(rc,RGB(255,255,255));
		}

		pDC->SetTextColor(GetSysColor(COLOR_WINDOWTEXT));

	}
}


// ButtonEx.cpp : implementation file
//

#include "stdafx.h"
#include "Sil.h"
#include "ButtonEx.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CButtonEx

CButtonEx::CButtonEx()
{
}

CButtonEx::~CButtonEx()
{
}


BEGIN_MESSAGE_MAP(CButtonEx, CButton)
	//{{AFX_MSG_MAP(CButtonEx)
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CButtonEx message handlers

void CButtonEx::DrawItem(LPDRAWITEMSTRUCT lpDIS) 
{
	CDC dc;

	dc.Attach(lpDIS ->hDC);
	//switch(lpDIS ->CtlID)
	dc.SetTextColor(RGB(0,128,0));
	CRect rect(lpDIS ->rcItem);
	dc.SelectStockObject(LTGRAY_BRUSH);
	dc.FillSolidRect(rect,GetSysColor(COLOR_BTNFACE));
	
	if(lpDIS ->itemState & ODS_SELECTED)
	{
		dc.DrawEdge(rect,BDR_SUNKENINNER,BF_RECT);
		rect.OffsetRect(1,1);
	}
	else
		dc.DrawEdge(rect,BDR_RAISEDINNER,BF_RECT);
	
	//dc.DrawIcon(rect.left,rect.top,m_hIcon);
	int n = rect.Height();
	n = (n - 16)/2;
	if(lpDIS ->itemState & ODS_SELECTED)
		n += 1;

	DrawIconEx(lpDIS ->hDC,n,n,m_hIcon,16,16,0,0,DI_NORMAL);
	CString str;
	GetWindowText(str);
	dc.SetBkMode(TRANSPARENT);
	CRect rc = rect;
	rc.left = n;
	dc.DrawText(str,rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE );
	
	if(lpDIS ->itemState & ODS_FOCUS)
	{
		rect.DeflateRect(2,2);
		dc.DrawFocusRect(rect);
	}
	
	dc.Detach();
}



HICON CButtonEx::SetIcon(HICON hIcon)
{
	HICON hOld = m_hIcon;

	m_hIcon = hIcon;
	return hOld;
}

void CButtonEx::SetIcon(UINT nID)
{
	m_hIcon = AfxGetApp() ->LoadIcon(nID);
}

int CButtonEx::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CButton::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	
	return 0;
}



// ComboEx.cpp : implementation file
//

#include "stdafx.h"
#include "Sil.h"
#include "ComboEx.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CComboEx

CComboEx::CComboEx()
{
	m_pImageList = NULL;
}

CComboEx::~CComboEx()
{
}


BEGIN_MESSAGE_MAP(CComboEx, CComboBox)
	//{{AFX_MSG_MAP(CComboEx)
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CComboEx message handlers

void CComboEx::DrawItem(LPDRAWITEMSTRUCT lpDIS) 
{
	if(-1 == lpDIS ->itemID)
		return;

	ASSERT(m_pImageList != NULL);
	CDC* pDC = CDC::FromHandle(lpDIS ->hDC);
	CRect rect (lpDIS ->rcItem);
	
	pDC ->SetBkMode(TRANSPARENT);
	CString str;
	GetLBText(lpDIS ->itemID,str);
	int nImage= GetImage(lpDIS ->itemID);

	if(ODS_SELECTED & lpDIS ->itemState )
	{//选中状态
		pDC ->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));
		pDC ->FillSolidRect(rect,GetSysColor(COLOR_HIGHLIGHT));
		if(lpDIS ->itemAction & ODA_FOCUS)
			pDC ->DrawFocusRect(rect);
	}
	else
	{//普通状态
		pDC ->SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
		pDC ->FillSolidRect(rect,GetSysColor(COLOR_WINDOW));
	}
//	HICON hIcon = m_pImageList ->ExtractIcon( nImage);
	int n = rect.Height();
	n = (n-16)/2;
	if(ODS_COMBOBOXEDIT & lpDIS ->itemState )
		m_pImageList ->Draw(pDC ,nImage,CPoint(4,rect.top),ILD_TRANSPARENT);
	else
		m_pImageList ->Draw(pDC ,nImage,CPoint(2,rect.top),ILD_TRANSPARENT);
	rect.left = n+24;
	pDC ->DrawText(str,rect,DT_VCENTER|DT_SINGLELINE);
	
}

void CComboEx::AddItem(LPCSTR szText, int nImage)
{
	SData* pData = new SData;
	pData ->nImage = nImage;
	pData ->szText = szText;
	int i = GetCount();
	AddString("");
	SetItemData(i,(DWORD)pData);
}

CImageList* CComboEx::SetImageList(CImageList *pImageList)
{
	CImageList* pOld = m_pImageList;
	m_pImageList = pImageList;
	return pOld;
}

void CComboEx::GetLBText(int nIndex, CString &rString) const
{//只读函数
	ASSERT(nIndex < GetCount());
	SData* pData = (SData*)GetItemData(nIndex);

	rString = pData ->szText;
}



int CComboEx::GetImage(int nItem)
{
	ASSERT(nItem< GetCount());
	SData* pData = (SData*)GetItemData(nItem);

	return pData ->nImage;
	
}

void CComboEx::MeasureItem(LPMEASUREITEMSTRUCT lpMIS) 
{
//	lpMIS ->itemHeight = 30;
}

void CComboEx::OnDestroy() 
{
	CComboBox::OnDestroy();
	SData* pData = NULL;
	int i = GetCount();
	while(i--)
		delete (SData*)GetItemData(i);
}

#include "stdafx.h"
#include "Sil.h"
#include "SilDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSilDlg dialog
BOOL CSilDlg::m_bOrder = TRUE;
CSilDlg::CSilDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CSilDlg::IDD, pParent)
{
	m_nCol = -1;
	//{{AFX_DATA_INIT(CSilDlg)
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CSilDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSilDlg)
	DDX_Control(pDX, IDC_DEL, m_del);
	DDX_Control(pDX, IDC_MOD, m_mod);
	DDX_Control(pDX, IDC_ADD, m_add);
	DDX_Control(pDX, IDC_NATION, m_comb);
	DDX_Control(pDX, IDC_LIST, m_list);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CSilDlg, CDialog)
	//{{AFX_MSG_MAP(CSilDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_ADD, OnAdd)
	ON_BN_CLICKED(IDC_MOD, OnMod)
	ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST, OnColumnclickList)
	ON_BN_CLICKED(IDC_FIND, OnFind)
	ON_WM_ERASEBKGND()
	ON_WM_CTLCOLOR()
	ON_WM_NCHITTEST()
	ON_WM_DRAWITEM()
	ON_WM_MEASUREITEM()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSilDlg message handlers

BOOL CSilDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	m_comb.SetImageList(&m_iList);
	m_comb.AddItem("韩国",0);
	m_comb.AddItem("日本",1);
	m_comb.AddItem("美国",2);
	m_comb.AddItem("加拿大",3);
	m_comb.AddItem("英国",4);
	m_comb.SetCurSel(0);

	m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
	m_iList.Create(16,16,ILC_COLOR32|ILC_MASK,6,6);
	m_hList.Create(16,16,ILC_COLOR32|ILC_MASK,6,6);
	CBitmap b1,b2;
	b1.LoadBitmap(IDB_ASC);
	b2.LoadBitmap(IDB_DES);
	m_hList.Add(&b1,RGB(255,255,255));
	m_hList.Add(&b2,RGB(255,255,255));

	int i = 0;
	while(i<5)
		m_iList.Add(AfxGetApp() ->LoadIcon(IDI_KOR+i++));

	m_list.SetImageList(&m_iList,LVSIL_SMALL);
	m_list.InsertColumn(0,"编号",0,140);
	m_list.InsertColumn(1,"姓名",0,140);
	m_list.InsertColumn(2,"国籍",0,140);
	
	CHeaderCtrl *pHeader = m_list.GetHeaderCtrl();
	pHeader ->SetImageList(&m_hList);
	m_comb.SetCurSel(0);

	m_add.SetIcon(IDI_ADD);
	m_del.SetIcon(IDI_DEL);
	m_mod.SetIcon(IDI_MOD);

	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	SetWindowText("出国人员信息");
	ModifyStyle(0,WS_SYSMENU|WS_MINIMIZEBOX);
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CSilDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CSilDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CSilDlg::OnOK() 
{
	
//	CDialog::OnOK();
}
int CALLBACK CSilDlg::byNumb(LPARAM lParam1, LPARAM lParam2, LPARAM lParam)
{//判断是否要交换
	CSilDlg* pThis = (CSilDlg*)lParam;
	int n1 = atoi(pThis ->m_list.GetItemText(lParam1,0));
	int n2 = atoi(pThis ->m_list.GetItemText(lParam2,0));
	if(pThis ->m_bOrder)
		return n1>n2;
	else
		return n1<n2;
}
int CALLBACK  CSilDlg::byName(LPARAM lParam1, LPARAM lParam2, LPARAM lParam)
{
	CSilDlg* pThis = (CSilDlg*)lParam;
	CString str1 = pThis ->m_list.GetItemText(lParam1,1);
	CString str2 = pThis ->m_list.GetItemText(lParam2,1);
	if(pThis ->m_bOrder)
		return str1>str2;
	else
		return str1<str2;
}

void CSilDlg::OnAdd() 
{//编号重复不能添加
	CString str;
	GetDlgItemText(IDC_NUMB,str);	
	int i = m_list.GetItemCount();
	m_list.InsertItem(i,str,m_comb.GetCurSel());
	GetDlgItemText(IDC_NAME,str);
	m_list.SetItemText(i,1,str);

	//m_comb.GetWindowText(str);
	int nSel = m_comb.GetCurSel();
	m_comb.GetLBText(nSel,str);
	m_list.SetItemText(i,2,str);
}

void CSilDlg::OnMod() 
{
	if(!m_list.GetSelectedCount())
	{
		AfxMessageBox("请选中一条记录再修改");
		return;
	}
	int i = m_list.GetSelectionMark();
	LVITEM lvi = {LVIF_PARAM,i};
	m_list.GetItem(&lvi);
	int nData =lvi.lParam;
	//int nData = m_list.GetItemData(i);
	CString str;
	GetDlgItemText(IDC_NAME,str);
	m_list.SetItemText(i,1,str);
	int nSel = m_comb.GetCurSel();
	m_comb.GetLBText(nSel,str);
//	m_list.SetItemText(i,2,str);
	LVITEM li = {LVIF_TEXT,i,2 };
	li.pszText = (LPSTR)(LPCSTR)str;
	m_list.SetItem(&li);

	li.iImage = m_comb.GetCurSel();
	li.mask = LVIF_IMAGE|LVIF_PARAM;
	li.iSubItem = 0;
	li.lParam=i*111+3;
	m_list.SetItem(&li);
//	m_list.SetItemData(i,i*111+3);

}


void CSilDlg::OnColumnclickList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* p = (NM_LISTVIEW*)pNMHDR;
	int nCol = p ->iSubItem;
	HDITEM hi = {HDI_IMAGE|HDI_FORMAT};

	CHeaderCtrl* pHeader = m_list.GetHeaderCtrl();
	if(m_nCol > -1)
	{
		pHeader ->GetItem(m_nCol,&hi);//获取当前有哪些开关状态
		hi.fmt &= ~HDF_IMAGE;
		pHeader ->SetItem(m_nCol,&hi);

	}
	
	int j = 0,nCount=m_list.GetItemCount();
	while(j<nCount)
		m_list.SetItemData(j,j++);

	m_nCol = nCol;
	m_list.SetSort(nCol);
	PFNLVCOMPARE ps[] = {byNumb,byName,byNation};

	m_list.SortItems(ps[nCol],(DWORD)this);
	
	m_bOrder = !m_bOrder;

	pHeader ->GetItem(nCol,&hi);//获取当前有哪些开关状态
	hi.iImage = m_bOrder;
	hi.fmt |= HDF_IMAGE;
	pHeader ->SetItem(nCol,&hi);
	
	// TODO: Add your control notification handler code here
	
	*pResult = 0;
}

void CSilDlg::OnFind() 
{
	int i = 0,nCount=m_list.GetItemCount();
	CString str;
	GetDlgItemText(IDC_NUMB,str);
	while(i<nCount)
	{
		BOOL b = m_list.GetItemText(i,0) == str;
		m_list.SetItemState(i,b?LVIS_SELECTED:0,LVIS_SELECTED);
		if(b)
			m_list.SetSelectionMark(i);
		++i;
	}
	m_list.SetFocus();
}

BOOL CSilDlg::OnEraseBkgnd(CDC* pDC) 
{
	CBitmap bmp;
	bmp.LoadBitmap(IDB_BACK);
	CDC mdc;
	mdc.CreateCompatibleDC(pDC);
	mdc.SelectObject(&bmp);
	CRect rect;
	GetClientRect(rect);
	pDC ->BitBlt(0,0,rect.Width(),rect.Height(),&mdc,0,0,SRCCOPY);
	pDC ->SetBkMode(TRANSPARENT);
	pDC ->SetTextColor(RGB(255,255,255));
//	pDC ->SelectStockObject(DEFAULT_GUI_FONT);
	pDC ->SelectObject(GetFont());
	pDC ->TextOut(5,5,"出国人员信息 1.1版");

	return TRUE;
	//return CDialog::OnEraseBkgnd(pDC);//缺省背景颜色绘制
}
	/*//设置的颜色*/
HBRUSH CSilDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	//pDC 控件文字颜色的和背景
	//返回值:HBRUSH是背景填充颜色
	//pWnd:区分各种控件,可以获取ID或者是获取窗口类型名

	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	switch(pWnd ->GetDlgCtrlID())
	{
	case IDC_STATIC:
		pDC ->SetTextColor(RGB(255,255,255));
		pDC ->SetBkMode(TRANSPARENT);
		return (HBRUSH)GetStockObject(NULL_BRUSH);
	case IDC_NUMB:
		pDC ->SetTextColor(RGB(0,0,255));
		return hbr;
	case IDC_NAME:
		{
		pDC ->SetTextColor(RGB(255,0,0));
		pDC ->SetBkMode(TRANSPARENT);
		static CBrush br(RGB(255,255,0));
		return br;
		}
	case IDC_NATION:
		{
			pDC ->SetTextColor(RGB(255,0,0));
		}
	}

	//pDC ->SetBkColor(RGB(0,0,125));
	return hbr;
}

UINT CSilDlg::OnNcHitTest(CPoint point) 
{
	UINT nRet = CDialog::OnNcHitTest(point);
	if(HTCLIENT==nRet)
	{
		ScreenToClient(&point);
		if(point.y < 25)
			return HTCAPTION;
	}
	
	return nRet;
}

void CSilDlg::OnDrawItem(int nID, LPDRAWITEMSTRUCT lpDIS) 
{//父窗口内所有自绘子窗口的总闸!
	
		CDialog::OnDrawItem(nID, lpDIS);
	}


void CSilDlg::OnMeasureItem(int nID, LPMEASUREITEMSTRUCT lpMIS) 
{
	if(nID == IDC_NATION)
	{
	}
	CDialog::OnMeasureItem(nID, lpMIS);
}

void CSilDlg::PreInitDialog()
{
	CWnd* pWnd = GetDlgItem(IDC_FIND);
}