📄 fpspropertylist.cpp
字号:
// FPSPropertyList.cpp : implementation file
//
#include "stdafx.h"
#include "FPSPropertyList.h"
#include "MemDC.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
CFPSPropertyList::CFPSPropertyList()
{
m_iVisibleItemCount = 0;
m_dwTopItem = 1;
m_dwItemCounter = 0;
m_nBackColor = RGB(192, 192, 192);
m_nTextColor = RGB(0, 0, 0);
}
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
CFPSPropertyList::~CFPSPropertyList()
{
RemoveAllItems();
}
BEGIN_MESSAGE_MAP(CFPSPropertyList, CWnd)
//{{AFX_MSG_MAP(CFPSPropertyList)
ON_WM_PAINT()
ON_WM_SIZE()
ON_WM_VSCROLL()
ON_WM_LBUTTONDOWN()
ON_WM_DESTROY()
ON_WM_CLOSE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
BOOL CFPSPropertyList::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
CRect ScrollRect;
CRect ClientRect;
GetClientRect(ClientRect);
ScrollRect.SetRect(ClientRect.Width() - 20,
5,
ClientRect.Width() - 5,
ClientRect.Height() - 5);
m_nScrollBar.Create(WS_CHILD | WS_VISIBLE | SBS_VERT,
ScrollRect,
this,
SCROLLBAR_ID);
return TRUE;
}
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
void CFPSPropertyList::OnPaint()
{
CPaintDC dc(this); // device context for painting
RedrawWindow(&dc);
}
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
void CFPSPropertyList::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
CRect ClientRect;
GetClientRect(ClientRect);
if (!IsWindow(m_nScrollBar.m_hWnd))
return;
NotifyItems();
m_nScrollBar.SetWindowPos(NULL,
ClientRect.Width() - 20,
5,
15,
ClientRect.Height() - 10,
SWP_SHOWWINDOW);
}
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
void CFPSPropertyList::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
switch (nSBCode)
{
case SB_BOTTOM:
{
m_dwTopItem = m_dwItemCounter - m_iVisibleItemCount + 1;
break;
}
case SB_TOP:
{
m_dwTopItem = 1;
break;
}
case SB_LINEDOWN:
{
m_dwTopItem++;
if (m_dwTopItem > (m_dwItemCounter - m_iVisibleItemCount + 1))
m_dwTopItem = m_dwItemCounter - m_iVisibleItemCount + 1;
break;
}
case SB_LINEUP:
{
m_dwTopItem--;
if (m_dwTopItem < 1)
m_dwTopItem = 1;
break;
}
case SB_PAGEDOWN:
{
m_dwTopItem = m_dwTopItem + m_iVisibleItemCount - 1;
if (m_dwTopItem > (m_dwItemCounter - m_iVisibleItemCount + 1))
m_dwTopItem = m_dwItemCounter - m_iVisibleItemCount + 1;
break;
}
case SB_PAGEUP:
{
if (((int)m_dwTopItem - (m_iVisibleItemCount - 1)) < 1)
{
m_dwTopItem = 1;
}
else
{
m_dwTopItem = m_dwTopItem - (m_iVisibleItemCount - 1);
}
break;
}
}
m_nScrollBar.ShowWindow(FALSE);
CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
RedrawWindow();
m_nScrollBar.ShowWindow(TRUE);
}
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
DWORD CFPSPropertyList::AddItem(CFPSPropertyListItem * pItem)
{
m_nItemList.AddTail(pItem);
m_dwItemCounter++;
pItem->m_dwID = m_dwItemCounter;
pItem->m_bAutoDelete = FALSE;
pItem->SetTextColor(m_nTextColor);
pItem->SetBackColor(m_nBackColor);
return m_dwItemCounter;
}
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
void CFPSPropertyList::RedrawWindow(CDC * pDC)
{
CMemDC DrawDC(pDC);
CRect ClientRect;
POSITION CurrentPos;
CFPSPropertyListItem* pEntry;
int Y;
if (!IsWindow(m_hWnd))
return;
m_iVisibleItemCount = 0;
DrawSolidBackground(&DrawDC);
MakeAllItemsInvisible();
Y = 3;
GetClientRect(ClientRect);
CurrentPos = m_nItemList.GetHeadPosition();
while (CurrentPos != NULL)
{
pEntry = m_nItemList.GetNext(CurrentPos);
if (pEntry->m_dwID >= m_dwTopItem)
{
CRect ItemRect;
ItemRect.SetRect(3, Y, ClientRect.Width() - 6, Y + 15);
pEntry->m_pParent = this;
pEntry->SetItemRect(ItemRect);
if (Y + 18 < ClientRect.Height())
{
pEntry->DrawItem(&DrawDC);
pEntry->m_bIsVisible = TRUE;
m_iVisibleItemCount++;
}
else
{
pEntry->m_bIsVisible = FALSE;
}
Y = Y + 16;
}
else
{
pEntry->m_bIsVisible = FALSE;
}
}
if (m_iVisibleItemCount == (int)m_dwItemCounter)
{
m_nScrollBar.ShowWindow(FALSE);
}
else
{
m_nScrollBar.SetScrollRange(1, m_dwItemCounter, TRUE);
if (m_dwTopItem == 1)
{
m_nScrollBar.SetScrollPos(1);
}
else if (m_dwTopItem == (m_dwItemCounter - m_iVisibleItemCount + 1))
{
m_nScrollBar.SetScrollPos(m_dwItemCounter);
}
else
{
int pos = m_dwTopItem + (m_iVisibleItemCount / 2);
m_nScrollBar.SetScrollPos(pos);
}
EnableScrollBar(SCROLLBAR_ID, TRUE);
m_nScrollBar.EnableScrollBar();
m_nScrollBar.ShowScrollBar();
}
}
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
void CFPSPropertyList::RemoveAllItems()
{
POSITION CurrentPos;
CFPSPropertyListItem* pEntry;
CurrentPos = m_nItemList.GetHeadPosition();
while (CurrentPos != NULL)
{
pEntry = m_nItemList.GetNext(CurrentPos);
if (pEntry->m_bAutoDelete)
delete pEntry;
}
m_nItemList.RemoveAll();
m_dwItemCounter = 0;
m_dwTopItem = 1;
}
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
void CFPSPropertyList::DrawSolidBackground(CDC * pDC)
{
CRect ClientRect;
GetClientRect(ClientRect);
pDC->FillSolidRect(0,
0,
ClientRect.Width(),
ClientRect.Height(),
m_nBackColor);
}
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
void CFPSPropertyList::OnLButtonDown(UINT nFlags, CPoint point)
{
POSITION CurrentPos;
CFPSPropertyListItem* pEntry;
BOOL Found = FALSE;
CurrentPos = m_nItemList.GetHeadPosition();
while ((CurrentPos != NULL))
{
pEntry = m_nItemList.GetNext(CurrentPos);
if (pEntry->OnClick(point))
Found = TRUE;
}
SetFocus();
CWnd::OnLButtonDown(nFlags, point);
}
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
void CFPSPropertyList::OnDestroy()
{
NotifyItems();
CWnd::OnDestroy();
}
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
void CFPSPropertyList::OnClose()
{
NotifyItems();
CWnd::OnClose();
}
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
void CFPSPropertyList::NotifyItems()
{
POSITION CurrentPos;
CFPSPropertyListItem* pEntry;
CurrentPos = m_nItemList.GetHeadPosition();
while (CurrentPos != NULL)
{
pEntry = m_nItemList.GetNext(CurrentPos);
CPoint pt(-1, -1);
pEntry->OnClick(pt);
}
}
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
void CFPSPropertyList::MakeAllItemsInvisible()
{
POSITION CurrentPos;
CFPSPropertyListItem* pEntry;
CurrentPos = m_nItemList.GetHeadPosition();
while (CurrentPos != NULL)
{
pEntry = m_nItemList.GetNext(CurrentPos);
pEntry->m_bIsVisible = FALSE;
}
}
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
BOOL CFPSPropertyList::GetItem(DWORD dwID, CFPSPropertyListItem * pItem)
{
pItem = GetItemByID(dwID);
if (!pItem) return FALSE;
return TRUE;
}
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
CFPSPropertyListItem* CFPSPropertyList::GetItemByID(DWORD dwID)
{
POSITION CurrentPos;
CFPSPropertyListItem* pEntry;
BOOL bFound = FALSE;
CurrentPos = m_nItemList.GetHeadPosition();
while ((CurrentPos != NULL) && (!bFound))
{
pEntry = m_nItemList.GetNext(CurrentPos);
if (pEntry->m_dwID == dwID)
bFound = TRUE;
}
if (!bFound)
{
return NULL;
}
else
{
return pEntry;
}
}
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
DWORD CFPSPropertyList::GetItemData(DWORD dwID)
{
CFPSPropertyListItem* pItem = GetItemByID(dwID);
if (!pItem) return NULL;
return pItem->GetItemData();
}
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
BOOL CFPSPropertyList::SetupItem(DWORD dwID, PROPERTYITEMSETUP * pSetupInfo)
{
CFPSPropertyListItem* pItem = GetItemByID(dwID);
if (!pItem) return FALSE;
pItem->Setup(pSetupInfo);
return TRUE;
}
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
BOOL CFPSPropertyList::SetItemData(DWORD dwID, DWORD Data)
{
CFPSPropertyListItem* pItem = GetItemByID(dwID);
if (!pItem) return FALSE;
pItem->SetItemData(Data);
return TRUE;
}
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
DWORD CFPSPropertyList::AddItem(PROPERTYITEMSETUP * pSetupInfo)
{
CFPSPropertyListItem* pItem = new CFPSPropertyListItem;
pItem->Setup(pSetupInfo);
m_dwItemCounter++;
pItem->m_dwID = m_dwItemCounter;
pItem->m_bAutoDelete = TRUE;
m_nItemList.AddTail(pItem);
return m_dwItemCounter;
}
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
BOOL CFPSPropertyList::GetItemInfo(DWORD dwID, PROPERTYITEMSETUP & Setup)
{
CFPSPropertyListItem* pItem = GetItemByID(dwID);
if (!pItem) return FALSE;
pItem->GetSetup(&Setup);
return TRUE;
}
/////////////////////////////////////////////////////////////////////
// APPLICATION FUNCTION
/////////////////////////////////////////////////////////////////////
void CFPSPropertyList::AboutToChange()
{
NotifyItems();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -