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

改变菜单的字体大小

尚未結案
yr012345
一般會員


發表:4
回覆:14
積分:3
註冊:2003-02-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-02-18 11:20:18 IP:211.98.xxx.xxx 未訂閱
我用动态创建菜单的方法调用OnDrawItem,OnMeasureItem方法可以将菜单的字体放大,但菜单字体只能显示上半部分,下半部分鼠标过去后才显示出来,特别乱。那位有改变字体的好方法请赐教? 我这里先谢谢了.两段代码如下:    void __fastcall TForm1::DrawNewItem(TObject *Sender, TCanvas *ACanvas,       const TRect &ARect, bool Selected) {     ACanvas->FillRect(ARect);     ACanvas->Font->Name = "Arial";     ACanvas->Font->Size = 14;     if(Selected) ACanvas->Font->Color=clRed;        ACanvas->TextOut(ARect.Left +10, ARect.Top + 10, dynamic_cast(Sender)->Caption); } void __fastcall TForm1::ExpandMenuItemWidth(TObject *Sender, TCanvas *ACanvas, int &Width, int &Height) { Height = 40; Width = 40; ACanvas->Font->Name = "Arial"; ACanvas->Font->Size = 14; }
jessechan
版主


發表:109
回覆:394
積分:254
註冊:2002-04-05

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-02-18 12:36:47 IP:203.75.xxx.xxx 未訂閱
請重寫你的問題, 亂碼看不懂. Jesse Chan
------
Jesse Chan
yr012345
一般會員


發表:4
回覆:14
積分:3
註冊:2003-02-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-02-18 13:07:22 IP:211.98.xxx.xxx 未訂閱
我创建的动态菜单的字体用OnDrawItem变大后,只能显示字体的上半部分,菜单下面有一条细线,细线下面的半部分字体鼠标过去才能显示. void __fastcall TForm1::DrawNewItem(TObject *Sender, TCanvas *ACanvas,       const TRect &ARect, bool Selected) {     ACanvas->FillRect(ARect);     ACanvas->Font->Name = "Arial";     ACanvas->Font->Size = 14;     if(Selected) ACanvas->Font->Color=clRed;      Screen->MenuFont->Height=20; //菜单在Form上的位置     ACanvas->TextOut(ARect.Left +20, ARect.Top + 0, dynamic_cast(Sender)->Caption); } void __fastcall TForm1::ExpandMenuItemWidth(TObject *Sender, TCanvas *ACanvas, int &Width, int &Height) { // We need to make the Menu wider to make room for the vertical font //子菜单的高度与宽度 Height = 90; Width = 90; ACanvas->Font->Name = "Arial"; ACanvas->Font->Size = 14; }
jessechan
版主


發表:109
回覆:394
積分:254
註冊:2002-04-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-02-18 15:10:16 IP:203.75.xxx.xxx 未訂閱
請問有那位好心人用 BIG5 把問題重寫一次好嗎, 我選了幾種 字元集都看不出來吔. Jesse Chan
------
Jesse Chan
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-02-18 16:26:15 IP:203.73.xxx.xxx 未訂閱
引言: 請問有那位好心人用 BIG5 把問題重寫一次好嗎, 我選了幾種 字元集都看不出來吔.
jessechan 你好: yr012345 原本的問題內容如下 < class="code"> 我用動態創建菜單的方法調用OnDrawItem,OnMeasureItem方法可以將菜單的字体 放大,但菜單字体只能顯示上半部分,下半部分鼠標過去後才顯示出來,特別 亂。那位有改變字体的好方法請賜教? 我這裡先謝謝了.兩段代碼如下: void __fastcall TForm1::DrawNewItem(TObject *Sender, TCanvas *ACanvas, const TRect &ARect, bool Selected) { ACanvas->FillRect(ARect); ACanvas->Font->Name = "Arial"; ACanvas->Font->Size = 14; if(Selected) ACanvas->Font->Color=clRed; ACanvas->TextOut(ARect.Left 10, ARect.Top 10, dynamic_cast(Sender)->Caption); } void __fastcall TForm1::ExpandMenuItemWidth(TObject *Sender, TCanvas *ACanvas, int &Width, int &Height) { Height = 40; Width = 40; ACanvas->Font->Name = "Arial"; ACanvas->Font->Size = 14; } -- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
jazz
初階會員


發表:10
回覆:43
積分:35
註冊:2002-06-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-02-19 01:06:00 IP:61.30.xxx.xxx 未訂閱
可參考以下程式碼    #include  #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //-------------------------------------------------------------------- void __fastcall TForm1::Example1DrawItem(TObject *Sender, TCanvas *ACanvas, TRect &ARect, bool Selected) { TRect FocusRectBorder; TRect FocusRectFill; TMenuItem *MenuItem = ((TMenuItem*)Sender); AnsiString Text = MenuItem->Caption; ACanvas->Brush->Color = MainMenuBackground; ACanvas->FillRect(ARect); if(Text == "") return; if(Selected) { FocusRectBorder = ARect; ACanvas->Brush->Color = BorderColor; ACanvas->FrameRect(FocusRectBorder); FocusRectFill = ARect; FocusRectFill.Top = SideBuffer; FocusRectFill.Right -= SideBuffer; FocusRectFill.Left = SideBuffer; FocusRectFill.Bottom -= SideBuffer; ACanvas->Brush->Color = MainMenuHighlightColor; ACanvas->FillRect(FocusRectFill); ACanvas->Font->Color = MainMenuHighlightTextColor; } else { ACanvas->Font->Color = MainMenuTextColor; } int TextLength; TRect TextRect; TextLength = Text.Length(); TextRect = ARect; TextRect.Left = 5; TextRect.Top = 1; DrawText(ACanvas->Handle,Text.c_str(), TextLength, &TextRect, 0); } //-------------------------------------------------------------------- void __fastcall TForm1::MyDrawItem(TObject* Sender, TCanvas* ACanvas, const TRect &ARect, bool Selected) { int TopPos, TextLength; AnsiString Text; TRect TempRect; TRect VerticalRect; TRect FocusRectBorder; TRect FocusRectFill; TRect TextRect; TMenuItem *MenuItem = ((TMenuItem*)Sender); Text = MenuItem->Caption; ACanvas->Brush->Color = MenuColor; ACanvas->FillRect(ARect); if(Text==BLANK_LINE) { VerticalRect = ARect; VerticalRect.Top -= SideBuffer; VerticalRect.Right = VerticalWidth; VerticalRect.Bottom = SideBuffer; ACanvas->Brush->Color = VerticalColor; ACanvas->FillRect(VerticalRect); ACanvas->MoveTo(VerticalWidth,ARect.Top ARect.Height()/2); ACanvas->LineTo(ARect.Right,ARect.Top ARect.Height()/2); return; } TextLength = Text.Length(); if(Selected) { VerticalRect = ARect; VerticalRect.Top -= SideBuffer; VerticalRect.Right = VerticalWidth; VerticalRect.Bottom = SideBuffer; ACanvas->Brush->Color = VerticalColor; ACanvas->FillRect(VerticalRect); if(MenuItem->Enabled) { FocusRectBorder = ARect; FocusRectBorder.Left = FocusRectLeftIndent - SideBuffer; FocusRectBorder.Right -= FocusRectRightIndent - SideBuffer; ACanvas->Brush->Color = BorderColor; ACanvas->FrameRect(FocusRectBorder); FocusRectFill = ARect; FocusRectFill.Right -= FocusRectRightIndent; FocusRectFill.Left = FocusRectLeftIndent; FocusRectFill.Bottom -= SideBuffer; FocusRectFill.Top = SideBuffer; ACanvas->Brush->Color = HighlightColor; ACanvas->FillRect(FocusRectFill); ACanvas->Font->Color = HighlightTextColor; ACanvas->Font->Style = TFontStyles() << fsBold; } else { ACanvas->Font->Style = TFontStyles(); ACanvas->Brush->Color = NormalTextBackground; ACanvas->Font->Color = DisabledTextColor; } } else { VerticalRect = ARect; VerticalRect.Top -= SideBuffer; VerticalRect.Right = VerticalWidth; VerticalRect.Bottom = SideBuffer; ACanvas->Brush->Color = VerticalColor; ACanvas->FillRect(VerticalRect); if(MenuItem->Enabled) { ACanvas->Brush->Color = NormalTextBackground; ACanvas->Font->Color = NormalTextColor; } else { ACanvas->Brush->Color = NormalTextBackground; ACanvas->Font->Color = DisabledTextColor; } } TextRect = ARect; TextRect.Left = LeftTextPos; if(Offset > 0) TextRect.Top = Offset/2 SideBuffer; else TextRect.Top = 2 SideBuffer; TextRect.Top = SideBuffer; if(Menu->Images != NULL) { Icon = new TIcon(); Menu->Images->GetIcon(MenuItem->ImageIndex,Icon); ACanvas->Draw(5,ARect.Top ItemOffset 1,Icon); delete Icon; } DrawText(ACanvas->Handle,Text.c_str(), TextLength, &TextRect, 0); } //-------------------------------------------------------------------- void __fastcall TForm1::MyExpandItemWidth(TObject *Sender, TCanvas *ACanvas, int &Width, int &Height) { Width = MenuIncreaseWidth; Height = Offset; MenuItemHeight = Height; ItemOffset = Offset/2; } //-------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Custom=TColor(RGB(255,220,220)); MainMenuBackground = clSilver; MainMenuHighlightColor = Custom; MainMenuTextColor = clBlack; MainMenuTextBackground = clSilver; MainMenuHighlightTextColor = clBlack; VerticalColor = clSilver; MenuColor = clWhite; HighlightColor = Custom; BorderColor = clBlack; NormalTextColor = clBlack; NormalTextBackground = clWhite; HighlightTextColor = clBlack; DisabledTextColor = clSilver; VerticalWidth = 26; FocusRectRightIndent = 3; FocusRectLeftIndent = 3; LeftTextPos = 35; SideBuffer = 1; if(Menu->Images == NULL) MenuIncreaseWidth = 100; else MenuIncreaseWidth = 50; Offset = 5; } //-------------------------------------------------------------------- void __fastcall TForm1::Example1Click(TObject *Sender) { TMenuItem *MenuItem = ((TMenuItem*)Sender); if(MenuItem->Count > 0) { for(int i=0; i <= MenuItem->Count-1; i ) { MenuItem->Items[i]->OnMeasureItem = MyExpandItemWidth; MenuItem->Items[i]->OnDrawItem = MyDrawItem; if(MenuItem->Items[i]->Count > 0) { for(int x=0; x <= MenuItem->Items[i]->Count-1; x ) { MenuItem->Items[i]->Items[x]->OnMeasureItem = MyExpandItemWidth; MenuItem->Items[i]->Items[x]->OnDrawItem = MyDrawItem; } } } } } //---------------------------------------------------------------------------
jessechan
版主


發表:109
回覆:394
積分:254
註冊:2002-04-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-02-19 10:07:19 IP:203.75.xxx.xxx 未訂閱
有幾個問題需要弄清楚, 您用的是 TPopupMenu 或是 TMainMenu, 如果是前者, 我測過應該是沒有問題, 後者有一個限制, 就是第選單的第一層的 MeasureItem 是無法指定 Height(就算指定也沒有用), 其它各層則沒有問題, 任一種選單的 DrawItem 及 MeasureItem 要有作用, 必須指定 Images 的屬性.不知道是否解答您的問題. Jesse Chan
------
Jesse Chan
jessechan
版主


發表:109
回覆:394
積分:254
註冊:2002-04-05

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-02-19 10:09:04 IP:203.75.xxx.xxx 未訂閱
感謝 RaynorPao 幫忙翻譯. Jesse Chan
------
Jesse Chan
yr012345
一般會員


發表:4
回覆:14
積分:3
註冊:2003-02-11

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-02-19 11:19:32 IP:211.98.xxx.xxx 未訂閱
首先感谢RaynorPao, Jazz, Jesschan ! 我提交时选 "用的是简体中文,系统自动转码"但不知为何出现了乱码。 我同意Jesschan的意见:我用的是TMainMenu, 但第一层无法指定Height,其它层没问题,可以正常显示。但我确实想解决第一层存在的问题(Height不能指定,鼠标在移到上面时不能凸起)。而且我觉得应该有办法解决,要不C Builder的TMenuItem岂不存在一个明显的bug? Jazz的代码我现在就试验一下,看是否能解决。有结果后告诉大家。
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-02-19 20:31:09 IP:210.202.xxx.xxx 未訂閱
本站發言時的"我使用簡體字內碼(GB碼)發言,請系統幫我自動轉碼." 此功能為將GB內碼轉為BIG5碼 若您的簡體系統採用Uni-Code編碼時 發言時請問勾選此選項 Uni-Code的簡体碼,在繁體的Windows系統中也看的到的! ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
jessechan
版主


發表:109
回覆:394
積分:254
註冊:2002-04-05

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-02-19 23:49:10 IP:61.228.xxx.xxx 未訂閱
Jazz 的 code 我確定可以 work, 因為我用類似的方法寫了一個擴充的 MainMenu Component, 所以我知道要讓選單浮起只要在 drawitem 時不要用 FrameRect 而用 MoveTo 及 LineTo, 在上方及左方以深色線, 下方及右方以淺色線畫框, 就可以得到浮起的效果了. Jesse Chan
------
Jesse Chan
yr012345
一般會員


發表:4
回覆:14
積分:3
註冊:2003-02-11

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-02-23 13:50:07 IP:211.98.xxx.xxx 未訂閱
各位好:Jazz的代码,我试验了一下,其它各项功能都有,但好像还是未能解决第一层菜单的字体大小问题,若字体变大,第一层菜单只能显示下半部分汉字。其他层的字体可以变大。我发现Jazz的代码与www.cppfrance.com上的代码相同,我用的就是下载的代码。 Jesse Chan、Jazz等各位是否能给近一步的明示? 我也注意到flyup 的“DELPHI的奇異選單的編寫”,我也研究一下,有结果再告诉大家。 谢谢!
flyup
資深會員


發表:280
回覆:508
積分:385
註冊:2002-04-15

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-02-23 18:42:10 IP:61.216.xxx.xxx 未訂閱
請慢慢的品嘗 看不懂再問我    問題..希望不是最後才發生!建議一次問完!
yr012345
一般會員


發表:4
回覆:14
積分:3
註冊:2003-02-11

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-02-28 15:55:03 IP:211.98.xxx.xxx 未訂閱
我对delphi不太熟悉,还是没有找到哪一段是修改第一层菜单的字体大小的,我的问题可用如下例子说明。 1.字典维护 2.系统维护 (用OnDrawItem后第一层字体若变大,就只能显示上边一部分) 1.1 人员 2.1 修改口令 (下面第2.3...层的字体可以随意变化,显示正常) 1.2 单位 2.2 删除口令 1.3 其它 flyup及其它高人是否能明示,如何让第一层字体变大时能显示正常呢
jessechan
版主


發表:109
回覆:394
積分:254
註冊:2002-04-05

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-03-02 00:54:26 IP:61.228.xxx.xxx 未訂閱
最簡單的方法, 在桌面上按右鍵, 選擇 property, 然後改變主選單的大小, 就可以完全顯示. Jesse Chan
------
Jesse Chan
yr012345
一般會員


發表:4
回覆:14
積分:3
註冊:2003-02-11

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-03-03 12:57:10 IP:211.98.xxx.xxx 未訂閱
这个方法可以,但程序里如何实现呢?真不好意思,我确实想解决这一问题
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-03-03 13:39:15 IP:218.160.xxx.xxx 未訂閱
下列程式可改菜單的字型,但唯一的缺點就是所有的菜單都會受影響. 其實這個問題也困擾我很久,希望能有更好的對策,我想jazz的程式很好, 但只是缺少一個把form的canvas原點能隨著菜單的大小向上或向下修正而己. [code] PNonClientMetrics NC; // 儲存系統目錄字型 NC = new TNonClientMetrics; NC->cbSize = sizeof(TNonClientMetrics); SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, NC, 0); // 設定目錄字型大小 NC->lfMenuFont.lfHeight = 26; SystemParametersInfo(SPI_SETNONCLIENTMETRICS, 0, NC, 0); [\code]
yr012345
一般會員


發表:4
回覆:14
積分:3
註冊:2003-02-11

發送簡訊給我
#18 引用回覆 回覆 發表時間:2003-03-04 09:36:10 IP:211.98.xxx.xxx 未訂閱
非常感谢brook和其他诸位的解答,用brook的代码解决了这个问题.
yr012345
一般會員


發表:4
回覆:14
積分:3
註冊:2003-02-11

發送簡訊給我
#19 引用回覆 回覆 發表時間:2003-03-04 09:36:16 IP:211.98.xxx.xxx 未訂閱
非常感谢brook和其他诸位的解答,用brook的代码解决了这个问题.
系統時間:2024-05-03 13:03:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!