?? colorlistctrl.cpp
字號:
// Author: SFr frydaysoft@gmx.de
#include "stdafx.h"
#include "ColorListCtrl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CColorListCtrl
CColorListCtrl::CColorListCtrl(int colSize)
{
m_columnSize=colSize; // number of columns
m_fullColumnLines=TRUE; // paint vert. lines | | |
m_withSingleRect=FALSE; // paint single rect for all sub-items
#ifdef _DEBUG
m_BigFocusRect=TRUE; // focus-rect with small/big dots
#endif
#ifndef _DEBUG
m_BigFocusRect=FALSE; // focus-rect with small/big dots
#endif
IsCreated=FALSE;
}
//***************************************************************
CColorListCtrl::~CColorListCtrl()
{
}
//***************************************************************
BEGIN_MESSAGE_MAP(CColorListCtrl, CListCtrl)
//{{AFX_MSG_MAP(CColorListCtrl)
ON_WM_PAINT()
ON_WM_DESTROY()
ON_WM_KILLFOCUS()
ON_WM_SETFOCUS()
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Behandlungsroutinen f黵 Nachrichten CColorListCtrl
void CColorListCtrl::OnDestroy()
{
DeleteAllItems();
CListCtrl::OnDestroy();
}
//***************************************************************
void CColorListCtrl::SetColumnType(BOOL bNew)
{
m_fullColumnLines=bNew; // paint no/vert. lines | | |
if (IsCreated)
{
RedrawWindow();
}
}
void CColorListCtrl::SetRectType(BOOL bNew)
{
m_withSingleRect=bNew; // paint no/single rect for all sub-items
if (IsCreated)
{
RedrawWindow();
}
}
void CColorListCtrl::SetFocusType(BOOL bNew)
{
m_BigFocusRect=bNew; // focus-rect with small/big dots
if (IsCreated)
{
RedrawWindow();
}
}
//***************************************************************
CMyLParam* CColorListCtrl::GetMyLParam(int Index)
{
LVITEM Item;
Item.mask = LVIF_PARAM;
Item.iItem = Index;
Item.iSubItem = 0;
CListCtrl::GetItem(&Item);
return (CMyLParam*)Item.lParam;
}
//***************************************************************
CRect CColorListCtrl::GetFullCellRect(int nItem, BOOL outside)
{
static CRect rectCell;
CListCtrl::GetItemRect(nItem, rectCell, LVIR_BOUNDS);
if (!outside)
{ //decrease 1 pixel
rectCell.left++; rectCell.right--;
rectCell.top++; rectCell.bottom--;
}
return rectCell;
}
//***************************************************************
CRect CColorListCtrl::GetCellRect(int nItem, int nColumn, BOOL outside)
{
static CRect rectCell;
// Get the height
CListCtrl::GetItemRect(nItem, rectCell, LVIR_BOUNDS);
LV_COLUMN column;
column.mask = LVCF_WIDTH; // Set the mask to only return the width
for (int x=0; x<nColumn; x++)
{
column.iSubItem=1;
CListCtrl::GetColumn(x, &column); // Get rect-edge (left/top)
rectCell.left+=column.cx;
}
column.iSubItem=1;
CListCtrl::GetColumn(nColumn, &column); // Get rect-edge (right/bottom)
rectCell.right = rectCell.left + column.cx;
if (!outside)
{ //decrease 1 pixel
rectCell.left++; rectCell.right--;
rectCell.top++; rectCell.bottom--;
}
return rectCell;
}
//***************************************************************
void CColorListCtrl::InvalidateFullItem(int nItem, BOOL bErase)
{
CRect rcBounds=GetFullCellRect(nItem, TRUE);
InvalidateRect(rcBounds, bErase);
}
//***************************************************************
// create ListCtrl-head
int CColorListCtrl::InitCtrl(CStringArray *phead, CByteArray *pProcent)
{
/*
if ( (!phead)||(!pProcent)) return 1;
LV_COLUMN lvc;
int cx=0;
int count = phead->GetSize();
// if (count! = m_columnSize) return 2;
if (pProcent->GetSize() != count) return 3;
for (int x=0; x<count; x++) cx+=pProcent->GetAt(x);
if (cx!=100) return 4;
CRect rect_listbox;
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
GetWindowRect( rect_listbox );
cx=int((rect_listbox.right-rect_listbox.left)-20); //some Pixel for Scrollbar
//set head-columns in ListBox
lvc.iSubItem = 0;
lvc.fmt = LVCFMT_LEFT ;
for (x=0; x<count; x++)
{
lvc.cx = int(cx*pProcent->GetAt(x)/100);
lvc.pszText = (char*)LPCSTR(phead->GetAt(x));
CListCtrl::InsertColumn(x,&lvc);
}
*/
CRect rect_listbox;
GetWindowRect( rect_listbox );
LV_COLUMN lvcol;
lvcol.mask = LVCF_WIDTH|LVCF_TEXT|LVCF_FMT;
lvcol.fmt=LVCFMT_CENTER;
int n = phead->GetSize();
if(n != pProcent->GetSize())
{
AfxMessageBox("警告!");
return 1;
}
for(int i=0;i<n;i++)
{
lvcol.cx = pProcent->GetAt(i);
lvcol.pszText = (char*)LPCSTR(phead->GetAt(i));
CListCtrl::InsertColumn(i,&lvcol);
}
return 0;
}
//***************************************************************
// add an item
int CColorListCtrl::AddItem(CStringArray *line, int pos)
{
int ret_index=LISTCTRL_ERROR;
if (!line) return ret_index;
LV_ITEM lvi;
//set List-properties
lvi.mask = LVIF_TEXT ;
lvi.iSubItem = 0;
lvi.pszText = "";
int count=GetItemCount();
int columns=line->GetSize();
if (m_columnSize!=columns) return ret_index;
if (DWORD(pos)<=DWORD(count)) count=pos;
lvi.iItem = count;
//lvi.lParam= count;
lvi.mask = LVIF_TEXT ;
lvi.iSubItem = 0; //refer to no Item
// insert an new line
ret_index=InsertItem(&lvi);
// set item text for additional columns
for (int x=0; x<columns; x++)
{
CListCtrl::SetItemText(count,x,(char*)LPCSTR(line->GetAt(x)) );
}
lvi.mask = LVIF_STATE;
lvi.iSubItem = 1;
lvi.stateMask = 0xFFFFFFFF ;
lvi.state = 0;
if (CListCtrl::SetItem(&lvi))
{
CMyLParam *p=new CMyLParam(m_columnSize); //init with: DEF_BACKGROUND, def_text
#ifdef TESTCOLOR
/* // only for TEST
if (ret_index<3)
{
p->SetBackColor(ITEM_COLOR(ret_index+BLUE),0);
p->SetTextColor(ITEM_COLOR(ret_index+RED ),0);
}
else
if (ret_index<=6)
{
p->SetBackColor(ITEM_COLOR(ret_index+BLUE),1);
p->SetTextColor(ITEM_COLOR(ret_index+RED ),1);
}
else
{
p->SetBackColor(ITEM_COLOR((ret_index+BLUE)&0xF),2);
p->SetTextColor(ITEM_COLOR((ret_index+RED )&0xF),2);
}
// end: only for TEST*/
#endif
CListCtrl::SetItemData( ret_index, DWORD(p) );
return ret_index;
}
return LISTCTRL_ERROR;
}
//***************************************************************
BOOL CColorListCtrl::DeleteAllItems()
{
while (CListCtrl::GetItemCount())
CColorListCtrl::DeleteItem(0);
return TRUE;
}
//***************************************************************
BOOL CColorListCtrl::DeleteItem(int nItem )
{
if (CListCtrl::GetItemCount()<=nItem) return FALSE;
CMyLParam *p=(CMyLParam*)CListCtrl::GetItemData(nItem);
if (p)
{
CListCtrl::SetItemData( nItem, p->GetData() );
delete p;
return CListCtrl::DeleteItem( nItem );
}
return TRUE;
}
//***************************************************************
DWORD CColorListCtrl::GetItemData( int nItem ) const
{
CMyLParam *p=(CMyLParam*)CListCtrl::GetItemData(nItem);
if (p)
{
return p->GetData();
return TRUE;
}
return 0;
}
//***************************************************************
BOOL CColorListCtrl::SetItemData( int nItem, DWORD dwData )
{
CMyLParam *p=(CMyLParam*)CListCtrl::GetItemData(nItem);
if (p)
{
p->SetData(dwData);
return TRUE;
}
return FALSE;
}
//***************************************************************
BOOL CColorListCtrl::SetItemBackgndColor(COLORREF color, int Index, int iSub)
{
CMyLParam *p=GetMyLParam(Index);
if (!p) return FALSE;
if ( p->SetBackColor(color, iSub) )
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -