線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1635
推到 Plurk!
推到 Facebook!

請問如何讓Form 的寬度跟著MainMenu的寬度自動改變?

尚未結案
TourNet
一般會員


發表:6
回覆:9
積分:3
註冊:2003-05-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-22 22:47:17 IP:61.219.xxx.xxx 未訂閱
請問 小弟的MainMenu是動態產生的, 但是又不希望MainMenu變成兩行, 所以希望Form的寬度要大於 MainMenu的寬度, 才不會讓MainMenu變成兩行. 請教各位大大, 有什麼簡單的方法可以判斷並且做到呢??
elvis1000
一般會員


發表:6
回覆:50
積分:16
註冊:2004-12-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-23 00:40:10 IP:220.134.xxx.xxx 未訂閱
我想到的方法是在MainMenu最右邊再家一個MenuItem, 打開MainMenu的OwnerDraw,並在這個MenuItem的DrawItem事件中得到最右邊的座標,然後檢查此座標的Y值有無換行,很幸運的,此MenuItem並不會顯示出來
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Menus;    type
  TMainForm = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure DrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
  end;    var
  MainForm: TMainForm;    Const
  MyName='Elvis Tsai';
  MyCoName='Dark Angel';
  ProgName='';    Var
  ProgPath:string;
  mm: TMainMenu;
  x,y,z:TMenuItem;
  RP:TPoint;    implementation    {$R *.DFM}    procedure TMainForm.FormCreate(Sender: TObject);
begin
  Application.Title:=ProgName;
  ProgPath:=ExtractFilePath(Application.ExeName);
  mm:=TMainMenu.Create(Self);
  mm.OwnerDraw:=true;  // 設成OwnerDraw
  x:=TMenuItem.Create(Self);
  x.Caption:='Test1';
  y:=TMenuItem.Create(Self);
  y.Caption:='Test2';
  z:=TMenuItem.Create(Self); //多加的MenuItem
  z.Caption:='Check';
  mm.Items.Add(x);
  mm.Items.Add(y);
  mm.Items.Add(z);
  z.OnDrawItem:=DrawItem;
end;    procedure TMainForm.FormResize(Sender: TObject);
begin
  //會換行做什反應 
  if RP.Y>40 then Width:=500;  //正常Y在32,換行就會大於32
end;    procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  x.Free;
  y.Free;
  z.Free;
  mm.Free;
end;    procedure TMainForm.DrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; Selected: Boolean);
begin
  RP:=Point(ARect.Right,ARect.Top);  //得到右邊點
end;    end.
----------------------- God bless you! I am Dark_Angel.
------
-----------------------
God bless you!
I am Dark_Angel.
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-23 01:46:27 IP:218.167.xxx.xxx 未訂閱
MainMenu OwnerDraw設為True  動態增加選項時 自己繪製MenuItem  同時, 在OnDrawItem事件內計算MenuItem總寬度, 並適時調整Form寬度    OnDrawItem , OnMeasureItem 內需要做一些調整才能正確畫出MenuItem 參考 "DELPHI的奇異選單的編寫" http://delphi.ktop.com.tw/topic.php?method=AddMyGood&TOPIC_ID=26004&FORUM_ID=71&CAT_ID=30&Forum_Title=VCL+%A4%B8%A5%F3%A8%CF%A5%CE%A9%CE%B3%5D%ADp%B0Q%BD%D7%B0%CF%28Delphi%29&Topic_Title=%A1iDelphi%A1j%A1i%A4%C0%A8%C9%A1jDELPHI%AA%BA%A9%5F%B2%A7%BF%EF%B3%E6%AA%BA%BDs%BCg
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Menus;    type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    AddMenuItem: TButton;
    procedure AddMenuItemClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    procedure MuitDrawItem(Sender: TObject; ACanvas: TCanvas;
      ARect: TRect; Selected: Boolean);
    procedure MuitMeasureItem(Sender: TObject; ACanvas: TCanvas; var Width,
      Height: Integer);
    { Private declarations }
  public
    sumW:integer;
    bCheck:Boolean;
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation    {$R *.DFM}    procedure TForm1.FormCreate(Sender: TObject);
begin
   Mainmenu1.OwnerDraw:=True;
end;    procedure TForm1.AddMenuItemClick(Sender: TObject);
var
   tmpMuit:TMenuItem;
   Rect:TRect;
begin
   bCheck:=True;
   tmpMuit:=TMenuItem.Create(MainMenu1);
   tmpMuit.Caption:='File';
   tmpMuit.OnDrawItem:=MuitDrawItem;
   tmpMuit.OnMeasureItem:=MuitMeasureItem;
   MainMenu1.Items.Add(tmpMuit);
end;    procedure TForm1.MuitMeasureItem(Sender: TObject; ACanvas: TCanvas; var Width, Height: Integer);
begin
  // The width is the space of the menu check 這個長度是選單的選擇標誌的長度
  // plus the width of the item text. 再加上選單項的長度
  Width := GetSystemMetrics(SM_CXMENUCHECK) + ACanvas.TextWidth((Sender as TMenuItem).Caption) + 2;
  Height := ACanvas.TextHeight((Sender as TMenuItem).Caption) + 2;
end;    procedure TForm1.MuitDrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
var
   wd,LeftPos:integer;
   dwCheck : Integer;
   MenuCaption : string;
begin
   LeftPos:=ARect.Left; //先記錄起來       // Get the checkmark dimensions. 獲取選擇標誌所需的像素數
   dwCheck := GetSystemMetrics(SM_CXMENUCHECK);
   // Adjust left position. 調整左邊位置
   ARect.Left := ARect.Left + LoWord(dwCheck) + 1;
   MenuCaption := (Sender as TMenuItem).Caption;
   // The font name is the menu caption.
   // Draw the text.畫文本
   DrawText(ACanvas.Handle, PChar(MenuCaption), Length(MenuCaption), ARect, 0);       if bCheck then
   begin
      bCheck:=False;
      wd:=ARect.Right - LeftPos;
      sumW:=sumW + wd;
      if (sumW+wd)>self.Width then
         self.Width:=sumW+wd;
   end;
end;    end.    
TourNet
一般會員


發表:6
回覆:9
積分:3
註冊:2003-05-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-23 05:27:54 IP:61.219.xxx.xxx 未訂閱
謝謝兩位大大, 我利用兩位不同的方法, 已做出我想要的東東了.. 謝謝
系統時間:2024-06-29 16:05:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!