如何实现Media Player右边那样的播放列表?(50分)

  • 主题发起人 主题发起人 txwz
  • 开始时间 开始时间
T

txwz

Unregistered / Unconfirmed
GUEST, unregistred user!
如何实现Media Player右边那样的可以同时让正在播放的歌曲和目前选种的歌曲同时高亮显示,并且使用不同颜色高亮显示?
我的方法如下,但是有问题:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
procedure pant;
procedure WMPAINT(var Msg: TWMPAINT); message WM_PAINT;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.pant;
var
rect:trect;
begin
rect.Left:=0;
rect.Top:=0;
rect.Right:=listbox1.Width;
rect.Bottom:=listbox1.ItemHeight;
listbox1.Canvas.Brush.Color:=clred;
listbox1.Canvas.Font.Color:=clyellow;
listbox1.Canvas.FillRect(rect);
listbox1.Canvas.TextOut(0,0,listbox1.Items.Strings[0]);
end;

procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
pant;
end;

procedure TForm1.WMPAINT(var Msg: TWMPAINT);
begin
inherited;
pant;
end;

end.
我吧主窗体的WMPAINT消息重写了,但是问题也来了。当窗体最小化的再显示出来的时候就不能让它在高亮显示了,好象是在我画完了之后,系统又画了一边,把我画出来的给覆盖掉了。想请教高手以下几个问题。
1。每次在我画完了之后,系统又做了些什么操作而使我的效果消失?
2。我本来想是重写TListBox的WMPAINT消息,可是它不能用主窗体重写WMPAINT的方法来重写他,应该如何实现这个要求呢?
3。如果我的方法根本不行,请大家赐教一个可行的方法。


谢过了。
 
窗口变化,也要重新使用paint消息,否则效果就消失。
 
为什么要窗体上来重写,在listbox自身上重定不就得了
 
var
bit:tbitmap;
fileinfo:array[0..2,1..2]=(
('图片一','file1.bmp'),('图片二','file2.bmp'),('图片三','file3.bmp'));

procedure tform1.form1create(sender:tobject);
begin
bit:=tbitmap.create;
end;
procedure tform1.form1destory(sender:tobject);
begin
bit.free;
end;
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
with ListBox1.Canvas do
begin
FillRect(Rect);
bit.loadfromfile(fileinfo[index,2]);
draw(rect.left+1,rect.top+1,bit);
TextOut(Rect.Left+bit.width+2, Rect.Top+1, fileinfo[index,1]);
end;
end;

procedure TForm1.ListBox1MeasureItem(Control: TWinControl; Index: Integer;
var Height: Integer);
begin
height:=50;//图象高度
end;

参详参详!至于要保持状态,你还需要加状态来标记,以便窗口重绘时用
 
谢谢,再请教一下,用我的方法是,在屏幕上移动窗体时,所画出的东西不会消失,为什么当最小化在最大化时就不行了呢?难道系统在这两种不同的情况下使用了两种不同的重绘方法吗?
 
后退
顶部