ctrlview.cpp

来自「在VC编程环境下」· C++ 代码 · 共 300 行

CPP
300
字号
/*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	文件:CtrlView.h

	版权:Firebird Software Workroom 保留

	声明:本源程序的版权受《中华人民共和国著作权法》以及其
		  它相关法律和条约的保护。任何有机会得到本源程序的
		  个人和机构,未经作者明确授权,不得将本源程序用于
		  任何商业目的(直接的或间接的)。对于非商业目的的使
		  用 (包括复制、传播、编译和修改), 原则上没有特别
		  的限制条款,但请在相关文档中说明其来源,并尊重原
		  作者的署名权。

	编写:秦传安(chings)	1999.12 - 2000.5

	联络:E_mail:chings@163.net
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
#include "fclstd.h"
#include "CtrlView.h"
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//###################################################################
//	class CFBListView
//	列表控件
//###################################################################

CFBListView::CFBListView()
{
}

CFBListView::~CFBListView()
{
}
//////////////////////////////////////////////////////////////////////
//创建函数
BOOL CFBListView::Create(CFBWnd* pParent,UINT nID,DWORD style)
{
	if(!pParent)return FALSE;

	InitCommonControls();

	style |= WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | 
			 CCS_NOPARENTALIGN|CCS_NODIVIDER|
			 WS_CLIPCHILDREN | LVS_ALIGNLEFT | LVS_REPORT;

	return CFBWnd::Create(WC_LISTVIEW,
						NULL,
						pParent->GetInstance(),
						pParent,
						style,
						WS_EX_CLIENTEDGE,
						(HMENU)nID,
						NULL,
						0,0,0,0);
}

//////////////////////////////////////////////////////////////////////
//置扩展风格
void CFBListView::SetExStyle(DWORD dwExStyle)
{
	DWORD dwStyle = SendMessage(m_hWnd,LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
	dwStyle |= dwExStyle;
	SendMessage(m_hWnd,LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle);
}
//////////////////////////////////////////////////////////////////////
void CFBListView::DrawItem(LPDRAWITEMSTRUCT pds)
{
	RECT rcIcon,rcLabel,rcSel;
	HIMAGELIST himl;
	char text[256];
	HDC hDC = pds->hDC;
	int index = pds->itemID;

	text[0] = '\0';

	GetItemRect(index,&rcIcon,LVIR_ICON);
	GetItemRect(index,&rcLabel,LVIR_LABEL);
	GetItemRect(index,&rcSel,LVIR_SELECTBOUNDS);

	himl = GetImageList();
	rcLabel.top += 2;

	LV_ITEM lvi;
	lvi.mask = LVIF_IMAGE | LVIF_STATE;
	lvi.iItem = index;
	lvi.iSubItem = 0;
	lvi.stateMask = 0xffff;
	GetItem(&lvi);

	if(lvi.state & LVIS_SELECTED)
	{
		COLORREF clr;
		clr = RGB(0,255,255);

		FillSolidRect(hDC,rcSel.left,rcSel.top,
						rcSel.right- rcSel.left,rcSel.bottom - rcSel.top,
						clr);
	}

	ImageList_Draw(himl,lvi.iImage,hDC,rcIcon.left,rcIcon.top,ILD_TRANSPARENT);

	SetBkMode(hDC,TRANSPARENT);//文本背景透明

	BOOL bRet = TRUE;
	LV_COLUMN lvc;
	UINT fmt;
	int right = 0;

	for(int i=0;bRet;i++)
	{
		lvc.mask = LVCF_WIDTH|LVCF_FMT;
		bRet = GetColumn(i,&lvc);

		lvi.mask = LVIF_TEXT;
		lvi.iItem = index;
		lvi.iSubItem = i;
		lvi.pszText = text;
		lvi.cchTextMax = 256;
		text[0] = '\0';

		if(bRet)
			GetItem(&lvi);

		//文本输出格式
		if(lvc.fmt & LVCFMT_RIGHT)
			fmt = DT_RIGHT;
		else if(lvc.fmt & LVCFMT_CENTER)
			fmt = DT_CENTER;
		else
			fmt = DT_LEFT;

		rcLabel.left += 6;
		right += lvc.cx;
		rcLabel.right = right -4;
		if(text[0] != '\0')
			DrawText(hDC,text,lstrlen(text),&rcLabel,fmt);
		rcLabel.left = right;
	}
}
//////////////////////////////////////////////////////////////////////
void CFBListView::OnNotify(LPNMHDR pNMHDR,LRESULT &lResult)
{
	CFBView::OnNotify(pNMHDR,lResult);

	//仅处理状态改变的消息
	LPNM_LISTVIEW pnmv = (LPNM_LISTVIEW)pNMHDR;
	if(pnmv->hdr.code == LVN_ITEMCHANGED)
	{
		//由选中到未选中
		if((pnmv->uOldState & LVIS_SELECTED) &&
			(!(pnmv->uNewState & LVIS_SELECTED)))
			SendMessage(m_hWnd,LVM_REDRAWITEMS,pnmv->iItem,pnmv->iItem);
		//由未选中到选中
		if(!(pnmv->uOldState & LVIS_SELECTED) &&
			(pnmv->uNewState & LVIS_SELECTED))
		{
			LV_ITEM lvi;
			char str[MAX_PATH];
			lvi.mask = LVIF_TEXT|LVIF_PARAM|LVIF_STATE;
			lvi.iItem = pnmv->iItem;
			lvi.iSubItem = 0;
			lvi.pszText = str;
			lvi.cchTextMax = MAX_PATH;
			GetItem(&lvi);
			SendMessage(m_pOwner->m_hWnd,FBWM_NOTIFY,MAKEWPARAM(GetWndID(),FB_LCN_SELCHANGED),(LPARAM)&lvi);
		}
	}
}
//###################################################################
//	class CFBTreeView
//	树型控件
//###################################################################

CFBTreeView::CFBTreeView()
{
}

CFBTreeView::~CFBTreeView()
{
}
//////////////////////////////////////////////////////////////////////
BOOL CFBTreeView::Create(CFBWnd *pParent,DWORD style,UINT uID)
{
	if(!pParent)return FALSE;

	InitCommonControls();

	style |= WS_VISIBLE| WS_CHILD | WS_CLIPSIBLINGS | 
			 WS_CLIPCHILDREN | CCS_NOPARENTALIGN|CCS_NODIVIDER|CCS_NORESIZE;

	return CFBWnd::Create(WC_TREEVIEW,NULL,pParent->GetInstance(),
						pParent,style,WS_EX_CLIENTEDGE,(HMENU)uID);
}
////////////////////////////////////////////////////////////////////////////////////////////
void CFBTreeView::GetItemText(HTREEITEM hItem,LPTSTR szItemText)
{
	if(szItemText == NULL)return;
	TV_ITEM item;
	item.mask = TVIF_TEXT|TVIF_HANDLE;
	item.hItem = hItem;
	item.pszText = szItemText;
	item.cchTextMax = _MAX_PATH;
	SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);
}

////////////////////////////////////////////////////////////////////////////////////////////
DWORD CFBTreeView::GetItemData(HTREEITEM hItem)
{
	TV_ITEM item;
	item.mask = TVIF_PARAM|TVIF_HANDLE;
	item.hItem = hItem;
	SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);
	return (DWORD)item.lParam;
}
//////////////////////////////////////////////////////////////////////
void CFBTreeView::OnDraw(HDC hDC)
{
	HDC hMemDC = CreateCompatibleDC(hDC);
	RECT rc,rcClip;
	GetClipBox(hDC,&rcClip);
	GetClientRect(m_hWnd,&rc);

	HBITMAP hBmp = CreateCompatibleBitmap(hDC, rc.right - rc.left,
										  rc.bottom - rc.top);

	SelectObject(hMemDC, hBmp );	

	CallWindowProc(m_pfnDefWndProc,m_hWnd,WM_PAINT,(WPARAM)hMemDC, 0 );

	HDC hMaskDC = CreateCompatibleDC(hMemDC);
	
	HBITMAP hMaskBmp = CreateBitmap( rcClip.right - rcClip.left,
									rcClip.bottom - rcClip.top, 1, 1, NULL);
	SelectObject(hMaskDC, hMaskBmp );

	BitBlt(hMaskDC, 0, 0,
		   rcClip.right - rcClip.left,
		   rcClip.bottom - rcClip.top, hMemDC, 
		   rcClip.left, rcClip.top, SRCCOPY );

	::SetBkColor(hMemDC,RGB(0,0,0));
	::SetTextColor(hMemDC,RGB(255,255,255));
	BitBlt(hMemDC,rcClip.left, rcClip.top,
		   rcClip.right - rcClip.left,
		   rcClip.bottom - rcClip.top,
		   hMaskDC, 0,0,SRCAND);

	::SetBkColor(hDC,RGB(255,255,255));
	::SetTextColor(hDC,RGB(0,0,0));
	BitBlt(hDC,rcClip.left, rcClip.top,
		   rcClip.right - rcClip.left,
		   rcClip.bottom - rcClip.top,
		   hMaskDC,0,0,SRCAND);

	BitBlt(hDC,rcClip.left, rcClip.top,
		   rcClip.right - rcClip.left,
		   rcClip.bottom - rcClip.top,
		   hMemDC,rcClip.left, rcClip.top,SRCPAINT);

	DeleteObject(hBmp);
	DeleteObject(hMaskBmp);
	DeleteDC(hMemDC);
	DeleteDC(hMaskDC);
}
//////////////////////////////////////////////////////////////////////
void CFBTreeView::OnNotify(LPNMHDR pNMHDR,LRESULT &lResult)
{
	CFBView::OnNotify(pNMHDR,lResult);

	if((pNMHDR->code == TVN_ITEMEXPANDING) && (m_nBkMode == 2))
		Invalidate();
}

//######################################################################
CFBEditView::CFBEditView()
{
}

CFBEditView::~CFBEditView()
{
}
//######################################################################
BOOL CFBEditView::Create(CFBWnd* pParent,UINT uID,DWORD style)
{
	if(!pParent)return FALSE;

	style |= WS_CHILD | WS_VISIBLE | ES_LEFT | ES_MULTILINE |
			ES_AUTOHSCROLL | ES_AUTOVSCROLL;

	return CFBWnd::Create("EDIT",NULL,pParent->GetInstance(),
						  pParent,style,WS_EX_CLIENTEDGE);
}
//////////////////////////////////////////////////////////////////////
void CFBEditView::AddText(LPTSTR pText)
{
	int n = lstrlen(pText);
	for(int i=0; i<n; i++)
		PostMessage(m_hWnd,WM_CHAR,(WPARAM)pText[i],0);
}

⌨️ 快捷键说明

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