小弟是一新学d6的菜鸟,希望各位大虾多多指教,如何在statusbar的panel加载图片或画图,再线等,急急

解决方案 »

  1.   

    StatusBar的纯文本显示非常简单,而且市面上的各种Delphi书籍均有介绍,在此不多谈,以免有骗人之嫌,下面我将详细讨论一下在TstatusBar上显示图片和其它控件的方法。首先要纠正一种流行的错误,几乎所有的Delphi书籍和网站上资料都告诉我们,要想在TstatusBar上显示除文本以外的信息,必须将Panel(窗格)的Style设为psOwnerDraw,否则无法向StatusBar输出任何非文本的信息。而实际上,我通过试验,发现这种说法是不对的,即使是将Panel的Style设为psText,仍然可以在StatusBar上输出图片和其它控件。下面举一个简单的例子,该范例将在一个Panel的Style为psOwnerDrawr的StatusBar上输出一个进度条和一个图像,
     代码如下:unit Unit1;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ComCtrls, StdCtrls;typeTForm1 = class(TForm)StatusBar1: TStatusBar;Button1: TButton;Button2: TButton;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.DFM}varaProgressBar:TProgressBar;procedure TForm1.Button1Click(Sender: TObject);beginif aProgressbar<>Nil then exit; //防止重复创建aProgressBar:=TProgressBar.Create(Self);with aProgressBar dobeginParent:=StatusBar1;//必须有这条语句才能使ProgressBar输出在//StatusBar上Min:=0;Max:=100;Height:=StatusBar1.Height;Width:=StatusBar1.Width;Left:=0;Top:=0;Position:=20;end;end;procedure TForm1.Button2Click(Sender: TObject);varaIcon:TIcon;beginif aProgressBar<>Nil then //删除ProgressBarbeginaProgressBar.free;aProgressBar:=Nil;end;StatusBar1.Refresh; //重新刷新StatusBar,否则第一次无法正常显示aIcon:=TIcon.Create;tryaIcon.Handle:=LoadIcon(hInstance,'MainIcon'); //从程序中装入Iconif aIcon.Handle<>Null thenbeginStatusBar1.Canvas.Draw(0,0,aIcon); //将Icon画到StatusBar上end;finallyaIcon.Free; //记得要将它释放噢!end;end;end.执行以上程序后可看到分别在状态栏上输出了控件和图像。但是要注意,此方法无法在窗体建立时就输出图形,因为在窗体Create时Draw是无效的,因此碰到这种情况时还是必须将Panel的Style设为 psOwnerDraw,然后在StatusBar的onDrawPanel事件中输入代码。注意,如果Panel的Style 设为psText,即使在onDrawPanel中输入代码,也不会执行。代码如下:procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;Panel: TStatusPanel; const Rect: TRect);VaraIcon:Ticon;beginaIcon:=TIcon.Create;tryaIcon.Handle:=LoadIcon(hInstance,'MainIcon');if aIcon.Handle<>Null thenbeginStatusBar.Canvas.Draw(Rect.Left,Rect.Top,aIcon);//注意这是StatusBar,而不用写StatusBar1,当然即使是写StatusBar1也//不会出错;Draw的参数也由0,0改为Rect.Left,Rect.Top,这样更方便输//出图像的定位。end;finallyaIcon.Free;end;end;下面再讨论一下多个Panel的Style设psOwnerDraw的情况。仔细观察一下onDrawPanel事件的定义:procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;Panel: TStatusPanel; const Rect: TRect);在参数中有一个Panel参数,该参数决定当前要画的Panel,虽然Delphi无法告诉你当前要画的Panel到底是哪个,但我们可以通过其它方法自己判断,方法之一是,Panel有一个Text属性,当Style设为psOwnerDraw时,虽然它不能显示出来,但仍然存在,可以通过设置不同的Text来判断当前是哪一个Panel;另一个方法是用“if Panel=StatusBar.Panels[1] then”语句来判断。程序范例如下:首先定义两个全局变量:var Rect1,Rect2:Trect;这两个变量的用处等一下再解释。procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;Panel: TStatusPanel; const Rect: TRect);varaBitmap:TBitmap;beginaBitmap:=TBitmap.Create;tryif Panel=StatusBar.Panels[1] then //如果是第一个PanelbeginRect1:=Rect;aBitmap.LoadFromFile('dog1.bmp') //则装入‘dog1.bmp’;endelsebeginRect2:=Rect;aBitmap.LoadFromFile('dog2.bmp'); //否则装入‘dog2.bmp’end;{也可以使用如下语句:if Panel.Text=’No1’ thenaBitmap.LoadFromFile(‘dog1.bmp’)elseaBitmap.LoadFromFile(‘dog2.bmp’);}StatusBar.Canvas.Draw(Rect.Left,Rect.Top,aBitmap);finallyaBitmap.Free;end;end;
    如果在程序中想动态在StatusBar上画图,那么就可用到Rect1,Rect2这两个变量了。
      

  2.   

    1、学习楼上;
    2、panel中加载图片用image就可以了吗;操作要简单些;
      

  3.   

    简单的方法用1st4000组件中的statusbar控件,非常好用!