相关疑难解决方法(0)

使用自定义绘图时,Delphi列表视图控件中是否存在错误?

QC#101189

我正在尝试TListView根据NGLN对另一个SO问题的答案在Delphi中自定义绘制进度条.除了使用Vista中引入的新资源管理器主题绘制时与热跟踪的交互之外,此工作正常.

热跟踪绘画和Delphi自定义绘图事件似乎互相干扰.例如,我看到的那种输出看起来像这样:

在此输入图像描述

第1列中的文字应为第3项,但已删除.它看起来像列表视图控件的Delphi包装中的一个错误,但同样可能是我做错了!

虽然我一直在XE2中开发这个,但是在2010年也发生了同样的行为,大概是XE.

这是重现此行为的代码:

Pascal文件

unit Unit1;

interface

uses
  Windows, Classes, Controls, Forms, CommCtrl, ComCtrls;

type
  TForm1 = class(TForm)
    ListView: TListView;
    procedure FormCreate(Sender: TObject);
    procedure ListViewCustomDrawSubItem(Sender: TCustomListView;
      Item: TListItem; SubItem: Integer; State: TCustomDrawState;
      var DefaultDraw: Boolean);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  ListView.RowSelect := True;
  ListView.Items.Add.Caption := 'Item 1';
  ListView.Items.Add.Caption := 'Item 2';
  ListView.Items.Add.Caption := 'Item 3';
end;

procedure TForm1.ListViewCustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe2

14
推荐指数
1
解决办法
4148
查看次数

如何处理WM_ERASEBKGND以避免闪烁?

我在表单上有一些自定义进度条,每秒更新/刷新两次,它们闪烁.

TMyProgressBar = class(TCustomControl)
Run Code Online (Sandbox Code Playgroud)

我继承了控件TCustomControl,因为我需要Handle和一些TWinControl事件.控件(最多64个项目)是动态创建的,并放在ScrollBox上.当进度更新时,我先打电话InvalidateRect.

所有的绘画工作(一组矩形,DrawText等等 - 从这里启发)都在存储器DC中执行,然后BitBlt在控制器的DC上执行.它无论如何都在闪烁,似乎组件消失并重新出现.恕我直言,它是由背景擦除引起的.

这个无闪烁的绘图建议中,它是WM_ERASEBKGND按以下方式编写的:

type
  TMyProgressBar = class(TCustomControl)
    procedure WMEraseBkGnd(var Message:TMessage); message WM_ERASEBKGND;

procedure TMyProgressBar.WMEraseBkGnd(var Message: TMessage);
begin
  Message.Result := 1;
end;
Run Code Online (Sandbox Code Playgroud)

但是在另一个组件中,通过TMS(TAdvProgressBar),Result设置0为相同的消息.

现在Windows文档说明:

如果应用程序删除背景,则应返回非零值; 否则,它应该返回零.

我测试了两种变体(结果= 0,1),令我惊讶的是都避免了闪烁.

那么现在,我需要在Delphi代码中加入什么?什么是正确的方法?

delphi winapi gdi flicker delphi-7

9
推荐指数
1
解决办法
7082
查看次数

将图形栏添加到StringGrid col

使用Delphi 2010和TStringGrid组件,我目前显示数据库查询中的五个fild.

这是我正在做的一个简单的例子

//设置网格

procedure TGriddata.FormCreate(Sender: TObject);
begin
 grdMain.Rows[0].commatext:='"One","Two","Three","Four","Five"';
 grdMain.ColWidths[0]:= 50;
 grdMain.ColWidths[1]:= 175;
 grdMain.ColWidths[2]:= 175;
 grdMain.ColWidths[3]:= 100;
 grdMain.ColWidths[4]:= 300;
end;
Run Code Online (Sandbox Code Playgroud)

//显示网格中的数据//注意,我没有显示查询的创建,执行或销毁

procedure TGriddata.load;
begin
 ... 
 grdMain.Cells[0,row]:= FieldByName('one').AsString;
 grdMain.Cells[1,row]:= FieldByName('two').AsString;
 grdMain.Cells[2,row]:= FieldByName('three').AsString;
 grdMain.Cells[3,row]:= FieldByName('four').AsString;
 //draw progress bar here
 ...
end;
Run Code Online (Sandbox Code Playgroud)

其中一列("五")需要在col中显示海军蓝色水平条.它还应该显示一些以栏为中心的文本.我没有使用自定义绘图的经验.我设置的哪些属性只能自定义绘制一列并使用其他列的默认绘图?

delphi custom-draw delphi-2010 stringgrid

6
推荐指数
1
解决办法
4007
查看次数