关于网友提出的“ 如何实现在菜单的缩放?高分送。”问题疑问,本网通过在网上对“ 如何实现在菜单的缩放?高分送。”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 如何实现在菜单的缩放?高分送。
描述: 我看到有些软件在其屏幕的左侧,有一系列菜单,单击其中一列,菜单可以展开,再单击,又可以收缩。如何实现。
解决方案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