关于软件界面的问题(100分)

  • 主题发起人 主题发起人 hygsxy
  • 开始时间 开始时间
H

hygsxy

Unregistered / Unconfirmed
GUEST, unregistred user!
1,我有时候用WIN98 登陆大富翁时,经常出现建立automation对象失败,不能登陆大富翁论坛,请问原因?而在WINXP下却可以。
2,如何建立这样一个界面:
当鼠标移到Tspeedbutton控件时,该控件表面变颜色,变成黄的,或粉红色,当鼠标移走后,又变回原来的颜色。相必大家用过WINDOWS优化大师这个软件吧,他的按钮就是这种效果。现在这个软件界面很流行。
我的解决方法是:用Timage和Tspeedbutton两个控件来实现.即他们的width,height要一样大,并且叠在一快,开始时先让Timage加载一幅图象,当鼠标移到TSPEEDBUTTON控件上后,触发Tspeedbutton控件的MOUSEMOVE事件,让Timage控件再加载另外一幅图,这样是可以变化,但当鼠标从Tspeedbutton控件移开后,如何变回原来的图象?注意:不可用窗体的mousemove事件,因为当我们在该事件中编写加载先前图象的代码时,当这种特色的按纽太多时,窗体上的Tspeedbutton控件会闪烁.因为在执行窗体的mousemove的事件时,会把所有Tspeedbutton的相关代码执行一遍.
谁有高招,可望指点一翻.
 
我的看法:
你完全可以放弃Tspeedbutton,自己写个控件,或者到网上找找其它控件,
其实用Tspeedbutton来实现反而更难。
关键两点:

TmyButton = class(TGraphicControl) 继承于TGraphicControl

1. 加上 Cm_mouseEnter, cm_mouseLeave 消息响应鼠标的移入移出
2. override Paint; 根据鼠标的位置改变颜色

怎么样,是不是很简单?
 
1。不怎么清楚
2。你知道WINDOWS优化大师吗,它其实用了一个很流行的控件,你可以从以下地址下载
http://www.torry.net/vcl/packs/interfacemiddle/flatstyl.zip
源码是公开的,你可以研究。
如果要自己解决如果不想写控件的话最容易的就放了 Label 在上面,然后 mouseout 就切换
 
一个控件,可以实现你要求的功能,源代码如下
unit PicButton;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, ExtCtrls,Graphics;

type
TPicButton = class(TCustomPanel)
private
{ Private declarations }
FPicture:TPicture;
FPicNormalStatus: TPicture;
FPicMouseEnterStatus: TPicture;
FMouseEnter:Boolean;
FPicDisableStatus: TPicture;
FPicDownedStatus: TPicture;

procedure PictureChanged(Sender:TObject);
procedure SetPicMouseEnterStatus(const Value: TPicture);
procedure SetPicNormalStatus(const Value: TPicture);
procedure CMMouseEnter(var msg:TMessage);message CM_MOUSEENTER;
procedure CMMouseLeave(var msg:TMessage);message CM_MOUSELEAVE;
procedure SetPicDisableStatus(const Value: TPicture);
procedure SetPicDownedStatus(const Value: TPicture);


protected
{ Protected declarations }
procedure Paint();override;
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
property PicNormalStatus:TPicture read FPicNormalStatus write SetPicNormalStatus;
property PicMouseEnterStatus:TPicture read FPicMouseEnterStatus write SetPicMouseEnterStatus;
property PicDisableStatus:TPicture read FPicDisableStatus write SetPicDisableStatus;
property PicDownedStatus:TPicture read FPicDownedStatus write SetPicDownedStatus;
property Action;
property OnClick;
property TabOrder;
property Enabled;

end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('OpenLabUse', [TPicButton]);
end;

{ TPicButton }

procedure TPicButton.CMMouseEnter(var msg: TMessage);
begin
FMouseEnter:=true;
Repaint();
Cursor:=crHandPoint;
end;

procedure TPicButton.CMMouseLeave(var msg: TMessage);
begin
FMouseEnter:=false;
Repaint();
Cursor:=crDefault;
end;

constructor TPicButton.Create(AOwner: TComponent);
begin
inherited;
FPicture:=TPicture.Create;
FPicNormalStatus:=TPicture.Create;
FPicMouseEnterStatus:=TPicture.Create;
FPicDownedStatus:=TPicture.Create;
FPicDisableStatus:=TPicture.Create;
Caption:='';
Repaint();

end;

destructor TPicButton.Destroy;
begin
{
FPicNormalStatus.Free;
FPicMouseEnterStatus.Free;
FPicNormalStatus:=nil;
FPicMouseEnterStatus:=nil;
FPicture.Free;
FPicture:=nil; }
FreeAndNil(FPicMouseEnterStatus);
FreeAndNil(FPicNormalStatus);
FreeAndNil(FPicture);
FreeAndNil(FPicDisableStatus);
FreeAndNil(FPicDownedStatus);

inherited;
end;

procedure TPicButton.Paint;
var
tempPic:TPicture;
begin
if Enabled=false then
begin
if assigned(FPicDisableStatus.Graphic) then
tempPic:=FPicDisableStatus
else
tempPic:=FPicNormalStatus;
end
else
begin

if FMouseEnter then
begin
tempPic:=FPicMouseEnterStatus;
end
else
begin
tempPic:=FPicNormalStatus;
end;
end;
if Assigned(tempPic.Graphic) then
begin
Width:=tempPic.Width;
Height:=tempPic.Height;
Canvas.StretchDraw(ClientRect,tempPic.Graphic);
end
else
begin
Canvas.Brush.Color:=Color;
Canvas.FillRect(ClientRect);
end;


end;

procedure TPicButton.PictureChanged(Sender: TObject);
begin
Repaint();
end;

procedure TPicButton.SetPicDisableStatus(const Value: TPicture);
begin
FPicDisableStatus.Assign(Value);
end;

procedure TPicButton.SetPicDownedStatus(const Value: TPicture);
begin
FPicDownedStatus.Assign(Value);
end;



procedure TPicButton.SetPicMouseEnterStatus(const Value: TPicture);
begin
//FPicMouseEnterStatus := Value;
FPicMouseEnterStatus.Assign(value);
end;

procedure TPicButton.SetPicNormalStatus(const Value: TPicture);
begin
FPicNormalStatus.Assign(Value);
//FMousePicNormalStatus.Assign(value);
//FM
end;

end.
 
wodelove:
你提供的这种方法,按纽没有凸凹效果,只是很平滑的效果.如何让他进出有凸凹效果呢?
 
:幕后黑手,
我安装了一个组件TFlatSpeedButtonunit怎么不行啊。
 
xuxiaohan:
完整的组件代码.
 
幕后黑手:
如果要自己解决如果不想写控件的话最容易的就放了 Label 在上面,然后 mouseout 就切换
------------------------------------------------------------------------------------
你的这种方法也不好.
 
第一个问题msxml3.0装了否?
 
第一个问题msxml3.0装了否?
----------------------------------------------------------------------------------这是什么东西啊?
 
在Delphi的Controls单元中,修改TWinControl,增加两个消息处理函数,两个事件处理函数,两个属性,重新编译,以后所有继承自该类的VCL控件就都有处理这两个事件的能力了。不知为何DELPHI未将这两个重要的事件加至该类???:

.......
private
FOnMouseEnter: TNotifyEvent;
FOnMouseLeave: TNotifyEvent;
procedure DoMouseEnter(Sender: TObject);
procedure DoMouseLeave(Sender: TObject);
.............
protected
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
........
published
property OnMouseEnter:TNotifyEvent read FOnMouseEnter write FOnMouseEnter
..........
end;
procedure TWinControl.DoMouseEnter(Sender: TObject);
begin
if Assigned(FOnMouseEnter) and (not(csDesign in ComponentState))
then FOnMouseEnter(Sender);
end;
。。。。。。。。。
 
修改Twincontrol类风险太大,而且我们最好要保持DELPHI内在的完整.作好派生它.
 
:幕后黑手
--------------------------------------------------------------------------------------多谢你提供的载
http://www.torry.net/vcl/packs/interfacemiddle/flatstyl.zip下载地址,现在我安装后,这些控件产生的效果跟优化大师一样.
 
多人接受答案了。
 
后退
顶部