用c 繪製Office2003樣式的選單

2021-06-15 22:45:57 字數 3053 閱讀 3737

我的方法是重寫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,所以是不能直接編輯啦。於是又有了一翻探索 怎麼讓我的機器能夠快速編輯這類的文件呢?哈哈,得益於勁哥的幫忙,問題一會久就...