您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> Delphi >> 如何实现在菜单的缩放?高分送。

如何实现在菜单的缩放?高分送。

来源:网络整理     时间:2016/8/25 23:06:44     关键词:

关于网友提出的“ 如何实现在菜单的缩放?高分送。”问题疑问,本网通过在网上对“ 如何实现在菜单的缩放?高分送。”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 如何实现在菜单的缩放?高分送。
描述:

我看到有些软件在其屏幕的左侧,有一系列菜单,单击其中一列,菜单可以展开,再单击,又可以收缩。如何实现。


解决方案1:

//---------------------------------------------------------------------------
// 作者: 林君学, Delphi K.Top 讨论区 ID: lcsboy
// e-mail:lcsboy@pchome.com.tw
// Delphi 版本 由阿子实作
// 1. 本程式的观念来自Windows XP风格, 绝无抄袭他人之着作
// 2. 本程式可以自己修改, 转载, 或是经由网路等任何管道散播
// 3. 本程式可以自由转载至各网站, 但请注明原出处
// 4. 欢迎任何问题, 一起到K.Top讨论: http://delphi.ktop.com.tw/topic.asp?TOPIC_ID=31041
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ExtCtrls;
type
TPanelBlock = Record
   Top :integer;
   Button:integer;
 end;
  TForm1 = class(TForm)
  Splitter1:TSplitter;
  ImageClose: TImage;
  ImageOpen :TImage;
  PanelScreen:TPanel;
  PanelBase:TPanel;
  TreeView1:TTreeView;
  TreeView2:TTreeView;
  TreeView3:TTreeView;
  Caption1:TPanel;
  Caption2:TPanel;
  Caption3:TPanel;
  ButtonUp:TPanel;
  ButtonDown:TPanel;
  StatusBar1:TStatusBar;
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormResize(Sender: TObject);
    procedure TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ButtonDownClick(Sender: TObject);
    procedure ButtonUpClick(Sender: TObject);
    procedure Caption1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
     procedure AdjTreeView;
     procedure HookCaption1WindowProc(Var Message :TMessage);
     procedure HookCaption2WindowProc(Var Message :TMessage);
     procedure HookCaption3WindowProc(Var Message :TMessage);
     Procedure ShowTreeViewIcon(index:integer);
  public
    { Public declarations }
   Caption1ParentWindowProc: TWndMethod;
   Caption2ParentWindowProc: TWndMethod;
   Caption3ParentWindowProc: TWndMethod;
   Caption1DC:HDC;
   Caption2DC:HDC;
   Caption3DC:HDC;
   PanelBlock:TPanelBlock;
   TreeViewCount:integer;
  end;
var
  Form1: TForm1;
const
  TreeViewSpace=20;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
  i:integer;
  temp :Extended;
  pt:TTreeView;
  ItemsHeight:integer;
begin
  TreeViewCount :=3;   // TreeView的总数
                       // 如果你要作成VCL, 就不能像我是作固定的3个
                       // 因为时间强迫, 就暂时固定的3个 >.<
  TreeView1.Items.Item[0].Expanded :=true;
  TreeView2.Items.Item[0].Expanded :=true;
  TreeView3.Items.Item[0].Expanded :=true;
  // 依照每个TreeView有几个Item, 算出适当的Height值
  for i:=1 to TreeViewCount do
  begin
    Pt := TTreeView(FindComponent('TreeView'+intToStr(i)));
    //这一行要取整数但计算出来是浮点数
       ItemsHeight  :=round(-( (Pt.Font.Height * 1.8) * Pt.Items.Item[0].Count));
   // 上面这行有个参数"1.8", 应该有函式可以取得字型+每行间间距所占的pixel
          // 但是我懒得找这个用法, try出来的结果, 就暂时用1.8代替 >.<
   Pt.Height := ItemsHeight;
  end;
   // 调整每个TreeView的间距
  AdjTreeView;
   // 记录PanelBlock上下的位置
  PanelBlock.Top := PanelBase.Top;
  PanelBlock.Button := TreeView3.Top+TreeView3.Height +StatusBar1.Height;
   // 储存-原始讯息处理程序
     Caption1ParentWindowProc:=Caption1.WindowProc;
     Caption2ParentWindowProc:=Caption2.WindowProc;
     Caption3ParentWindowProc:=Caption3.WindowProc;
  // 串接-使用者自订-讯息处理程序
  Caption1.WindowProc :=HookCaption1WindowProc;
  Caption2.WindowProc :=HookCaption2WindowProc;
  Caption3.WindowProc :=HookCaptioN3WindowProc;
  // 串接-使用者自订-讯息处理程序
   // 取得三个要加背景VCL的DC
  Caption1DC :=GetDC(Caption1.Handle);
  Caption2DC :=GetDC(Caption2.Handle);
  Caption3DC :=GetDC(Caption3.Handle);
end;
// Form size变动时, 要作的相对应动作, 在此完成
procedure TForm1.FormResize(Sender: TObject);
begin
if (StatusBar1.Top < PanelBlock.Button)  then
  begin
    ButtonDown.Top := StatusBar1.Top - ButtonDown.Height;
    ButtonDown.Visible :=true;
  end else
    ButtonDown.Visible :=False;
end;
 // 自己之前要作GetDC动作的话, 一定要自己作DeleleDC的动作
 // 把资源还给OS
 // 这样的观念是和new / delele是一样的, 千万不能忽略
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
DeleteDC(Caption1DC);
DeleteDC( Caption2DC);
DeleteDC( Caption3DC);
end;


以上介绍了“ 如何实现在菜单的缩放?高分送。”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3592966.html

相关图片

相关文章