我的方法是重寫menuitem類,在寫的過程中發現用gdi+實際測量出來的文字的大小不是很準確,還有文字也不能很好對齊,固在**裡可以時常看到很多多加上去的數字.我想原理就不用我講了吧,下面的**注釋的很
清楚了:
using system;
using system.drawing;
using system.drawing.drawing2d;
using system.windows.forms;
namespace officemenu
else }
private font font;
private stringformat strformat=new stringformat();
private string itemtext="";
private string iconpath="";
//定義繪製的時候的各種筆刷
private lineargradientbrush topmenuhostlightbrush;
private solidbrush topmenudefaultbrush;
private solidbrush fontdefaultbrush;
private lineargradientbrush topmenuselectedbrush;
private solidbrush menudefaultbrush;
private solidbrush menudefaultselectedbrush;
private solidbrush menucheckbrush;
private lineargradientbrush menusidebarbrush;
private solidbrush menudefaultgrayedbrush;
//定義繪製的時候所需的各種線條
private pen topmenupen;
private pen menudefaultpen;
//定義需要的矩形結構
private rectangle sidebarrect;
private rectangle checkedrect;
private rectangle topmenurect;
private rectangle shortcutrect;
//定義圖示
public string iconpath
set }
//判斷選單是否是頂級選單
private bool checkistop()
else }
//獲取選單的快捷鍵
private string getshortcut() }
catch
return shortcut;
} //重寫測量函式
protected override void onmeasureitem(measureitemeventargs e)
string getedshortcut=this.getshortcut();
if(!this.checkistop()) //如果不是頂級選單
else
if(this.visible)
else }
catch }
//重寫繪圖函式
protected override void ondrawitem(drawitemeventargs e)
//繪製hotlight時的影象
if((e.state & drawitemstate.hotlight)==drawitemstate.hotlight) //突出顯示時
//繪製選單選中時的影象
if((e.state & drawitemstate.selected)==drawitemstate.selected) }
else //非頂級選單時
if((e.state & drawitemstate.selected)==drawitemstate.selected) //選中時
if((e.state & drawitemstate.grayed)==drawitemstate.grayed) //不可用時
if(!this.isparent)
if(this.checked==true && ((e.state & drawitemstate.selected)==drawitemstate.selected)) //選中且checked屬性為真時 }
} else //畫分割線 }
} }
//畫圖示
private void drawicon(graphics g)
else }
catch }
} //由於再繪製的過程中選中的動作時需要執行兩次一樣的** 固在這裡用了乙個函式
private void drawitem_selected(graphics g,rectangle rec,string itemtext)
else
//正常顯示
g.fillrectangle(menudefaultselectedbrush,rec);
g.drawrectangle(menudefaultpen,rec.x,rec.y,rec.width-1,rec.height-1);
g.drawstring(itemtext,this.font,tmpbrush,rec.x+26,rec.y+4);
//顯示shortcut
string shortcut=this.getshortcut();
strformat.alignment=stringalignment.far;
g.drawstring(shortcut,this.font,tmpbrush,shortcutrect,strformat);
//畫圖示
this.drawicon(g);
} }
//自定義異常 }
}
用c 繪製Office2003樣式的選單
我的方法是重寫menuitem類,在寫的過程中發現用gdi 實際測量出來的文字的大小不是很準確,還有文字也不能很好對齊,固在 裡可以時常看到很多多加上去的數字.我想原理就不用我講了吧,下面的 注釋的很 清楚了 using system using system.drawing using syste...
OFFICE 2003 開啟RMS保護的文件出錯
症狀從 2009 年 12 月 11 日開始,使用 office 2003 的客戶將無法開啟由 active directory rights management service ad rms 或 rights management services rms 保護的 office 2003 文件。...
office 2003也能編輯 docx文件
office 2003也能編輯.docx檔案 摘要 近來需要編輯一下.docx為字尾的文件 office 2007以上的文件 由於我的機器裡裝了乙個win7和 office2003,所以是不能直接編輯啦。於是又有了一翻探索 怎麼讓我的機器能夠快速編輯這類的文件呢?哈哈,得益於勁哥的幫忙,問題一會久就...