ColorListBox.cpp
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:11k
源码类别:

CA认证

开发平台:

Visual C++

  1. // ColorListBox.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "....MiniCA.h"
  5. #include "ColorListBox.h"
  6. #include "....MiniMainDlg.h"
  7. #include "....GenericClassLanguage.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CColorListBox
  15. CColorListBox::CColorListBox()
  16. {
  17. m_BkColor = RGB(255,255,255);
  18. LOGFONT logFont;
  19. ZeroMemory((void*)&logFont,sizeof(logFont));
  20. strcpy(logFont.lfFaceName,"宋体");
  21. logFont.lfHeight = -12;
  22. logFont.lfWeight = 400;
  23. logFont.lfCharSet = GB2312_CHARSET;
  24. logFont.lfOutPrecision = 3;
  25. logFont.lfClipPrecision = 2; 
  26. logFont.lfQuality = 1;
  27. logFont.lfPitchAndFamily = 2;
  28. m_font.CreateFontIndirect(&logFont);
  29. // m_pButYes = NULL;
  30. // m_pButNo = NULL;
  31. m_FileName = "";
  32. m_bFirst = FALSE;
  33. /* LOGBRUSH  logBrush;  
  34. logBrush.lbStyle  =   BS_SOLID;  
  35. logBrush.lbColor  =   RGB(240,240,240);
  36. logBrush.lbHatch  =   HS_CROSS;  
  37. m_brBmp.CreateBrushIndirect(&logBrush); */
  38. }
  39. CColorListBox::~CColorListBox()
  40. {
  41. if( m_bitmap.m_hObject != NULL )
  42. m_bitmap.DeleteObject();
  43. if( m_brBmp.m_hObject != NULL )
  44. m_brBmp.DeleteObject();
  45. if( m_font.m_hObject != NULL )
  46. m_font.DeleteObject();
  47. }
  48. BEGIN_MESSAGE_MAP(CColorListBox, CListBox)
  49. //{{AFX_MSG_MAP(CColorListBox)
  50. ON_WM_LBUTTONDBLCLK()
  51. ON_WM_RBUTTONDOWN()
  52. ON_WM_CREATE()
  53. ON_WM_DESTROY()
  54. // ON_BN_CLICKED(IDC_B_NO, OnBNo)
  55. // ON_BN_CLICKED(IDC_B_YES, OnBYes)
  56. ON_WM_VSCROLL()
  57. ON_WM_HSCROLL()
  58. // ON_WM_ERASEBKGND()
  59. ON_WM_CTLCOLOR_REFLECT()
  60. ON_CONTROL_REFLECT(LBN_SELCHANGE, OnSelchange)
  61. ON_WM_PAINT()
  62. //}}AFX_MSG_MAP
  63. END_MESSAGE_MAP()
  64. /////////////////////////////////////////////////////////////////////////////
  65. // CColorListBox message handlers
  66. void CColorListBox::SetBkColor(COLORREF bkColor)//设置背景颜色,用于取消选择框时恢复原背景
  67. {
  68. m_BkColor = bkColor;
  69. }
  70. void CColorListBox::DrawItem(LPDRAWITEMSTRUCT lpDIS) 
  71. {
  72. // TODO: Add your code to draw the specified item
  73. if ((int)lpDIS->itemID < 0)
  74. return; 
  75. CDC* pDC = CDC::FromHandle(lpDIS->hDC);
  76. COLORREF crText;
  77. CString sText;
  78. COLORREF crNorm; //文字颜色
  79. HICON icon;
  80. switch(lpDIS->itemData)
  81. {
  82. case M_OK:
  83. crNorm = RGB(0,128,0);
  84. icon = AfxGetApp()->LoadIcon(IDI_ICON_GREEN);
  85. break;
  86. case M_ERROR:
  87. crNorm = RGB(255,0,0);
  88. icon = AfxGetApp()->LoadIcon(IDI_ICON_RED);
  89. break;
  90. case M_WARING:
  91. crNorm = RGB(0,0,255);
  92. icon = AfxGetApp()->LoadIcon(IDI_ICON_BLUE);
  93. break;
  94. }
  95. // 字符串颜色
  96. COLORREF crHilite = RGB(255,128,0);
  97. // COLORREF crHilite = RGB(255-GetRValue(crNorm), 255-GetGValue(crNorm), 255-GetBValue(crNorm));
  98. CRect rectBK(lpDIS->rcItem.left+20,lpDIS->rcItem.top,lpDIS->rcItem.right+18,lpDIS->rcItem.bottom);
  99. // 如果被选中,使用高亮色会矩形
  100. /* if ((lpDIS->itemState & ODS_SELECTED) &&
  101.  (lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
  102. {
  103. pDC->DrawFocusRect(&lpDIS->rcItem); 
  104. CBrush brush(crNorm);
  105. pDC->FillRect(rectBK, &brush);
  106. }
  107. // 如果取消选中,恢复
  108. if (!(lpDIS->itemState & ODS_SELECTED) && (lpDIS->itemAction & ODA_SELECT))
  109. {
  110. //选择原来背景颜色
  111. CBrush brush(m_BkColor);
  112. pDC->FillRect(rectBK, &brush);
  113. }  
  114. // 绘制焦点矩形 
  115. if ((lpDIS->itemAction & ODA_FOCUS) && (lpDIS->itemState & ODS_FOCUS))
  116. pDC->DrawFocusRect(&lpDIS->rcItem); 
  117. // 取消焦点矩形
  118. if ((lpDIS->itemAction & ODA_FOCUS) && !(lpDIS->itemState & ODS_FOCUS))
  119. pDC->DrawFocusRect(&lpDIS->rcItem); 
  120. */
  121. // 透明背景
  122. int nBkMode = pDC->SetBkMode(TRANSPARENT);
  123. if (lpDIS->itemData)
  124. {
  125. if (lpDIS->itemState & ODS_SELECTED)
  126. {
  127. crText = pDC->SetTextColor(crHilite);
  128. }
  129. else if (lpDIS->itemState & ODS_DISABLED)
  130. crText = pDC->SetTextColor(::GetSysColor(COLOR_GRAYTEXT));
  131. else
  132. crText = pDC->SetTextColor(crNorm);
  133. }
  134. else
  135. {
  136. if (lpDIS->itemState & ODS_SELECTED)
  137. crText = pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
  138. else if (lpDIS->itemState & ODS_DISABLED)
  139. crText = pDC->SetTextColor(::GetSysColor(COLOR_GRAYTEXT));
  140. else
  141. crText = pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
  142. }
  143. // 显示字符串
  144. GetText(lpDIS->itemID, sText);
  145. CRect rect = lpDIS->rcItem;
  146. // 字符格式
  147. UINT nFormat = DT_LEFT | DT_SINGLELINE | DT_VCENTER;
  148. if (GetStyle() & LBS_USETABSTOPS)
  149. nFormat |= DT_EXPANDTABS;
  150. pDC->DrawText(sText, -1, &rectBK, nFormat | DT_CALCRECT&DT_CENTER);
  151. DrawIconEx(lpDIS->hDC,rect.left+2,rect.top+1,icon,16,16,0,NULL, DI_NORMAL | DI_COMPAT);
  152. pDC->SetTextColor(crText); 
  153. pDC->SetBkMode(nBkMode);
  154. // restore the device context and free the icon.
  155. }
  156. void CColorListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
  157. {
  158. // TODO: Add your code to determine the size of specified item
  159. //设置每一项的高度
  160. lpMeasureItemStruct->itemHeight = ::GetSystemMetrics(SM_CYMENU);
  161. }
  162. int CColorListBox::AddMsg(CString lpszItem, DWORD info)
  163. {
  164. if(lpszItem.IsEmpty())
  165. return 0;
  166. int nItem = AddString(CMiniCaApp::NormalCode(lpszItem));
  167. if (nItem >= 0)
  168. SetItemData(nItem, info);
  169. int numList=GetCount()-1;
  170. SetTopIndex(numList);
  171. SetCurSel(numList);
  172. //水平滚动
  173. int max_width=0;
  174. CSize sz;
  175. CClientDC dc(this);
  176. for(int i=0;i<GetCount();i++)
  177. {
  178. GetText(i,lpszItem);
  179. sz=dc.GetTextExtent(lpszItem);
  180. if(max_width<sz.cx)
  181. max_width=sz.cx;
  182. }
  183. SendMessage(LB_SETHORIZONTALEXTENT,max_width,0);
  184. return nItem;
  185. }
  186. void CColorListBox::DeleteLast()
  187. {
  188. //第一次加入,以后每次先删除上次的,然后加入新的
  189. int iCount = GetCount();
  190. if(iCount >= 1)
  191. DeleteString(iCount - 1);
  192. }
  193. void CColorListBox::OnLButtonDblClk(UINT nFlags, CPoint point) 
  194. {
  195. // TODO: Add your message handler code here and/or call default
  196. int iCurSel = GetCurSel();
  197. if(iCurSel != -1)
  198. {
  199. CString strCurSel,strPage;
  200. GetText(iCurSel,strCurSel);
  201. //查找相关选项
  202. int iLeft,iRight;
  203. iLeft = strCurSel.Find('(',0);
  204. iRight = strCurSel.Find(')',iLeft);
  205. strPage = strCurSel.Mid(iLeft+1,(iRight - iLeft -1));
  206. if(!strPage.IsEmpty())
  207. {
  208. ((CMiniMainDlg *)AfxGetMainWnd())->GotoPage(strPage);
  209. }
  210. }
  211. CListBox::OnLButtonDblClk(nFlags, point);
  212. }
  213. void CColorListBox::OnRButtonDown(UINT nFlags, CPoint point) 
  214. {
  215. // TODO: Add your message handler code here and/or call default IDR_MENU_INFO
  216. CPoint pt;
  217. GetCursorPos(&pt); // 当前鼠标坐标
  218. if(GetCount()<=0)
  219. return;
  220. BCMenu m_PopMenu;
  221. m_PopMenu.LoadMenu(IDR_MENU_INFO);
  222. m_PopMenu.LoadToolbar(IDR_MINICAMENU);
  223. CLanguage::TranslateMenu(&m_PopMenu, MAKEINTRESOURCE(IDR_MENU_INFO));
  224. CMenu * pPopup = m_PopMenu.GetSubMenu(0);
  225. SetForegroundWindow(); //点击可以关闭
  226. ASSERT(pPopup);
  227. UINT nSelection = pPopup->TrackPopupMenu(TPM_RIGHTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL|
  228. TPM_NONOTIFY|TPM_RETURNCMD,pt.x, pt.y,this, NULL);
  229. m_PopMenu.DestroyMenu();
  230. //返回菜单id
  231. if(nSelection == ID_MENUITEM_DELINFO)//删除
  232. {
  233. ResetContent(); 
  234. }
  235. else if(nSelection == ID_MENUITEM_SAVEINFO)//保存
  236. {
  237. CFile file;
  238. if(file.Open(m_FileName,CFile::modeWrite|CFile::modeCreate))
  239. {
  240. CString str;
  241. for(int i=0; i<GetCount();i++)
  242. {
  243. GetText(i,str);
  244. str+="rn";
  245. file.Write(str.GetBuffer(0),strlen(str));
  246. }
  247. file.Close();
  248. }
  249. else
  250. {
  251. CString str;
  252. str.Format("保存文件%s失败",m_FileName);
  253. AddMsg(str,M_ERROR);
  254. }
  255. }
  256. CListBox::OnRButtonDown(nFlags, point);
  257. }
  258. int CColorListBox::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  259. {
  260. if (CListBox::OnCreate(lpCreateStruct) == -1)
  261. return -1;
  262. SetFont(&m_font);
  263. // TODO: Add your specialized creation code here
  264. return 0;
  265. }
  266. /*void CColorListBox::AddButInfo(CString lpszItem,DWORD info)
  267. {
  268. if(lpszItem.IsEmpty())
  269. return ;
  270. int nItem = AddString(lpszItem);
  271. if (nItem >= 0)
  272. SetItemData(nItem,info);
  273. int numList=GetCount()-1;
  274. SetTopIndex(numList);
  275. SetCurSel(numList);
  276. DestroyBtn();
  277. m_pButYes = new CButtonST;
  278. m_pButNo = new CButtonST;
  279. ASSERT(m_pButYes);
  280. ASSERT(m_pButNo);
  281. CRect rText;
  282. GetItemRect(nItem, rText);
  283. UINT len = lpszItem.GetLength();
  284. CRect r;
  285. r.top = rText.top + (rText.Height() - 16)/2;
  286. r.left = rText.left + lpszItem.GetLength() * 8;
  287. r.right = r.left + 17; //Ask the edit box for the width to use
  288. r.bottom = r.top + 17;
  289. m_pButYes->Create("",WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, r, 
  290. this, IDC_B_YES);
  291. m_pButYes->SetIcon(IDI_ICON_YES);
  292. r.left = r.left + 25;
  293. r.right = r.left + 17; //Ask the edit box for the width to use
  294. m_pButNo->Create("",WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, r, 
  295. this, IDC_B_NO);
  296. m_pButNo->SetIcon(IDI_ICON_NO);
  297. //锁定
  298. }*/
  299. void CColorListBox::OnDestroy() 
  300. {
  301. CListBox::OnDestroy();
  302. // TODO: Add your message handler code here
  303. DestroyBtn();
  304. }
  305. void CColorListBox::DestroyBtn()
  306. {
  307. /* if (m_pButYes)
  308. {
  309. m_pButYes->DestroyWindow();
  310. delete m_pButYes;
  311. m_pButYes = NULL;
  312. }
  313. if (m_pButNo)
  314. {
  315. m_pButNo->DestroyWindow();
  316. delete m_pButNo;
  317. m_pButNo = NULL;
  318. }*/
  319. }
  320. /*void CColorListBox::OnBNo() 
  321. {
  322. // TODO: Add your control notification handler code here
  323. AfxMessageBox("NO");
  324. DestroyBtn();
  325. }
  326. void CColorListBox::OnBYes() 
  327. {
  328. // TODO: Add your control notification handler code here
  329. AfxMessageBox("YES");
  330. DestroyBtn();
  331. }*/
  332. void CColorListBox::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  333. {
  334. // TODO: Add your message handler code here and/or call default
  335. Invalidate();
  336. CListBox::OnVScroll(nSBCode, nPos, pScrollBar);
  337. }
  338. void CColorListBox::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  339. {
  340. // TODO: Add your message handler code here and/or call default
  341. Invalidate();
  342. CListBox::OnHScroll(nSBCode, nPos, pScrollBar);
  343. }
  344. /*BOOL CColorListBox::OnEraseBkgnd(CDC* pDC) 
  345. {
  346. // TODO: Add your message handler code here and/or call default
  347. CRect rectbk; // 客户区的大小 
  348. CDC dcMen; // 内存设备描述表 
  349. // 得到位图bitmap的大小 
  350. BITMAP stBitmap; 
  351. m_bitmap.GetObject(sizeof(BITMAP),&stBitmap); 
  352. CSize bmsize(stBitmap.bmWidth,stBitmap.bmHeight); 
  353. dcMen.CreateCompatibleDC(pDC); // 创建兼容的设备描述表 
  354. // 选入新的位图对象并保存旧的位图对象 
  355. CBitmap * pold = dcMen.SelectObject(&m_bitmap); 
  356. GetClientRect(&rectbk); 
  357. // 取得客户区的大小 
  358. // 从内存向屏幕复制位图对象 
  359. pDC->StretchBlt(rectbk.left,rectbk.top,rectbk.Width(), 
  360. rectbk.Height(),&dcMen,rectbk.left,rectbk.top,bmsize.cx,
  361. bmsize.cy,SRCCOPY); 
  362. dcMen.SelectObject(pold); 
  363. // 恢复旧的位图对象 
  364. dcMen.DeleteDC(); 
  365. // 释放内存设备描述表 
  366. // return FALSE;
  367. return CListBox::OnEraseBkgnd(pDC);
  368. }*/
  369. BOOL CColorListBox::SetBkImage(UINT nIDResource)
  370. {
  371. if( m_bitmap.m_hObject != NULL )
  372. m_bitmap.DeleteObject();
  373. HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), 
  374. MAKEINTRESOURCE(nIDResource), IMAGE_BITMAP, 0, 0, 
  375. LR_CREATEDIBSECTION);
  376.     LOGBRUSH LogBrush;
  377.     LogBrush.lbStyle = BS_PATTERN;
  378.     LogBrush.lbHatch = (LONG)hbmp;
  379. m_brBmp.CreateBrushIndirect(&LogBrush);
  380. if( hbmp == NULL ) 
  381. return FALSE;
  382. m_bitmap.Attach( hbmp );
  383. return TRUE;
  384. }
  385. HBRUSH CColorListBox::CtlColor(CDC* pDC, UINT nCtlColor) 
  386. {
  387. // TODO: Change any attributes of the DC here
  388. return m_brBmp; //显示图像
  389. // TODO: Return a non-NULL brush if the parent's handler should not be called
  390. }
  391. void CColorListBox::OnSelchange() 
  392. {
  393. // TODO: Add your control notification handler code here
  394. Invalidate();
  395. }
  396. void CColorListBox::SetSaveFile(CString strFileName)
  397. {
  398. m_FileName = strFileName;
  399. }