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 + -
显示快捷键?