minica2的第2个版本

源代码在线查看: colorlistbox.cpp

软件大小: 4386 K
上传用户: toctory
关键词: minica2 版本
下载地址: 免注册下载 普通下载 VIP

相关代码

				// ColorListBox.cpp : implementation file
				//
				
				#include "stdafx.h"
				#include "..\..\MiniCA.h"
				#include "ColorListBox.h"
				#include "..\..\MiniMainDlg.h"
				#include "..\..\GenericClass\Language.h"
				
				#ifdef _DEBUG
				#define new DEBUG_NEW
				#undef THIS_FILE
				static char THIS_FILE[] = __FILE__;
				#endif
				
				/////////////////////////////////////////////////////////////////////////////
				// CColorListBox
				
				CColorListBox::CColorListBox()
				{
					m_BkColor = RGB(255,255,255);
					LOGFONT logFont;
					ZeroMemory((void*)&logFont,sizeof(logFont));
					strcpy(logFont.lfFaceName,"宋体");
					logFont.lfHeight = -12;
					logFont.lfWeight = 400;
					logFont.lfCharSet = GB2312_CHARSET;
					logFont.lfOutPrecision = 3;
					logFont.lfClipPrecision = 2; 
					logFont.lfQuality = 1;
					logFont.lfPitchAndFamily = 2;
					m_font.CreateFontIndirect(&logFont);
				//	m_pButYes = NULL;
				//	m_pButNo = NULL;
				
					m_FileName = "";
					m_bFirst = FALSE;
				
				/*	LOGBRUSH  logBrush;  
					logBrush.lbStyle  =   BS_SOLID;  
					logBrush.lbColor  =   RGB(240,240,240);
					logBrush.lbHatch  =   HS_CROSS;  
					m_brBmp.CreateBrushIndirect(&logBrush);	*/
				}
				
				CColorListBox::~CColorListBox()
				{
					if( m_bitmap.m_hObject != NULL )
						m_bitmap.DeleteObject();
				
					if( m_brBmp.m_hObject != NULL )
						m_brBmp.DeleteObject();
				
					if( m_font.m_hObject != NULL )
						m_font.DeleteObject();
				}
				
				
				BEGIN_MESSAGE_MAP(CColorListBox, CListBox)
					//{{AFX_MSG_MAP(CColorListBox)
					ON_WM_LBUTTONDBLCLK()
					ON_WM_RBUTTONDOWN()
					ON_WM_CREATE()
					ON_WM_DESTROY()
				//	ON_BN_CLICKED(IDC_B_NO, OnBNo)
				//	ON_BN_CLICKED(IDC_B_YES, OnBYes)
					ON_WM_VSCROLL()
					ON_WM_HSCROLL()
				//	ON_WM_ERASEBKGND()
					ON_WM_CTLCOLOR_REFLECT()
					ON_CONTROL_REFLECT(LBN_SELCHANGE, OnSelchange)
					ON_WM_PAINT()
					//}}AFX_MSG_MAP
				END_MESSAGE_MAP()
				
				/////////////////////////////////////////////////////////////////////////////
				// CColorListBox message handlers
				void CColorListBox::SetBkColor(COLORREF bkColor)//设置背景颜色,用于取消选择框时恢复原背景
				{
					m_BkColor = bkColor;
				}
				
				void CColorListBox::DrawItem(LPDRAWITEMSTRUCT lpDIS) 
				{
					// TODO: Add your code to draw the specified item
					if ((int)lpDIS->itemID < 0)
						return; 
				
					CDC* pDC = CDC::FromHandle(lpDIS->hDC);
				
					COLORREF crText;
					CString sText;
					COLORREF crNorm;	//文字颜色
					HICON icon;
					switch(lpDIS->itemData)
					{
						case M_OK:
							crNorm = RGB(0,128,0);
							icon = AfxGetApp()->LoadIcon(IDI_ICON_GREEN);
							break;
						case M_ERROR:
							crNorm = RGB(255,0,0);
							icon = AfxGetApp()->LoadIcon(IDI_ICON_RED);
							break;
						case M_WARING:
							crNorm = RGB(0,0,255);
							icon = AfxGetApp()->LoadIcon(IDI_ICON_BLUE);
							break;
					}
				
				
					// 字符串颜色
					COLORREF crHilite = RGB(255,128,0);
				
				//	COLORREF crHilite = RGB(255-GetRValue(crNorm), 255-GetGValue(crNorm), 255-GetBValue(crNorm));
					CRect rectBK(lpDIS->rcItem.left+20,lpDIS->rcItem.top,lpDIS->rcItem.right+18,lpDIS->rcItem.bottom);
				
				
					// 如果被选中,使用高亮色会矩形
				/*	if ((lpDIS->itemState & ODS_SELECTED) &&
						 (lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
					{
						pDC->DrawFocusRect(&lpDIS->rcItem); 
						CBrush brush(crNorm);
						pDC->FillRect(rectBK, &brush);
					}
				
					// 如果取消选中,恢复
					if (!(lpDIS->itemState & ODS_SELECTED) &&	(lpDIS->itemAction & ODA_SELECT))
					{
						//选择原来背景颜色
						CBrush brush(m_BkColor);
						pDC->FillRect(rectBK, &brush);
					}	 	
				
					// 绘制焦点矩形 
					if ((lpDIS->itemAction & ODA_FOCUS) && (lpDIS->itemState & ODS_FOCUS))
						pDC->DrawFocusRect(&lpDIS->rcItem); 
				
					// 取消焦点矩形
					if ((lpDIS->itemAction & ODA_FOCUS) &&	!(lpDIS->itemState & ODS_FOCUS))
						pDC->DrawFocusRect(&lpDIS->rcItem); 
				
				*/
					// 透明背景
					int nBkMode = pDC->SetBkMode(TRANSPARENT);
				
					if (lpDIS->itemData)		
					{
						if (lpDIS->itemState & ODS_SELECTED)
						{
							crText = pDC->SetTextColor(crHilite);
						}
						else if (lpDIS->itemState & ODS_DISABLED)
							crText = pDC->SetTextColor(::GetSysColor(COLOR_GRAYTEXT));
						else
							crText = pDC->SetTextColor(crNorm);
					}
					
					else
					{
						if (lpDIS->itemState & ODS_SELECTED)
							crText = pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
						else if (lpDIS->itemState & ODS_DISABLED)
							crText = pDC->SetTextColor(::GetSysColor(COLOR_GRAYTEXT));
						else
							crText = pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
					}
				
				
					// 显示字符串
					GetText(lpDIS->itemID, sText);
					CRect rect = lpDIS->rcItem;
				
					// 字符格式
					UINT nFormat = DT_LEFT | DT_SINGLELINE | DT_VCENTER;
					if (GetStyle() & LBS_USETABSTOPS)
						nFormat |= DT_EXPANDTABS;
				
				
					pDC->DrawText(sText, -1, &rectBK, nFormat | DT_CALCRECT&DT_CENTER);
					DrawIconEx(lpDIS->hDC,rect.left+2,rect.top+1,icon,16,16,0,NULL, DI_NORMAL | DI_COMPAT);
					pDC->SetTextColor(crText); 
					pDC->SetBkMode(nBkMode);		
					// restore the device context and free the icon.
				
				}
				
				void CColorListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
				{
					// TODO: Add your code to determine the size of specified item
					//设置每一项的高度
					lpMeasureItemStruct->itemHeight = ::GetSystemMetrics(SM_CYMENU);
				}
				
				int CColorListBox::AddMsg(CString lpszItem,	DWORD info)
				{
					if(lpszItem.IsEmpty())
						return 0;
					int nItem = AddString(CMiniCaApp::NormalCode(lpszItem));
					if (nItem >= 0)
						SetItemData(nItem, info);
					int numList=GetCount()-1;
					SetTopIndex(numList);
					SetCurSel(numList);
					//水平滚动
					int max_width=0;
					CSize sz;
					CClientDC dc(this);
					for(int i=0;i					{
						GetText(i,lpszItem);
						sz=dc.GetTextExtent(lpszItem);
						if(max_width							max_width=sz.cx;
					}
					SendMessage(LB_SETHORIZONTALEXTENT,max_width,0);
				
					return nItem;
				}
				
				void CColorListBox::DeleteLast()
				{
					//第一次加入,以后每次先删除上次的,然后加入新的
					int iCount = GetCount();
				
					if(iCount >= 1)
						DeleteString(iCount - 1);
				}
				
				void CColorListBox::OnLButtonDblClk(UINT nFlags, CPoint point) 
				{
					// TODO: Add your message handler code here and/or call default
					int iCurSel = GetCurSel();
					if(iCurSel != -1)
					{
						CString strCurSel,strPage;
						GetText(iCurSel,strCurSel);
						//查找相关选项
						int iLeft,iRight;
						iLeft = strCurSel.Find('(',0);
						iRight = strCurSel.Find(')',iLeft);
						strPage = strCurSel.Mid(iLeft+1,(iRight - iLeft -1));
						if(!strPage.IsEmpty())
						{
							((CMiniMainDlg *)AfxGetMainWnd())->GotoPage(strPage);
						}
					}
					CListBox::OnLButtonDblClk(nFlags, point);
				}
				
				void CColorListBox::OnRButtonDown(UINT nFlags, CPoint point) 
				{
					// TODO: Add your message handler code here and/or call default IDR_MENU_INFO
					CPoint pt;
					GetCursorPos(&pt); // 当前鼠标坐标
					if(GetCount()						return;
					BCMenu m_PopMenu;
					m_PopMenu.LoadMenu(IDR_MENU_INFO);
					m_PopMenu.LoadToolbar(IDR_MINICAMENU);
				
					CLanguage::TranslateMenu(&m_PopMenu, MAKEINTRESOURCE(IDR_MENU_INFO));
				
					CMenu * pPopup = m_PopMenu.GetSubMenu(0);
					SetForegroundWindow(); //点击可以关闭
					ASSERT(pPopup);
					UINT nSelection = pPopup->TrackPopupMenu(TPM_RIGHTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL|
						TPM_NONOTIFY|TPM_RETURNCMD,pt.x, pt.y,this, NULL);
					m_PopMenu.DestroyMenu();
					//返回菜单id
					if(nSelection == ID_MENUITEM_DELINFO)//删除
					{
						ResetContent(); 
					}
					else if(nSelection == ID_MENUITEM_SAVEINFO)//保存
					{
						CFile file;
						if(file.Open(m_FileName,CFile::modeWrite|CFile::modeCreate))
						{
							CString str;
				
							for(int i=0; i							{
								GetText(i,str);
								str+="\r\n";
								file.Write(str.GetBuffer(0),strlen(str));
							}
							file.Close();
						}
						else
						{
							CString str;
							str.Format("保存文件%s失败",m_FileName);
							AddMsg(str,M_ERROR);
						}
					}
					
					CListBox::OnRButtonDown(nFlags, point);
				}
				
				int CColorListBox::OnCreate(LPCREATESTRUCT lpCreateStruct) 
				{
					if (CListBox::OnCreate(lpCreateStruct) == -1)
						return -1;
					
					SetFont(&m_font);
					// TODO: Add your specialized creation code here
					
					return 0;
				}
				
				/*void CColorListBox::AddButInfo(CString lpszItem,DWORD info)
				{
					if(lpszItem.IsEmpty())
						return ;
					int nItem = AddString(lpszItem);
					if (nItem >= 0)
						SetItemData(nItem,info);
					int numList=GetCount()-1;
					SetTopIndex(numList);
					SetCurSel(numList);
				
					DestroyBtn();
				
					m_pButYes = new CButtonST;
					m_pButNo = new CButtonST;
					ASSERT(m_pButYes);
					ASSERT(m_pButNo);
					CRect rText;
					GetItemRect(nItem, rText);
				
					UINT len = lpszItem.GetLength();
					
					CRect r;
					r.top = rText.top + (rText.Height() - 16)/2;
					r.left = rText.left + lpszItem.GetLength() * 8;
					r.right = r.left + 17; //Ask the edit box for the width to use
					r.bottom = r.top + 17;
				
				
					m_pButYes->Create("",WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, r, 
						this, IDC_B_YES);
					m_pButYes->SetIcon(IDI_ICON_YES);
				
					r.left = r.left + 25;
					r.right = r.left + 17; //Ask the edit box for the width to use
					m_pButNo->Create("",WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, r, 
						this, IDC_B_NO);
					m_pButNo->SetIcon(IDI_ICON_NO);
					//锁定
				}*/
				
				void CColorListBox::OnDestroy() 
				{
					CListBox::OnDestroy();
					
					// TODO: Add your message handler code here
					DestroyBtn();	
				}
				
				void CColorListBox::DestroyBtn()
				{
				/*	if (m_pButYes)
					{
						m_pButYes->DestroyWindow();
						delete m_pButYes;
						m_pButYes = NULL;
					}
				
					if (m_pButNo)
					{
						m_pButNo->DestroyWindow();
						delete m_pButNo;
						m_pButNo = NULL;
					}*/
				}
				
				/*void CColorListBox::OnBNo() 
				{
					// TODO: Add your control notification handler code here
					AfxMessageBox("NO");
					DestroyBtn();
				}
				
				void CColorListBox::OnBYes() 
				{
					// TODO: Add your control notification handler code here
					AfxMessageBox("YES");
					DestroyBtn();
				}*/
				
				void CColorListBox::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
				{
					// TODO: Add your message handler code here and/or call default
					Invalidate();		
					CListBox::OnVScroll(nSBCode, nPos, pScrollBar);
				}
				
				void CColorListBox::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
				{
					// TODO: Add your message handler code here and/or call default
					Invalidate();		
					CListBox::OnHScroll(nSBCode, nPos, pScrollBar);
				}
				
				/*BOOL CColorListBox::OnEraseBkgnd(CDC* pDC) 
				{
					// TODO: Add your message handler code here and/or call default
					CRect rectbk; // 客户区的大小 
					CDC dcMen; // 内存设备描述表 
					// 得到位图bitmap的大小 
					BITMAP stBitmap; 
					m_bitmap.GetObject(sizeof(BITMAP),&stBitmap); 
					CSize bmsize(stBitmap.bmWidth,stBitmap.bmHeight); 
				
					dcMen.CreateCompatibleDC(pDC); // 创建兼容的设备描述表 
				
					// 选入新的位图对象并保存旧的位图对象 
					CBitmap * pold = dcMen.SelectObject(&m_bitmap); 
					GetClientRect(&rectbk); 
					// 取得客户区的大小 
					// 从内存向屏幕复制位图对象 
					pDC->StretchBlt(rectbk.left,rectbk.top,rectbk.Width(), 
						rectbk.Height(),&dcMen,rectbk.left,rectbk.top,bmsize.cx,
						bmsize.cy,SRCCOPY); 
				
					dcMen.SelectObject(pold); 
					// 恢复旧的位图对象 
					dcMen.DeleteDC(); 
					// 释放内存设备描述表 
				//	return FALSE;
					return CListBox::OnEraseBkgnd(pDC);
				}*/
				
				BOOL CColorListBox::SetBkImage(UINT nIDResource)
				{
					if( m_bitmap.m_hObject != NULL )
						m_bitmap.DeleteObject();
					
					HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), 
						MAKEINTRESOURCE(nIDResource), IMAGE_BITMAP, 0, 0, 
						LR_CREATEDIBSECTION);
				
				    LOGBRUSH LogBrush;
				    LogBrush.lbStyle = BS_PATTERN;
				    LogBrush.lbHatch = (LONG)hbmp;
				
					m_brBmp.CreateBrushIndirect(&LogBrush);	
				
					if( hbmp == NULL ) 
						return FALSE;
					
					m_bitmap.Attach( hbmp );
					return TRUE;	
				}
				
				HBRUSH CColorListBox::CtlColor(CDC* pDC, UINT nCtlColor) 
				{
					// TODO: Change any attributes of the DC here
					return m_brBmp;	//显示图像
					// TODO: Return a non-NULL brush if the parent's handler should not be called
				}
				
				void CColorListBox::OnSelchange() 
				{
					// TODO: Add your control notification handler code here
					Invalidate();			
				}
				
				void CColorListBox::SetSaveFile(CString strFileName)
				{
					m_FileName = strFileName;
				}
							

相关资源