首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

贴图方法进行软件界面设计的疑问?解决方法

2012-03-09 
贴图方法进行软件界面设计的疑问?不用第三方皮肤控件,单用贴图片的方法来构造软件界面,遇到几个问题,解决

贴图方法进行软件界面设计的疑问?
不用第三方皮肤控件,单用贴图片的方法来构造软件界面,遇到几个问题,解决不了,请教高手解答。
先将Form1的borderstyle设为none,然后进行贴图,问题来了:

1、边框用画有圆角的图片来实现,而图片放在panel中,但panel的角是直角,那如何实现圆角?类似qq2008的圆角界面。
2、将边框去掉以后,如何实现窗体拉伸功能?
3、网上有没有做得比较好看一点的界面例程?最好是模仿vista风格的,满世界找都没找到。请提供线索。

当然,不能使用第三方皮肤控件。
很急!感谢!

[解决办法]
将窗体设置成透明的(属性alphablend以及alphablendvalue),然后赋予底图,这样看上去好像就是异形窗体了
当然也是可以通过代码来实现异形窗体的
[解决办法]
只要不是异形窗体,很简单的,使用一个带有透明度调节的panel即可
。 

[解决办法]
靠,无视我的存在啊????

本来回顾一下,看问题是否结了,如果没结,那我继续给你找DX组件方面的资料。

现在没心思了,你自己去找吧
[解决办法]
皮皮鲁的方法,画圆角应该没问题。主要是画完圆角后调用拖拉程序时会不正常??
怎么不正常了?正常得很!
这个函数在Form的onmousemove中调用即可。

C/C++ code
int __fastcall TDocBookMainForm::CheckMouseInBorder(int X,int Y){    //判断当前鼠标的位置,是否在边界上,以改变鼠标并进行拖拉    //并返回所处的位置。    X = X - Left;    Y = Y - Top;    //最大化时不处理。    if(WindowState == wsMaximized) return HTCLIENT;    if(X<=10 && Y<=10)                    return HTTOPLEFT;    //左上角    if(X<=10 && Y>=ClientHeight-10)        return HTBOTTOMLEFT;//左下角    if(X<=2)                            return HTLEFT;        //左边    if(X>=ClientWidth-10 && Y<=10)        return HTTOPRIGHT;    //右上角    if(X>=ClientWidth-10 && Y>=ClientHeight-10)                                        return HTBOTTOMRIGHT;//右下角    if(X>=ClientWidth-2)                return HTRIGHT;        //右边    if(Y>=ClientHeight-2)                return HTBOTTOM;    //下边    if(Y<=2)                            return HTTOP;        //上边    return HTCLIENT;}//---------------------------------------
[解决办法]
那我坏人做到家吧,拿小象的代码改的,亲测OK

Delphi(Pascal) code
unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs;type  TForm1 = class(TForm)    procedure FormResize(Sender: TObject);    procedure FormCreate(Sender: TObject);    procedure FormClose(Sender: TObject; var Action: TCloseAction);  private    { Private declarations }    OldWndProc: TWndMethod;    function CheckMouseInBorder(X, Y: Integer;      var AResult: Integer): Boolean;    procedure NewWndProc(var AMsg: TMessage);  public    { Public declarations }  end;var  Form1: TForm1;implementation{$R *.dfm}procedure RoundRgn(frm: TCustomForm);var  hRgn1: HRGN;begin  BeginPath(frm.Canvas.Handle);  RoundRect(frm.Canvas.Handle, 1, 1, frm.Width, frm.Height, 50, 50);  EndPath(frm.Canvas.Handle);  hRgn1 := PathToRegion(frm.Canvas.Handle);  SetWindowRgn(frm.Handle, hRgn1, True);end;function TForm1.CheckMouseInBorder(X, Y: Integer;  var AResult: Integer): Boolean;begin  Result := False;  //判断当前鼠标的位置,是否在边界上,以改变鼠标并进行拖拉  //并返回所处的位置。  X := X - Left;  Y := Y - Top;  //最大化时不处理。  if (WindowState = wsMaximized) then  begin    Exit;  end;  if (X<=10) and (Y<=10) then    aResult := HTTOPLEFT     //左上角  else if (X<=10) and (Y>=ClientHeight-10) then    aResult := HTBOTTOMLEFT //左下角  else if (X<=2) then    aResult := HTLEFT         //左边  else if(X>=ClientWidth-10) and (Y<=10) then    aResult := HTTOPRIGHT     //右上角  else if(X>=ClientWidth-10) and (Y>=ClientHeight-10) then    aResult := HTBOTTOMRIGHT //右下角  else if(X>=ClientWidth-2) then    aResult := HTRIGHT         //右边  else if(Y>=ClientHeight-2) then    aResult := HTBOTTOM     //下边  else if(Y<=2) then    aResult := HTTOP         //上边  else    Exit;  Result := True;end;procedure TForm1.FormResize(Sender: TObject);begin  RoundRgn(Self);end;procedure TForm1.NewWndProc(var AMsg: TMessage);var  ret: Integer;begin  OldWndProc(AMsg);  if (AMsg.Msg = WM_NCHITTEST) and    CheckMouseInBorder(aMsg.LParamLo, aMsg.LParamHi, ret) then      AMsg.Result := ret;end;procedure TForm1.FormCreate(Sender: TObject);begin  OldWndProc := WindowProc;  WindowProc := NewWndProc;end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin  WindowProc := OldWndProc;end;end. 


[解决办法]
1. 用圆角窗体
2. 不需要Panel, 窗体本身有canvas可以画图的
3. 鼠标在周边的事件转换成窗体边框的事件 procedure OnHitTest(var msg: TMEssage); message WM_NCHITTEST;


Delphi(Pascal) code
procedure TForm1.OnHitTest(var msg: TMEssage);const  CORNER_WIDTH = 12;  htvalues: array [0..2, 0..2] of THitWindow =  (  (HTTOPLEFT, HTTOP, HTTOPRIGHT),  (HTLEFT, HTCLIENT, HTRIGHT),  (HTBOTTOMLEFT, HTBOTTOM, HTBOTTOMRIGHT)  );var  P: TPoint;  ctrl: TControl;  idx: integer;  idy: integer;begin  p.x := msg.LParamLo - Left;  p.y := msg.LParamHi - Top;  ctrl := ControlAtPos(p, True, False);  if (ctrl = nil) and (Align <> alClient) then  begin    if (p.x < CORNER_WIDTH) and (p.y < CORNER_WIDTH) then    begin      idx := 0;      idy := 0;    end    else if (p.x < CORNER_WIDTH) and (p.y > Height - CORNER_WIDTH) then    begin      idx := 0;      idy := 2;    end    else if (p.x > Width - CORNER_WIDTH) and (p.y < CORNER_WIDTH) then    begin      idx := 2;      idy := 0;    end    else if (p.x > Width - CORNER_WIDTH) and (p.y > Height - CORNER_WIDTH) then    begin      idx := 2;      idy := 2;    end    else    begin      if p.x < 4 then        idx := 0      else if p.x > Width - 4 then        idx := 2      else        idx := 1;      if p.y < 4 then        idy := 0      else if p.y > Height - 4 then        idy := 2      else        idy := 1;    end;    msg.Result := integer(htvalues[idy, idx]);  end  else    inherited;end; 

热点排行