yr012345
一般會員
發表:4 回覆:14 積分:3 註冊:2003-02-11
發送簡訊給我
|
我用动态创建菜单的方法调用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
發送簡訊給我
|
請重寫你的問題, 亂碼看不懂. Jesse Chan
------ Jesse Chan
|
yr012345
一般會員
發表:4 回覆:14 積分:3 註冊:2003-02-11
發送簡訊給我
|
我创建的动态菜单的字体用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
發送簡訊給我
|
請問有那位好心人用 BIG5 把問題重寫一次好嗎, 我選了幾種 字元集都看不出來吔. Jesse Chan
------ Jesse Chan
|
RaynorPao
版主
發表:139 回覆:3622 積分:7025 註冊:2002-08-12
發送簡訊給我
|
引言:
請問有那位好心人用 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
發送簡訊給我
|
可參考以下程式碼 #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
發送簡訊給我
|
有幾個問題需要弄清楚, 您用的是 TPopupMenu 或是 TMainMenu, 如果是前者, 我測過應該是沒有問題, 後者有一個限制, 就是第選單的第一層的 MeasureItem 是無法指定 Height(就算指定也沒有用), 其它各層則沒有問題, 任一種選單的 DrawItem 及 MeasureItem 要有作用, 必須指定 Images 的屬性.不知道是否解答您的問題. Jesse Chan
------ Jesse Chan
|
jessechan
版主
發表:109 回覆:394 積分:254 註冊:2002-04-05
發送簡訊給我
|
感謝 RaynorPao 幫忙翻譯. Jesse Chan
------ Jesse Chan
|
yr012345
一般會員
發表:4 回覆:14 積分:3 註冊:2003-02-11
發送簡訊給我
|
首先感谢RaynorPao, Jazz, Jesschan !
我提交时选 "用的是简体中文,系统自动转码"但不知为何出现了乱码。
我同意Jesschan的意见:我用的是TMainMenu, 但第一层无法指定Height,其它层没问题,可以正常显示。但我确实想解决第一层存在的问题(Height不能指定,鼠标在移到上面时不能凸起)。而且我觉得应该有办法解决,要不C Builder的TMenuItem岂不存在一个明显的bug? Jazz的代码我现在就试验一下,看是否能解决。有结果后告诉大家。
|
領航天使
站長
發表:12216 回覆:4186 積分:4084 註冊:2001-07-25
發送簡訊給我
|
本站發言時的"我使用簡體字內碼(GB碼)發言,請系統幫我自動轉碼."
此功能為將GB內碼轉為BIG5碼
若您的簡體系統採用Uni-Code編碼時
發言時請問勾選此選項
Uni-Code的簡体碼,在繁體的Windows系統中也看的到的! ~~~Delphi K.Top討論區站長~~~
------ ~~~Delphi K.Top討論區站長~~~
|
jessechan
版主
發表:109 回覆:394 積分:254 註冊:2002-04-05
發送簡訊給我
|
Jazz 的 code 我確定可以 work, 因為我用類似的方法寫了一個擴充的 MainMenu Component, 所以我知道要讓選單浮起只要在 drawitem 時不要用 FrameRect 而用 MoveTo 及 LineTo, 在上方及左方以深色線, 下方及右方以淺色線畫框, 就可以得到浮起的效果了. Jesse Chan
------ Jesse Chan
|
yr012345
一般會員
發表:4 回覆:14 積分:3 註冊:2003-02-11
發送簡訊給我
|
各位好:Jazz的代码,我试验了一下,其它各项功能都有,但好像还是未能解决第一层菜单的字体大小问题,若字体变大,第一层菜单只能显示下半部分汉字。其他层的字体可以变大。我发现Jazz的代码与www.cppfrance.com上的代码相同,我用的就是下载的代码。
Jesse Chan、Jazz等各位是否能给近一步的明示?
我也注意到flyup 的“DELPHI的奇異選單的編寫”,我也研究一下,有结果再告诉大家。
谢谢!
|
flyup
資深會員
發表:280 回覆:508 積分:385 註冊:2002-04-15
發送簡訊給我
|
請慢慢的品嘗
看不懂再問我 問題..希望不是最後才發生!建議一次問完!
|
yr012345
一般會員
發表:4 回覆:14 積分:3 註冊:2003-02-11
發送簡訊給我
|
我对delphi不太熟悉,还是没有找到哪一段是修改第一层菜单的字体大小的,我的问题可用如下例子说明。
1.字典维护 2.系统维护 (用OnDrawItem后第一层字体若变大,就只能显示上边一部分)
1.1 人员 2.1 修改口令 (下面第2.3...层的字体可以随意变化,显示正常)
1.2 单位 2.2 删除口令
1.3 其它 flyup及其它高人是否能明示,如何让第一层字体变大时能显示正常呢
|
jessechan
版主
發表:109 回覆:394 積分:254 註冊:2002-04-05
發送簡訊給我
|
最簡單的方法, 在桌面上按右鍵, 選擇 property, 然後改變主選單的大小, 就可以完全顯示.
Jesse Chan
------ Jesse Chan
|
yr012345
一般會員
發表:4 回覆:14 積分:3 註冊:2003-02-11
發送簡訊給我
|
这个方法可以,但程序里如何实现呢?真不好意思,我确实想解决这一问题
|
brook
資深會員
發表:57 回覆:323 積分:371 註冊:2002-07-12
發送簡訊給我
|
下列程式可改菜單的字型,但唯一的缺點就是所有的菜單都會受影響.
其實這個問題也困擾我很久,希望能有更好的對策,我想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
發送簡訊給我
|
非常感谢brook和其他诸位的解答,用brook的代码解决了这个问题.
|
yr012345
一般會員
發表:4 回覆:14 積分:3 註冊:2003-02-11
發送簡訊給我
|
非常感谢brook和其他诸位的解答,用brook的代码解决了这个问题.
|