// ListCtrlCl.cpp : 实现文件
//
#include "../stdafx.h"
//#include "IASMonitor.h"
#include "ListCtrlCl.h"
IMPLEMENT_DYNAMIC(CListCtrlCl, CListCtrl)
CListCtrlCl::CListCtrlCl()
: m_nRowHeight(0)
, m_fontHeight(12)
, m_fontWith(0)
{
m_nLeftMargin = 2;
m_nColLinkVec.clear();
m_HasSelectedStatus = TRUE;
m_RoomItemFlagsArr.clear();
}
CListCtrlCl::~CListCtrlCl()
{
//RemoveList();
}
BEGIN_MESSAGE_MAP(CListCtrlCl, CListCtrl)
ON_WM_MOUSEMOVE()
ON_WM_MEASUREITEM()
ON_WM_MEASUREITEM_REFLECT()
ON_WM_NCCALCSIZE()
END_MESSAGE_MAP()
// CListCtrlCl 消息处理程序
void CListCtrlCl::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
ModifyStyle(0,LVS_OWNERDRAWFIXED);
CListCtrl::PreSubclassWindow();
CHeaderCtrl *pHeader = GetHeaderCtrl();
m_Header.SubclassWindow(pHeader->GetSafeHwnd());
}
void CListCtrlCl::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (!m_HasSelectedStatus)
{
CRect rect;
UINT nFlag = 0;
int iItem = HitTest( point, &nFlag );
int iCol = -1;
int iRow = -1;
CRect colrect;
BOOL bFlag = FALSE;
if ( nFlag & LVHT_ONITEM )
{
GetItemRect( iItem, &rect, LVIR_BOUNDS);
/*CRect rcCol;
rcCol.left = 4;
rcCol.right = rcCheckBox.left + m_sizeCheckBox.cx;
rcCol.top = rect.top + ( rect.Height() - m_sizeCheckBox.cy ) / 2;
rcCol.bottom = rcCol.top + rcCol.cy;*/
//GetSubItemRect(iItem,)
iRow = iItem;
int iColCount = m_Header.GetItemCount();
for (int iColIndex = 0;iColIndex<iColCount;iColIndex++)
{
GetSubItemRect(iItem,iColIndex,LVIR_LABEL,colrect);
if ( point.x >= colrect.left && point.x <= colrect.right &&
point.y >= colrect.top && point.y <= colrect.bottom )
{
// CString str;
// str.Format("----%d-%d",iItem,iColIndex);
// MessageBox(str);
iCol = iColIndex;
break;
}
}
}
else
bFlag = TRUE;
if (-1 != iRow && -1 != iCol)
{
if (CompareFlagsRowsAndCols(iRow,iCol))
{
/*CString str;
str.Format("%d-%d",iRow,iCol);
MessageBox(str);*/
LoadMenuData(iRow,iCol);
CPoint pt;
pt.x = colrect.right;
pt.y = colrect.top;
ClientToScreen(&pt);
popmenu.TrackPopupMenu(TPM_LEFTALIGN,pt.x,pt.y,this,colrect);
}
else
bFlag = TRUE;
}
else
bFlag = TRUE;
if (bFlag)
{
//SendMessage(WM_NULL,NULL,NULL);
/*int index = 0;
int iCount = popmenu.GetMenuItemCount();
for(int i = iCount - 1; i >= 0; i--)
{
popmenu.DeleteMenu(i, MF_BYPOSITION);
}
m_strArr.RemoveAll();
popmenu.DestroyMenu();*/
}
}
CListCtrl::OnMouseMove(nFlags, point);
}
void CListCtrlCl::LoadMenuData(int iRow,int iCol)
{
popmenu.DestroyMenu();
popmenu.CreatePopupMenu();
m_strArr.RemoveAll();
int MenuPopIDBegin = MenuCommandID;
/*int index = 0;
int iCount = popmenu.GetMenuItemCount();
for(int i = iCount - 1; i >= 0; i--)
{
popmenu.DeleteMenu(i, MF_BYPOSITION);
}
m_strArr.RemoveAll();*/
CString strtitle;
for (int index = 0; index<10;index++)
{
strtitle.Format("20:%2d:%2d 1200",iRow,iCol);
m_strArr.Add(strtitle);
popmenu.AppendMenu(MF_STRING|MF_OWNERDRAW,MenuPopIDBegin++,"");
}
popmenu.SetItemTextArr(m_strArr);
}
BOOL CListCtrlCl::CompareFlagsRowsAndCols(int iRow,int iCol)
{
Json::Value ItemJoinArray = m_RoomItemFlagsArr["ItemArray"];
if (ItemJoinArray.isArray()&& !ItemJoinArray.isNull())
{
int nItemCountSize = ItemJoinArray.size();
int index = 0;
for (int index = 0;index < nItemCountSize;index++)
{
Json::Value ItemData = ItemJoinArray[index];
if (ItemData.isObject() && !ItemData.isNull())
{
if (iRow == ItemData["row"].asInt())
{
Json::Value ItemColsArray = ItemData["Cols"];
if (ItemColsArray.isArray()&& !ItemColsArray.isNull())
{
for (int index = 0;index < ItemColsArray.size();index++)
{
Json::Value ItemData = ItemColsArray[index];
if (iCol == ItemData.asInt())
{
return TRUE;
}
}
}
}
}
}
}
return FALSE;
}
void CListCtrlCl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
int nCtlType = lpDrawItemStruct->CtlType;
int nCtlID = lpDrawItemStruct->CtlID;
int nItemID = lpDrawItemStruct->itemID;
UINT nCtrlItemAction = lpDrawItemStruct->itemAction;
UINT nCtrlItemState = lpDrawItemStruct->itemState;
HWND nCtrlHwnd = lpDrawItemStruct->hwndItem;
HDC nCtrlHDC = lpDrawItemStruct->hDC;
RECT nCtrlRect = lpDrawItemStruct->rcItem;
//ULONG_PTR pPtr = &lpDrawItemStruct->itemData;
ULONG_PTR pPtr = lpDrawItemStruct->itemData;
//#ifdef _DEBUG
/*char buffer[1024] = { 0 };
sprintf(buffer,"控件类似是%d,控件ID是%d,控件ItemID是%d,控件ItemAction是%d,控件ItemState是%d,"\
"控件句柄是0x%p,控件HDC是0x%p,控件矩形区域是(%d,%d,%d,%d),控件ItemData地址是0x%p",nCtlType,nCtlID,\
nItemID,nCtrlItemAction,nCtrlItemState,nCtrlHwnd,nCtrlHDC,nCtrlRect.left,nCtrlRect.top,nCtrlRect.right,nCtrlRect.bottom,pPtr);*/
//MessageBoxA(buffer);
//#endif
// TODO: 添加您的代码以绘制指定项
TCHAR lpBuffer[256];
LV_ITEM lvi;
LV_COLUMN lvc, lvcprev ;
::ZeroMemory(&lvc, sizeof(lvc));
::ZeroMemory(&lvcprev, sizeof(lvcprev));
lvc.mask = LVCF_WIDTH | LVCF_FMT;
lvcprev.mask = LVCF_WIDTH | LVCF_FMT;
CDC* pDC;
pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rcClient1 = lpDrawItemStruct->rcItem;//得到某行的rect
rcClient1.left += m_nLeftMargin;
BOOL bDelFont = FALSE;
HFONT hSysFont = (HFONT)pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT));
for ( int nCol=0; GetColumn(nCol, &lvc); nCol++)
{
if ( nCol > 0 )
{
// Get Previous Column Width in order to move the next display item
GetColumn(nCol-1, &lvcprev) ;
lpDrawItemStruct->rcItem.left += lvcprev.cx ;
}
CRect rcItem;
if (!GetSubItemRect(lpDrawItemStruct->itemID,nCol,LVIR_LABEL,rcItem))
continue;
::ZeroMemory(&lvi, sizeof(lvi));//行号为itemID,列号为nCol,得到lpBuffer
lvi.iItem = lpDrawItemStruct->itemID;
lvi.mask = LVIF_TEXT | LVIF_PARAM;
lvi.iSubItem = nCol;
lvi.pszText = lpBuffer;
lvi.cchTextMax = sizeof(lpBuffer);
VERIFY(GetItem(&lvi));
CRect rcTemp;
rcTemp = rcItem;
if ( lpDrawItemStruct->itemState & ODS_SELECTED )
{
if (m_HasSelectedStatus)
{
pDC->FillSolidRect(&rcTemp, GetSysColor(COLOR_HIGHLIGHT)) ;
pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT)) ;
}
}
else
{
COLORREF color;
color = GetBkColor();
pDC->FillSolidRect(rcTemp,color);
}
UINT uFormat = DT_CENTER ;
if (m_Header.m_Format[nCol]=='0')
{
uFormat = DT_LEFT;
}
else if (m_Header.m_Format[nCol]=='1')
{
uFormat = DT_CENTER;
}
else if (m_Header.m_Format[nCol]=='2')
{
uFormat = DT_RIGHT;
}
TEXTMETRIC metric;
pDC->GetTextMetrics(&metric);
int ofst;
ofst = rcItem.Height() - metric.tmHeight;
rcItem.OffsetRect(0,ofst/2);//调整字体高度
rcItem.left = rcItem.left+2;//为了能舒服的看清首字符
pDC->SetTextColor(RGB(0,0,0));
CFont nFont ,* nOldFont;
if (m_nColLinkVec.size() > 0)
{
for (int index = 0;index < m_nColLinkVec.size();index++)
{
if (nCol == m_nColLinkVec[index])
{
nFont.CreateFont(m_fontHeight,m_fontWith,0,0,0,FALSE,TRUE,0,0,0,0,0,0,_T("宋体"));//创建字体
nOldFont = pDC->SelectObject(&nFont);
pDC->SetTextColor(RGB(0,0,255));
bDelFont = TRUE;
}
}
}
if (!m_HasSelectedStatus) //画标记图
{
if ( 2== nCol || 11 == nCol)
{
pDC->SetTextColor(RGB(0,0,255));
}
//画标记状态
Json::Value ItemJoinArray = m_RoomItemFlagsArr["ItemArray"];
if (ItemJoinArray.isArray()&& !ItemJoinArray.isNull())
{
int nItemCountSize = ItemJoinArray.size();
int index = 0;
for (int index