用c 繪製Office2003樣式的選單

2021-04-12 14:22:43 字數 2904 閱讀 1881

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