DELPHI高手请进,TLISTVIEW ONCUSTDRAWITEM的消息(在线等,答完即结帖)

tianxueshan 2006-05-23 03:08:17
本人这两天做了个透明背景的LISTVIEW,目的是可以自由的换取窗体背景图片,手工添加子项时,当窗体显示看不到其子项或者最大化窗体也看不到子项。当点击LISTVIEW 可以看到子项的图标(ONCUSTDRAWITEM里写了代码)是不是因为
在控件的
procedure TRichListview .CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
//Params.ExStyle := Params.ExStyle ;
with Params do
begin
{ 完全重画 }
Style := Style and not WS_CLIPCHILDREN;
Style := Style and not WS_CLIPSIBLINGS;
{ 增加透明 }
ExStyle := ExStyle or WS_EX_TRANSPARENT;
end;
end;


procedure TRichListview.WMNcPaint(var message: Tmessage);
var
Rect: TRect;
begin
Rect := ClientRect;
Rect.Left := Left;
Rect.Right := Left + Width;
Rect.Top := Top;
Rect.Bottom := Top + Height;
Canvas.CopyRect(ClientRect, self.Canvas, Rect);
sendmessage(handle,?????,0,0)?????????????????????????
end;
是不是因为没在此函数中添加重画子项的消息?

...全文
163 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianxueshan 2006-05-23
  • 打赏
  • 举报
回复
楼上的大侠厉害啊。一出手就解决了
xzhifei 2006-05-23
  • 打赏
  • 举报
回复
很简单,看代码你就知道了

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,commctrl, ComCtrls;

type
TForm1 = class(TForm)
ListView1: TListView;
StatusBar1: TStatusBar;
procedure ListView1CustomDraw(Sender: TCustomListView;
const ARect: TRect; var DefaultDraw: Boolean);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure lvWinproc(var message : TMessage);
private
{ Private declarations }
FOldwndProc: TWndMethod;
public
{ Public declarations }
end;

var
Form1: TForm1;
BKPicture: TBitMap;
implementation

{$R *.dfm}

procedure TForm1.ListView1CustomDraw(Sender: TCustomListView;
const ARect: TRect; var DefaultDraw: Boolean);
var
x, y: LongInt;
begin
x := Sender.ClientWidth - BKPicture.Width;
y := Sender.ClientHeight - BKPicture.Height;
Sender.Canvas.Draw(x, y, BKPicture);
SetBkMode(Sender.Canvas.Handle, TRANSPARENT);
ListView_SetTextBKColor(Sender.Handle, CLR_NONE);


end;

procedure TForm1.FormCreate(Sender: TObject);
begin
BKPicture := TBitMap.Create;
BKPicture.LoadFromFile('Clock.bmp');
// BKPicture.LoadFromFile('image\Holiday.bmp');
FOldwndProc := ListView1.WindowProc;
ListView1.WindowProc := lvwinproc;
ListView1.DoubleBuffered := True;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
BKPicture.Free;

end;

procedure TForm1.FormResize(Sender: TObject);
begin
ListView1.Invalidate;
end;

procedure TForm1.lvWinproc(var message: TMessage);
begin
case message.Msg of
WM_VSCROLL, WM_HSCROLL, WM_MOUSEWHEEL : ListView1.Invalidate;
end;
FOldwndProc(message);
end;

end.
zhuojohn 2006-05-23
  • 打赏
  • 举报
回复
应该拦截 WM_ERASEBKGND 消息吧??

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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