CListCtrl的有关问题啊大神门,带小弟我飞
CListCtrl的问题啊,大神门,带我飞啊
自绘了一个ListCtrl,基类是CListCtrl,正常情况下是这样的

行使价=1000是第一行
然后不知道怎么就出现了下面这种问题,第一行只能漏出一点点,但是滚动条已经到最顶上了,不能再往上滚动了

要用鼠标在那漏出的一点点上单击一下,第一行才能刷新出来

第一行刷新出来之后,表头与表格之间就出来一条缝隙,好大一条缝隙啊


然后将滚动条往下滚动,再滚到最顶时,第一行又只能漏一点点了

这是咋回事??????大神带我飞啊
代码:
发送重绘消息的函数
重绘函数(代码已简化,将那些设置颜色啥的代码都去掉了)
------解决思路----------------------
哎,这个现在可以不用重绘了,使用CMFCListCtrl类派生一下就搞定,你只需要管理数据就行了。比如
------解决思路----------------------
好象滚动的问题,你没改吧?
------解决思路----------------------
是不是 head 绘制问题 ?
------解决思路----------------------
把根据字体自动调整行高的代码发上来,也许是它的问题.
自绘了一个ListCtrl,基类是CListCtrl,正常情况下是这样的
行使价=1000是第一行
然后不知道怎么就出现了下面这种问题,第一行只能漏出一点点,但是滚动条已经到最顶上了,不能再往上滚动了
要用鼠标在那漏出的一点点上单击一下,第一行才能刷新出来
第一行刷新出来之后,表头与表格之间就出来一条缝隙,好大一条缝隙啊
然后将滚动条往下滚动,再滚到最顶时,第一行又只能漏一点点了
这是咋回事??????大神带我飞啊
代码:
发送重绘消息的函数
LRESULT ClistctrlOptions::OnMyRedrawItem( WPARAM item, LPARAM subitem ) //根据情况 发出重绘item 信号
{
if( item == 0xFFFFFFFE) // if item = -2, redraw whole list control 重绘整个list control
{
Invalidate(FALSE);
}
if( item==0xffffffff ) // item<0, mean redraw items[0,subitem] 重绘items[0,subitem]
{
RedrawItems( 0, subitem );
}
else
if( subitem==0xffffffff ) // subItem<0, mean Update item's all subitem. 重绘items[subitem,subitem]
{
RedrawItems( item, item );
}
else
{
if( subitem>=0 && subitem<MACRO_MaxSubItems )
{
int refrectsubitem = subitem ;
if( refrectsubitem>=0 )
{
CRect rect ;
if( GetSubItemRect( item, refrectsubitem, LVIR_LABEL, rect )==TRUE )
{
rect.left++ ;
rect.right-- ;
rect.top++ ;
rect.bottom-- ;
InvalidateRect( rect, FALSE ); // only update subitem, no need clear bgn.
}
}
}
}
return 0;
}
重绘函数(代码已简化,将那些设置颜色啥的代码都去掉了)
void ClistctrlOptions::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) //重绘函数
{
LPDRAWITEMSTRUCT lpDIS = lpDrawItemStruct;
int nItem=lpDIS->itemID; //将要重绘的行值
if(nItem == -1)
return ;
CRect rcCol = lpDIS->rcItem; //这行的位置
CString sText;
CDC* pDC=CDC::FromHandle(lpDIS->hDC);
int nOldDCMode=pDC->SaveDC();
LVITEM item;
item.iItem = nItem;
item.iSubItem = 0;
item.mask = LVIF_IMAGE|LVIF_STATE;
item.stateMask = 0XFFFF;
GetItem(&item);
ListView_SetExtendedListViewStyle(this->m_hWnd, this->GetStyle() & ~LVS_EX_GRIDLINES);//不显示网格线
LV_COLUMN lvc;
lvc.mask=LVCF_FMT|LVCF_WIDTH;
rcCol.right = rcCol.left;
for(int nCol=0; GetColumn(nCol,&lvc); nCol++)
{
rcCol.left = rcCol.right;
rcCol.right = rcCol.left + GetColumnWidth(nCol);
::Rectangle(lpDIS->hDC, rcCol.left-1, rcCol.top-1 , rcCol.right , rcCol.bottom );
pDC->DrawText(sText, -1, CRect::CRect(rcCol.left+3,rcCol.top,rcCol.right,rcCol.bottom-2), DT_RIGHT);
}
pDC->RestoreDC(nOldDCMode);
}
------解决思路----------------------
哎,这个现在可以不用重绘了,使用CMFCListCtrl类派生一下就搞定,你只需要管理数据就行了。比如
// CMyListCtrl
class CMyListCtrl : public CMFCListCtrl
{
DECLARE_DYNAMIC(CMyListCtrl)
public:
CMyListCtrl();
virtual ~CMyListCtrl();
protected:
DECLARE_MESSAGE_MAP()
/*通过虚函数可修改表的行、列的颜色和字体*/
virtual COLORREF OnGetCellBkColor(int nRow, int nColum); // 修改背景色
virtual COLORREF OnGetCellTextColor(int nRow, int nColum); // 修改文本色
virtual HFONT OnGetCellFont(int nRow, int nColum, DWORD dwData = 0); // 修改字体
// 排序处理
virtual int OnCompareItems(LPARAM lParam1, LPARAM lParam2, int iColumn);
private:
// 背景灰状态数组
------解决思路----------------------
好象滚动的问题,你没改吧?
------解决思路----------------------
是不是 head 绘制问题 ?
------解决思路----------------------
把根据字体自动调整行高的代码发上来,也许是它的问题.