請問如何讓Form 的寬度跟著MainMenu的寬度自動改變? |
尚未結案
|
TourNet
一般會員 發表:6 回覆:9 積分:3 註冊:2003-05-06 發送簡訊給我 |
|
elvis1000
一般會員 發表:6 回覆:50 積分:16 註冊:2004-12-18 發送簡訊給我 |
我想到的方法是在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 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |