如何实现XP界面(不用控件)up者有分(200分)

  • 主题发起人 主题发起人 san_fish
  • 开始时间 开始时间
Perseus同志说的很好。

楼主:
“怎么会不可能??我就见过在Win2000下用VC做过的XP界面
只是我VC不熟,对里面的机制都不理解,好像跟chatopsoft说的差不多
只是没这么简单,好像还要加一些配置文件之类的东西
我就不信用VC能实现的东西用delphi没办法”

唉,那个在Win2000下用VC做过的XP界面就像Perseus同志所说的:
“全都是模仿的XP显示界面,这种界面并不是由XP来处理的。”

其实一般都是用一些图片堆积而成的,当然你可以写代码来处理,不过现在的第三方
控件功能好的多,也容易使用而已。

 
网上流传的 NeoForm 代码就是使用使用 TImage 拼凑而成的,你可以搜索一下
如果你真要自己写的话


 
我当然知道Win2000下做XP界面是模仿WinXp
我也知道使用一大堆的Image覆盖
前面我也提过:

<<我尝试过做XP的窗体,但是没办法改变窗体的大小的,
<<一放大那Image里面的bmp就变模糊了

<<还有比如菜单,用image覆盖的话,我怎么知道它弹出的具体位置等等很多问题
<<也就因为一箩筐的问题现在才提出请教的”

那我现在不说那么多,
我就单单问怎么用Image(假设我已经我XP图片的素材)将我的菜单覆盖???
我只知道要用到一些底层的函数,但究竟用什么、怎么用呢??
 
与其费力地自己开发一套界面程序,不如使用现成的第三方控件,如果真的要自己实现的话,
一定要考虑是否做为一个产品发布
 
直接写代码 自己draw...
不过很麻烦,
 
谢谢大家的讨论

其实是这样的,这是老师布置的一个项目来的
我负责界面部分,既然将界面分出来让我一个人单独写,我想让界面能给人耳目一新的感觉
因为老师要看源码的编译运行的,所以不能自己写成控件更不能找控件安装了
我知道有很多这方面的界面控件,并且我机子上都有不少
但现在只能望“控件”而兴叹了

因此还请DFW们指点
 
看看XPMENU的源码,是不是对你有点帮助?
 
预练次功必先自宫,
即使自宫未必成功,
若不自宫也可成功。
哈哈.............
http://www.3rcn.com
论坛从现在开始允许注册用户发贴子了.
http://www.3rcn.com/guest/index.asp
是中国人你就看看看看!!!
印尼如此对待华人,强烈建议中国政府出兵印尼,实行军事占领.
http://tf.xiloo.com/kan.htm

最简单的方法就是你会做图就好了.
 
Perseus同志说的很好。

楼主:
“怎么会不可能??我就见过在Win2000下用VC做过的XP界面
只是我VC不熟,对里面的机制都不理解,好像跟chatopsoft说的差不多
只是没这么简单,好像还要加一些配置文件之类的东西
我就不信用VC能实现的东西用delphi没办法”

唉,那个在Win2000下用VC做过的XP界面就像Perseus同志所说的:
“全都是模仿的XP显示界面,这种界面并不是由XP来处理的。”

其实一般都是用一些图片堆积而成的,当然你可以写代码来处理,不过现在的第三方
控件功能好的多,也容易使用而已。
 
只知道在VC是从菜单类中继承下来一个类然后自己再在上面画图的
但不知道delphi应该怎么做??
也是继承??
 
看来我只能up,要分了!
 
呵呵,有up就很感谢你了
 
留下mail,发个例子给你
 
yu4134@163.net
thx!!!!!
 
这是一个PAS文件,在程序中USES 就行了
///////////////////////////////////////////////////////////////////////
// //
// SoftSpot Software Component Library //
// //
// Copyright (c) 1996 - 2002 SoftSpot Software Ltd. //
// ALL RIGHTS RESERVED //
// //
// The entire contents of this file is protected by U.S. and //
// International Copyright Laws. Unauthorized reproduction, //
// reverse-engineering, and distribution of all or any portion of //
// the code contained in this file is strictly prohibited and may //
// result in severe civil and criminal penalties and will be //
// prosecuted to the maximum extent possible under the law. //
// //
// RESTRICTIONS //
// //
// THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED //
// FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE //
// COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE //
// AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT //
// AND PERMISSION FROM SOFTSPOT SOFTWARE LTD. //
// //
// CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON //
// ADDITIONAL RESTRICTIONS. //
// //
///////////////////////////////////////////////////////////////////////

unit ajAlterMenu;

{ -=< Alter Menu Appearance >=-
{
{ Copyright SoftSpot Software 2002 - All Rights Reserved
{
{ Author : Andrew J Jameson
{
{ Web site : www.softspotsoftware.com
{ e-mail : contact@softspotsoftware.com
{
{ Creation Date : 10 March 2002
{
{ Version : 1.00
{
{ Description : Alters the menu appearance to look more like XP - cool ! }

interface

uses
Windows, Graphics, Controls;

type
TajAlterMenu = class(TObject) // The AlterMenu component.
private
fOwner : TWinControl;
fEnabled : boolean;
protected
procedure SetfEnabled (Value : boolean);
procedure DrawMenuItem (Sender : TObject; ACanvas : TCanvas; ARect : TRect; State : TOwnerDrawState);
public
constructor Create (AOwner : TWinControl);
procedure ConnectDrawItemEventHandlers;
property Enabled : boolean read fEnabled write SetfEnabled;
end;

implementation

uses
Menus, Classes;

{--------------------------------------------------------------------------------------------------}

constructor TajAlterMenu.Create(AOwner : TWinControl);
begin
fOwner := AOwner;
fEnabled := false;
Enabled := true;
end; {constructor}

{--------------------------------------------------------------------------------------------------}

procedure TajAlterMenu.SetfEnabled(Value : boolean);
var
lp1, lp2 : integer;
begin
if (fEnabled <> Value) then begin

fEnabled := Value;

with fOwner do begin

ConnectDrawItemEventHandlers;

for lp1 := 0 to pred(ComponentCount) do begin // Scan for all TMenus and
// set OwnerDraw as appropriate.
if (Components[lp1] is TMenu) then
TMenu(Components[lp1]).OwnerDraw := fEnabled;

if (Components[lp1] is TMainMenu) then begin // This is a kludge but need to
with TMainMenu(Components[lp1]) do begin // get the main menu items to
for lp2 := 0 to pred(Items.Count) do begin // redraw themselves.
if Items[lp2].Visible then begin // (There must be a better way !)
Items[lp2].Visible := false;
Items[lp2].Visible := true;
end; {if}
end; {for}
end; {with}
end; {if}

end; {for}

end; {with}

end; {if}

end; {SetfEnabled}

{--------------------------------------------------------------------------------------------------}

procedure TajAlterMenu.ConnectDrawItemEventHandlers;

{................................................................................................}
procedure Connect(MenuItem : TMenuItem);
var
lp1 : integer;
begin
if fEnabled then // If we're allowed to then
MenuItem.OnAdvancedDrawItem := DrawMenuItem // connect our draw routine
else // otherwise ...
MenuItem.OnAdvancedDrawItem := nil; // just set me back to nil.
for lp1 := 0 to pred(MenuItem.Count) do // Recursively check our children too.
Connect(MenuItem.Items[lp1]);
end; {Connect}
{................................................................................................}

var
lp1, lp2 : integer;
Menu : TMenu;
begin
with fOwner do begin
for lp1 := 0 to pred(ComponentCount) do begin // Scan for all TMenuItems and
if (Components[lp1] is TMenu) then begin // connect their OnDrawItem event
Menu := TMenu(Components[lp1]);
for lp2 := 0 to pred(Menu.Items.Count) do
Connect(Menu.Items[lp2]);
end; {if}
end; {for}
end; {with}
end; {ConnectDrawItemHandlers}

{--------------------------------------------------------------------------------------------------}

procedure TajAlterMenu.DrawMenuItem(Sender : TObject; ACanvas : TCanvas; ARect : TRect; State : TOwnerDrawState);
var
Text : string;
Bitmap : TBitmap;
IconRect : TRect;
TextRect : TRect;
BackColor : TColor;
IconBackColor : TColor;
SelectedBkColor : TColor;
FontColor : TColor;
SelectedFontColor : TColor;
DisabledFontColor : TColor;
SeparatorColor : TColor;
CheckedColor : TColor;
lp1 : integer;
X1, X2 : integer;
TextFormat : integer;
MenuItem : TMenuItem;
Menu : TMenu;
begin
MenuItem := TMenuItem(Sender);
Menu := MenuItem.Parent.GetParentMenu;
BackColor := $00E1E1E1;
IconBackColor := $00D1D1D1;
SelectedBkColor := $00DCCFC7;
FontColor := clBlack;
SelectedFontColor := clNavy;
DisabledFontColor := clGray;
SeparatorColor := $00D1D1D1;
CheckedColor := clGray;

if Menu.IsRightToLeft then begin
X1 := aRect.Right - 20;
X2 := aRect.Right;
end else begin
X1 := aRect.Left;
X2 := aRect.Left + 20;
end; {if}

IconRect := Rect(X1, aRect.Top, X2, aRect.Bottom);

TextRect := aRect;
Text := ' ' + MenuItem.Caption;

Bitmap := TBitmap.Create;
Bitmap.Transparent := true;

if (MenuItem.Parent.GetParentMenu.Images <> nil) or
(MenuItem.Parent.SubMenuImages <> nil) then begin
if (MenuItem.ImageIndex <> -1) then begin
if (MenuItem.Parent.SubMenuImages <> nil) then
MenuItem.Parent.SubMenuImages.GetBitmap(MenuItem.ImageIndex, Bitmap)
else
MenuItem.Parent.GetParentMenu.Images.GetBitmap(MenuItem.ImageIndex, Bitmap)
end else
// if (MenuItem.Bitmap.Width > 0) then
// Bitmap.Assign(MenuItem.Bitmap);
end;{if}

if Menu.IsRightToLeft then begin
X1 := aRect.Left;
X2 := aRect.Right - 20;
end else begin
X1 := aRect.Left + 20;
X2 := aRect.Right;
end; {if}

TextRect := Rect(X1, aRect.Top, X2, aRect.Bottom);

aCanvas.Brush.Color := BackColor;
aCanvas.FillRect(TextRect);

if (Menu is TMainMenu) then begin
for lp1 := 0 to pred(MenuItem.GetParentMenu.Items.Count) do begin
if (MenuItem.GetParentMenu.Items[lp1] = MenuItem) then begin
aCanvas.Brush.Color := IconBackColor;
aCanvas.FillRect(aRect);
if (MenuItem.ImageIndex = -1) and (MenuItem.Bitmap.Width = 0) then begin
TextRect := aRect;
Break;
end; {if}
end; {if}
end; {for}
end; {if}

aCanvas.Brush.Color := IconBackColor;
aCanvas.FillRect(IconRect);

if MenuItem.Enabled then
aCanvas.Font.Color := FontColor
else
aCanvas.Font.Color := DisabledFontColor;

if (odSelected in State) or (odHotLight in State) then begin
aCanvas.Brush.Style := bsSolid;
aCanvas.Brush.Color := SelectedBkColor;
aCanvas.FillRect(TextRect);
aCanvas.Pen.Color := SelectedFontColor;
aCanvas.Brush.Style := bsClear;
aCanvas.RoundRect(TextRect.Left, TextRect.Top, TextRect.Right, TextRect.Bottom, 6, 6);
if MenuItem.Enabled then
aCanvas.Font.Color := SelectedFontColor;
end; {if}

X1 := IconRect.Left + 2;

if (Bitmap <> nil) then
aCanvas.Draw(X1, succ(IconRect.Top), Bitmap);

if MenuItem.Checked then begin
aCanvas.Pen.Color := CheckedColor;
aCanvas.Brush.Style := bsClear;
aCanvas.RoundRect(IconRect.Left, IconRect.Top, IconRect.Right, IconRect.Bottom, 3, 3);
end; {if}

if not MenuItem.IsLine then begin
SetBkMode(aCanvas.Handle, TRANSPARENT);
aCanvas.Font.Name := 'Tahoma';
if Menu.IsRightToLeft then
aCanvas.Font.Charset := ARABIC_CHARSET;
if Menu.IsRightToLeft then
TextFormat := DT_RIGHT + DT_RTLREADING
else
TextFormat := 0;

if MenuItem.Default then begin
inc(TextRect.Left, 1);
inc(TextRect.Right, 1);
inc(TextRect.Top, 1);
aCanvas.Font.Color := clGray;
DrawTextEx(aCanvas.Handle, PChar(Text), Length(Text), TextRect, TextFormat, nil);
dec(TextRect.Left, 1);
dec(TextRect.Right, 1);
dec(TextRect.Top, 1);
aCanvas.Font.color := FontColor;
end; {if}

inc(TextRect.Left, 2);
inc(TextRect.Top, 2);

DrawTextEx(aCanvas.Handle, PChar(Text), Length(Text), TextRect, TextFormat, nil);
Text := ShortCutToText(MenuItem.ShortCut) + ' ';

if Menu.IsRightToLeft then
TextFormat := DT_LEFT
else
TextFormat := DT_RIGHT;

DrawTextEx(aCanvas.Handle, PChar(Text), Length(Text), TextRect, TextFormat, nil);

end else begin

aCanvas.Pen.Color := SeparatorColor;
aCanvas.MoveTo(ARect.Left + 10, TextRect.Top + Round((TextRect.Bottom - TextRect.Top) / 2));
aCanvas.LineTo(ARect.Right - 2, TextRect.Top + Round((TextRect.Bottom - TextRect.Top) / 2))

end; {if}

Bitmap.Free;

end; {DrawMenuItem}

{--------------------------------------------------------------------------------------------------}
{ajAlterMenu}
end.

 
delphi7.0可以实现部分XP效果,如菜单,工具条等。
 
Delphi7有一个自带的例子,在../Demos/ActionBands/WorldPad.dpr,就是XP风格
 
樓主普渡眾生了,
心胸之寬廣,自歎不如!
(不臭屁了,拿分先!)
up !
 

Similar threads

D
回复
0
查看
955
DelphiTeacher的专栏
D
D
回复
0
查看
892
DelphiTeacher的专栏
D
D
回复
0
查看
796
DelphiTeacher的专栏
D
D
回复
0
查看
970
DelphiTeacher的专栏
D
后退
顶部