LineMenu.cpp
上传用户:lj3531212
上传日期:2007-06-18
资源大小:346k
文件大小:8k
源码类别:

绘图程序

开发平台:

Visual C++

  1. // LineMenu.cpp: implementation of the CLineMenu class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "LineMenu.h"
  6. #include "GraphSoft.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CLineMenu::CLineMenu()
  16. {
  17.    m_nSeparatorHeight = 10; //default height of separator 
  18.    m_nLineLength = 40;      //deafult length of line
  19.    m_colMenu =::GetSysColor(COLOR_MENU);
  20.    m_colText =::GetSysColor(COLOR_ACTIVECAPTION);
  21.    m_colTextSelected =::GetSysColor(COLOR_WINDOWTEXT);
  22.    m_bGrayed=FALSE;
  23. }
  24. ///////////////////////////////////////////////////////
  25. CLineMenu::~CLineMenu()
  26. {
  27.     while(!m_ListMenu.IsEmpty())
  28. delete m_ListMenu.RemoveHead();
  29. TRACE("DESTRUCTOR of LineMenun");
  30. }
  31. ///////////////////////////////////////////////////////
  32. void CLineMenu::MeasureItem(LPMEASUREITEMSTRUCT  lpMIS)
  33. {
  34. TRACE("CLineMenu::MeasureItemn");
  35. MENUITEM *lpItem =(LPMENUITEM)lpMIS->itemData;
  36. if(lpItem->uID==0)//separator
  37. {
  38. lpMIS->itemHeight =m_nSeparatorHeight;
  39. }
  40. else
  41. {
  42. CDC  *pDC =AfxGetMainWnd()->GetDC();
  43. CString strText=lpItem->strText;
  44. CSize  size;
  45. size=pDC->GetTextExtent(lpItem->strText);
  46.         lpMIS->itemWidth =size.cx+m_nLineLength+5;
  47. lpMIS->itemHeight =size.cy+8;
  48. m_nHeight=size.cy+8;
  49. AfxGetMainWnd()->ReleaseDC(pDC);
  50. }
  51. }
  52. ///////////////////////////////////////////////////////
  53. void CLineMenu::DrawItem(LPDRAWITEMSTRUCT lpDIS)
  54. {
  55. TRACE("CLineMenu::DrawItemn");
  56. CDC dc;
  57. LPMENUITEM lpItem;
  58. CRect rect(lpDIS->rcItem);
  59. dc.Attach(lpDIS->hDC);
  60. lpItem =(LPMENUITEM)lpDIS->itemData;
  61.     bool bGrayed=FALSE;
  62. CString strText=lpItem->strText;
  63. int n=strText.GetLength();
  64. char chGrayed=strText.GetAt(n-1);
  65. strText=strText.Left(n-1);
  66. if(chGrayed=='1'){
  67.   bGrayed=TRUE;
  68. }else{
  69. bGrayed=FALSE;
  70. }
  71. if(lpDIS->itemState & ODS_SELECTED){
  72. dc.SetTextColor(m_colTextSelected);
  73. }else{
  74. dc.SetTextColor(m_colText);
  75. }
  76. //Set the Background color
  77. CBrush brush(m_colMenu);
  78. dc.FillRect(&rect, &brush);
  79. //Set the show mode
  80. //dc.SetBkMode(TRANSPARENT);
  81. if(lpItem->uID==0)//Separator
  82. {
  83. rect.top =rect.Height()/2+rect.top ;
  84. rect.bottom =rect.top +2;
  85. rect.left +=2;
  86. rect.right -=2;
  87. dc.Draw3dRect(rect,RGB(64,0,128),RGB(255,255,255));
  88. }
  89. else
  90. {
  91. BOOL bSelected =lpDIS->itemState & ODS_SELECTED;
  92. BOOL bChecked  =lpDIS->itemState & ODS_CHECKED;
  93. // BOOL bGrayed   =lpDIS->itemState & ODS_GRAYED;
  94.      
  95. //Draw the text of Menu item
  96. CRect rtText(rect.left+m_nLineLength+7,rect.top,rect.right ,rect.bottom );
  97. rtText.InflateRect(-2,-2);
  98. DrawText(&dc,rect,rtText,bSelected,bGrayed,strText);        
  99. //attention : you have Check that whether menu item is selected while drawing text
  100.         ///////////// so you need not check again while drawing line    
  101. //Draw the line
  102.         CString str=lpItem->strText.Left(lpItem->strText.FindOneOf(_T(" ")));
  103.      float fLineWidth=StrToFloat(str); 
  104.     DrawLine(&dc,rect.left+1,(rect.top+rect.bottom)/2,rect.left+40,(rect.top+rect.bottom)/2,bSelected,bGrayed,fLineWidth);    
  105. }
  106. dc.Detach();
  107. }
  108. //////////////////////////////////////////////////////////
  109. //change the style of Menu 
  110. void CLineMenu::ChangeStyle(CMenu* pMenu)
  111. {
  112. TRACE("CLineMenu::ChangeStylen");
  113. LPMENUITEM lpItem;
  114. CMenu *pSubMenu;
  115. int nPosition=0; //该变量用来绘制侧边位图
  116.     bool bGrayed;
  117. for(int i=(int)GetMenuItemCount()-1 ;i>=0; i--)
  118. {
  119. lpItem=new  MENUITEM();
  120. lpItem->uID=GetMenuItemID(i);
  121. lpItem->uPositionImageLeft =nPosition;
  122. if(pMenu->GetMenuState(i,MF_BYPOSITION)&MF_GRAYED){            
  123. bGrayed=TRUE;
  124. }else{
  125. bGrayed=FALSE;
  126. }
  127. if(lpItem->uID >0)
  128. nPosition +=m_nHeight;
  129. //Save the Text of menu item
  130.      pMenu->GetMenuString(i,lpItem->strText,MF_BYPOSITION);
  131. if(bGrayed){//通过标题挂带灰色标志
  132. lpItem->strText+="1";
  133. }else
  134. {
  135.  lpItem->strText+="0";
  136. }
  137. //if this item has sub item , call this function again
  138. pSubMenu =pMenu->GetSubMenu(i);
  139. if(pSubMenu)
  140. ChangeStyle(pSubMenu);
  141. }
  142. else
  143. {
  144. //((CLineMenu*)pMenu)->m_bGrayed=m_bGrayed;
  145. nPosition +=m_nSeparatorHeight;
  146. }
  147. //Change the mode of menu item
  148. pMenu->ModifyMenu(i,MF_BYPOSITION|MF_OWNERDRAW|MF_DISABLED,lpItem->uID,(LPCTSTR)lpItem);
  149.    m_ListMenu.AddTail(lpItem);
  150. }
  151. //SetTransparent(70);
  152. }
  153. //////////////////////////////////////////////////////////
  154. float CLineMenu::StrToFloat(CString str)
  155. /////////////////////////////////////////StrToFloat
  156. //Author: xgl
  157. //Date:   2004.3.17
  158. //str:    string that will be converted to float value
  159. // return value:
  160. // |____ if success,    float value of the str 
  161. // |____ if unsuccess,  0
  162. /////////////////////////////////////////
  163. {
  164. char  chGet;
  165. float fResult=0;
  166. int   nPos;
  167. float fMulty1=10,fMulty2=1,flag=1;
  168. for(nPos=0;nPos<str.GetLength();nPos++)
  169. {
  170. if((chGet=str.GetAt(nPos))=='.')
  171. { //if there are more than one '.' in the str
  172. //fMulty2 is a float data
  173. if(fMulty2<0.11&&fMulty2>0.09)
  174. {
  175. fResult=0;
  176. break;
  177. }
  178. fMulty1=1;
  179. fMulty2=0.1;
  180. flag=0.1;
  181. continue;
  182. }
  183. else if(chGet>='0'&&chGet<='9')
  184. {
  185. fResult=fResult*fMulty1+(chGet-'0')*fMulty2;
  186.             fMulty2=fMulty2*flag;
  187. }
  188. else
  189. {
  190.             fResult=0;
  191. break;
  192. }
  193. }
  194. return fResult;
  195. }
  196. /////////////////////////////////////////////////////////////////
  197. void CLineMenu::DrawLine(CDC *pDC, int xf,int yf,int xT,int yT, BOOL bSelected, BOOL bGrayed,int nWidth)
  198. {  
  199. TRACE("CLineMenu::DrawLinen");
  200. //you can add other operation about drawing line here 
  201. CPen pen,*poldPen;
  202. LOGBRUSH logbr;
  203. logbr.lbStyle=BS_SOLID;
  204. logbr.lbColor=RGB(0,0,0);
  205. if(bSelected){
  206. logbr.lbColor=RGB(127,127,255);
  207. }
  208. if(bGrayed){
  209.     logbr.lbColor=RGB(127,127,127);
  210. }    
  211. pen.CreatePen(PS_GEOMETRIC,nWidth, &logbr);  
  212. poldPen=pDC->SelectObject(&pen);      
  213. pDC->MoveTo(xf,yf);
  214. pDC->LineTo(xT,yT);
  215. pDC->SelectObject(poldPen);
  216. }
  217. ////////////////////////////////////////////////////
  218. void CLineMenu::DrawText(CDC *pDC, CRect &rtMenu,CRect rtText,BOOL bSelected, BOOL bGrayed, CString strText)
  219. {
  220. TRACE("CLineMenu::DrawTextn");
  221. if(bSelected)
  222. pDC->FillSolidRect(rtText,RGB(127,127,255));
  223. if(bGrayed)
  224. {
  225. GrayString(pDC,strText,rtText);
  226. }
  227. else
  228. {
  229. pDC->DrawText(strText,rtText,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  230. }
  231. }
  232. ///////////////////////////////////////
  233. void CLineMenu::GrayString(CDC *pDC, const CString &str, const CRect rect)
  234. {
  235. TRACE("CLineMenu::GrayStringn");
  236. CRect rt(rect);
  237. rt.left +=1;
  238. rt.top +=1;
  239. pDC->SetTextColor(RGB(255,255,255));
  240. pDC->DrawText(str,&rt,DT_EXPANDTABS|DT_VCENTER|DT_SINGLELINE);
  241. rt.left -=1;
  242. rt.top -=1;
  243. pDC->SetTextColor(RGB(128,128,128));
  244. pDC->DrawText(str,&rt,DT_EXPANDTABS|DT_VCENTER|DT_SINGLELINE);
  245. }
  246. void CLineMenu::SetTransparent(int i)
  247. {
  248. // if(i>100||i<0)
  249. // return;
  250. //  if(i == 0) //如果为0,则设为100,即不透明
  251. // i = 100;
  252. // //获得窗口句柄
  253. //    HWND hWnd =G_;
  254. //    //获取User32.DLL的句柄
  255. //    HMODULE hModule =GetModuleHandle("User32.DLL");    
  256. //    if(hModule == NULL)
  257. //    {
  258. //    //如果没有得到就退出
  259. //    return;
  260. //    }
  261. //    //自定义函数指针变量类型
  262. //    typedef BOOL (WINAPI* SETLAYEREDWND)( HWND, COLORREF, BYTE, DWORD);    
  263. //    //定义函数指针
  264. //    SETLAYEREDWND SetLayeredWindowPtr = NULL;
  265. //    //从User32.DLL中获得函数指针
  266. //    SetLayeredWindowPtr = (SETLAYEREDWND)GetProcAddress(hModule, "SetLayeredWindowAttributes");
  267. //    if(SetLayeredWindowPtr)
  268. //    {
  269. //    //获取原有窗口风格并加入WS_SYSMENU风格,因为只有此风格的窗口才能设置为透明
  270. //    LONG lStyle = GetWindowLong(hWnd, GWL_EXSTYLE) | WS_SYSMENU;
  271. //    //设置窗口风格
  272. //    SetWindowLong( hWnd, GWL_EXSTYLE, lStyle);    
  273. //    //设置窗口透明
  274. //    SetLayeredWindowPtr( hWnd, 0, BYTE((255 * i) / 100), 2);
  275. //    FreeLibrary(hModule);
  276. //    }    
  277. }
  278.