TListView的背景颜色显示问题

sxqinge 2012-05-10 01:38:11
以前发表了个帖子,就是当每行里相邻两个单元格的差值如果不为1的话,就将后一个单元格的背景置为红色。下一行的第一个数与上一行的最后一个数比较如果差值不为1也被置为红色。
代码如下:

//
void __fastcall TfrmMain::lvList1AdvancedCustomDrawSubItem(
TCustomListView *Sender, TListItem *Item, int SubItem,
TCustomDrawState State, TCustomDrawStage Stage, bool &DefaultDraw)
{
SubItem -= 1;
static int temp = 0;
int data = Item->SubItems->Strings[SubItem].ToInt();
//m_Start表示重新读数时的BOOL标识。
if( m_Start ) {temp = data-1;m_Start[0]=false;}

Sender->Canvas->Brush->Color = clInfoBk;
int K0 = (int)(abs(data-temp)+0.5);
if( K0 != 1) Sender->Canvas->Brush->Color = clRed;
temp = data;
DefaultDraw = true;
}

现在的问题:
1.当开始读数时,背景颜色显示正常。但是当我把界面给最小化一下,然后在点开这个界面时,表格的第一个格子就被置为红色;另外当ListView当前可见的页面显示满了,然后再次新增一行,这样右边就会多个滚动条,此时新增的那行的第一个格子背景也会被置为红色。
2.再问个很菜鸟的问题。ListView的控件上,当数据是一行一行增加时,超出了可视的页面时就会出现垂直滚动条,这时我该怎么让控件的最底下一行(可见)为当前行内容呢?
本来想贴图上来,但是公司太变态,截图、复制都不能用。所以只好请热心朋友们凑合着看下了。谢谢。
...全文
142 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxqinge 2012-05-23
  • 打赏
  • 举报
回复
顶一下,问题还是没有解决,虽然目前没有影响,但是操作起来不方便。
sxqinge 2012-05-15
  • 打赏
  • 举报
回复
各路大侠帮忙指点迷津吧
mabaoyes 2012-05-11
  • 打赏
  • 举报
回复
没看懂程序。
if( m_Start ) {temp = data-1;m_Start[0]=false;}
m_Start 不为空总执行?
int K0 = (int)(abs(data-temp)+0.5);
那 K0 = 1.5 ?
总是红色了。
sxqinge 2012-05-11
  • 打赏
  • 举报
回复
很感谢mabaoyes(快马)的回答。
我那段程序是从工程里粘过来的,为了看得简单点就改了部分变量定义,这个m_Start[0]没有改过来,确实就是m_Start。
按你说的,每次界面一有改动时就将这个布尔变量置为true,这不是我的本意,不知道是否还有其他可行的办法呢?
mabaoyes 2012-05-11
  • 打赏
  • 举报
回复
void __fastcall TForm1::lvList1AdvancedCustomDrawSubItem(
TCustomListView *Sender, TListItem *Item, int SubItem,
TCustomDrawState State, TCustomDrawStage Stage, bool &DefaultDraw)
{
SubItem -= 1;
static int temp = 0;
int data = Item->SubItems->Strings[SubItem].ToInt();
//m_Start表示重新读数时的BOOL标识。
if( m_Start )
{
temp = data-1;
//m_Start[0]=false;
m_Start=false;
}

Sender->Canvas->Brush->Color = clInfoBk;
int K0 = (int)(abs(data-temp)+0.5);
Memo1->Lines->Add(IntToStr(data)+":"+IntToStr(SubItem)+" "+IntToStr(K0)); //调试信息
if( K0 != 1) Sender->Canvas->Brush->Color = clRed;
temp = data;
DefaultDraw = true;
}

测试数据
a b c(列头)
11 1 2
22 3 4
调试信息
1:0 1
1:0 0
2:1 1
2:1 0
3:0 1
3:0 0
4:1 1
4:1 0
以下是从最小窗口还原时
1:0 3
1:0 0
2:1 1
2:1 0
3:0 1
3:0 0
4:1 1
4:1 0
还原以前需要把 m_Start = true,这样 K0 = 1,不变红。
mabaoyes 2012-05-11
  • 打赏
  • 举报
回复
楼主
m_Start 是数组吗?不是的话,那m_Start[0] 是什么?
m_Start 值有改变吗?如果 m_Start = true ;则 temp = data-1; 最后 K0=1
sxqinge 2012-05-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
没看懂程序。
if( m_Start ) {temp = data-1;m_Start[0]=false;}
m_Start 不为空总执行?
int K0 = (int)(abs(data-temp)+0.5);
那 K0 = 1.5 ?
总是红色了。
[/Quote]
1.m_Start是个BOOL型变量,所以我不明白你说的为空是什么意思。我放这个标识的意思是希望每次开始测试时就给这个静态变量temp重新赋值;
2.K0应该不等于1.5吧,呵呵有兴趣的话可以查下强制转换的资料。这里表示只取整数部分而已。
CCED136 2012-05-10
  • 打赏
  • 举报
回复
先支持一下, 等空了过来看看

602

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧