在VC++应用程序中实现颜色选择组合框_第1页
在VC++应用程序中实现颜色选择组合框_第2页
在VC++应用程序中实现颜色选择组合框_第3页
在VC++应用程序中实现颜色选择组合框_第4页
在VC++应用程序中实现颜色选择组合框_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在VC++应用程序中实现颜色选择组合框相信读者朋友们对OFFICE2000一定非常熟悉吧,它里面的东东可真不少,不管是活泼可爱的”大眼夹",还是各种平面造型的Windows控件都很受广大用户喜欢。那么这次就让我们来模仿它做个十分常用的控件:”颜色组合框”。如果你现在正在做关于字处理类的软件时这个”东东”一定对你有用。程序编译运行后的界面效果如图一所示:MhJMRLiWU二|crEJLSSDUn)-图一、颜色选择组合框MhJMRLiWU二|crEJLSSDUn)-一、实现方法首先让我们先来了解一下画控件的基本原理和过程,也许这个才是本文的原意。大家都知道Windows中所有可视的东西都是画出来的,那么这个画画的内部过程又是怎样的呢?一般画Windows控件的过程分为三大部分:一是在WM_MEASUREITEM消息影射函数中设置当前要画的Item的大小尺寸;二是在WM_DRAWITEM消息影射函数中根据Item的大小尺寸来画该Item(图标/位图/字符串等);三是在WM_PAINT消息映射函数中不断的绘制当前的控件内容。下面我们针对CBSColorComboBox类的这几个过程来做个简单的介绍:在WM_MEASUREITEM消息影射函数中设定Item的大小尺寸的时候,我们只需要设置Item的高度即可。这里的高度我们设置为2倍的系统小图标(SMALLICON)的高度,其尺寸用::GetSystemMetrics(SM_CXSMICON)取得。VisualC++的程序开发人员可以在Item的矩形区域内画各种各样的信息,例如:图标/位图/字符串等等。那么有人会疑问:”我们用什么来画?我们在哪里画?又如何来画呢?”。答案其实都在这个LPDRAWITEMSTRUCT结构中°hDC成员为设备上下文环境(HDC),获得了该设备句柄也就意味着我们拥有了画任何位图/图标/文本的能力;那么接下来的问题就是:我们在哪里来画呢?答案也很简单:获得LPDRAWITEMSTRUCT结构中Item的矩形区域(rcItem),那么这就是你施展才华的空间了,要充分利用它哦!最后一步就是如何来画的问题了,说白了就是如何分配每个元素的空间,如何在它们各自的空间上画出你想要的东西。按照常规一般分别计算出ICON所占的矩形区域/文本所占的矩形区域/位图的矩形区域,如果你还有其他元素那么也应该计算出该元素所占的矩形区域/位图所占的矩形区域。接下来的一切都很简单了,不外乎CDC类的几个常用函数:画图标用DrawIconO、画位图用BitBlt()、画文字用DrawText()等函数。如果你觉得视觉上还不够COOL,你还可以来设置各个Item的文本颜色,背景颜色,以及图标的突起和凹陷的视觉效果。不过在上述过程中需要注意三个问题,一是为了消除不断绘制所带来的闪烁现象,需要在WM_ERASEBKGND消息响应中作些特殊处理;在WM_PAINT消息中直接把组合框的客户区当成一幅位图来不断更新,而不是对ICON区域和文本区域分别重绘。二是每当用户改变了组合框的当前内容后,在画新的Item之前一定要记得清除前次组合框内的内容。三是如果想选择更多的颜色,那么只要选择组合框中的最后一个Item(MoreColors)即可,这个Item是为用户自定义颜色而专门设置的。二、编程步骤1、启动VisualC++6.0,生成一个基于对话框的项目,将该项目命名为"WW";2、使用ClassWizard新建一个类CBSColorComboBox,其基类选择为CComboBox类;3、在程序的对话框中放置一个ComboBox控件,使用CLASSWIZARD添加相应的CComboBox类成员变量,然后将该成员变量的类型修改为CBSColorComboBox;4、添加代码,编译运行程序。三、程序代码//////////////////////////////////////////////////////////////CBSColorComboBox类的头文件;#if!defined(_BS_BSCOLORCB)#define_BS_BSCOLORCB#include〃系统常用颜色的自定义名称conststaticchar*strColorName[]={”crSCROLLBAR”,”crBACKGROUND”,”crACTIVECAPTION”,"crINACTIVECAPTION","crMENU","crWINDOW","crWINDOWFRAME","crMENUTEXT","crWINDOWTEXT","crCAPTIONTEXT","crACTIVEBORDER”,"crINACTIVEBORDER”,"crAPPWORKSPACE","crHIGHLIGHT","crHIGHLIGHTTEXT","crBTNFACE","crBTNSHADOW","crGRAYTEXT","crBTNTEXT","crGRAYTEXT","crBTNTEXT","crINACTIVECAPTIONTEXT",”crBTNHIGHLIGHT”,”cr3DDKSHADOW”,"cr3DLIGHT”,"crINFOTEXT","crINFOBK","crHOTLIGHT”,"crGRADIENTACTIVECAPTION”,crGRADIENTINACTIVECAPTION"typedefstructBSCBITEM{intiIndex;COLORREFcrColor;LPCTSTRlpCaption;}BSCBITEM,*LPBSCBITEM;classCBSColorComboBox:publicCComboBox{DECLARE_DYNCREATE(CBSColorComboBox)public:CBSColorComboBox();virtual~CBSColorComboBox();BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);//初始化组合框(第一个被调用的函数)voidInitBSColorCB(void);//得到当前的颜色值或R/G/B值COLORREFGetColor();voidGetRGBValue(int*R,int*G,int*B);public://{{AFX_VIRTUAL(CBSColorComboBox)public:virtualvoidDrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct);virtualvoidMeasureItem(LPMEASUREITEMSTRUCTlpMeasureItemStruct);//}}AFX_VIRTUALprotected:boolm_bOverControl;〃鼠标的状态(是否处于按钮上)intiIconX,iIconY;//SMALLICON的大小尺寸COLORREFm_crColor;〃当前选中的颜色CListm_crItem;voidOnCBPaint(CDC*pDC);LPBSCBITEMGetItem(intiIndex=0);protected://{{AFX_MSG(CBSColorComboBox)afx_msgBOOLOnEraseBkgnd(CDC*pDC);afx_msgvoidOnPaint();afx_msgvoidOnTimer(UINTnIDEvent);afx_msgvoidOnMouseMove(UINTnFlags,CPointpoint);afx_msgvoidOnSelchange();afx_msgvoidOnSelendok();//}}AFX_MSGDECLARE_MESSAGE_MAP()};#endif//!defined(_BS_BSCOLORCB)///////////////////////////////////////////////////////////////CBSColorComboBox的实现文件;#include"stdafx.h"#include"BSColorComboBox.h"CBSColorComboBox::CBSColorComboBox(){〃当前鼠标是否在对象上m_bOverControl=false;//小图标尺寸iIconX=::GetSystemMetrics(SM_CXSMICON);iIconY=::GetSystemMetrics(SM_CYSMICON);}CBSColorComboBox::~CBSColorComboBox(){while(!m_crItem.IsEmpty()){LPBSCBITEMlpItem=m_crItem.RemoveHead();deletelpItem;}}BOOLCBSColorComboBox::Create(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID){DWORDdw=dwStyle;if(!CComboBox::Create(dw,rect,pParentWnd,nID))returnfalse;CFont*font=CFont::FromHandle((HFONT)::GetStockObject(DEFAULT_GUI_FONT));SetFont(font);returntrue;}IMPLEMENT_DYNCREATE(CBSColorComboBox,CComboBox)BEGIN_MESSAGE_MAP(CBSColorComboBox,CComboBox)//{{AFX_MSG_MAP(CBSColorComboBox)ON_WM_ERASEBKGND()ON_WM_PAINT()ON_WM_TIMER()ON_WM_MOUSEMOVE()ON_CONTROL_REFLECT(CBN_SELCHANGE,OnSelchange)ON_CONTROL_REFLECT(CBN_SELENDOK,OnSelendok)//}}AFX_MSG_MAPEND_MESSAGE_MAP()voidCBSColorComboBox::InitBSColorCB(void)intiMinColor=COLOR_SCROLLBAR,iMaxColor=COLOR_BTNHIGHLIGHT;if(WINVER>=0x0400)iMaxColor=COLOR_INFOBK;if(WINVER>=0x0500)iMaxColor=28;//初始化CB颜色列表框的Item(常见的SysColor值)for(intiLoop=iMinColor;iLoop<=iMaxColor;++iLoop){LPBSCBITEMlpItem=newBSCBITEM;lpItem->iIndex=AddString(strColorName[iLoop]);lpItem->crColor=::GetSysColor(iLoop);lpItem->lpCaption=strColorName[iLoop];//if(m_crItem.IsEmpty())m_crItem.AddHead(lpItem);elsem_crItem.AddTail(lpItem);}〃该Item是为了用户自定义颜色而设置LPBSCBITEMlpItem=newBSCBITEM;lpItem->iIndex=AddString("MoreColors");lpItem->crColor=RGB(213,233,249);lpItem->lpCaption="MoreColors";if(m_crItem.IsEmpty())m_crItem.AddHead(lpItem);elsem_crItem.AddTail(lpItem);〃初始化当前颜色m_crColor=m_crItem.GetHead()->crColor;}BOOLCBSColorComboBox::OnEraseBkgnd(CDC*pDC){ASSERT(pDC->GetSafeHdc());returnfalse;}voidCBSColorComboBox::OnPaint(){CPaintDCdc(this);OnCBPaint(&dc);}voidCBSColorComboBox::OnCBPaint(CDC*pDC){ASSERT(pDC->GetSafeHdc());//绘制客户区CDCdMemDC;dMemDC.CreateCompatibleDC(pDC);dMemDC.SetMapMode(pDC->GetMapMode());//画动作CBitmapmNewBmp;RECTrc;GetClientRect(&rc);mNewBmp.CreateCompatibleBitmap(pDC,rc.right-rc.left,rc.bottom-rc.top);CBitmap*pOldBmp=dMemDC.SelectObject(&mNewBmp);//子类可以以friend方式来访问父类的protected成员变量和函数CWnd::DefWindowProc(WM_PAINT,(WPARAM)dMemDC.m_hDC,0);pDC->BitBlt(rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top,&dMemDC,rc.left,rc.top,SRCCOPY);//恢复dMemDC.SelectObject(pOldBmp);pOldBmp->DeleteObject();dMemDC.DeleteDC();GetWindowRect(&rc);ScreenToClient(&rc);pDC->DrawEdge(&rc,(m_bOverControl?BDR_RAISEDINNER:BDR_SUNKENINNER),BF_RECT);}voidCBSColorComboBox::OnTimer(UINTnIDEvent){if(nIDEvent==888&&IsWindowEnabled()){CPointpoint;::GetCursorPos(&point);CRectrect;GetWindowRect(&rect);if(rect.PtInRect(point)){m_bOverControl=true;}else{m_bOverControl=false;KillTimer(nIDEvent);}}CComboBox::OnTimer(nIDEvent);}voidCBSColorComboBox::MeasureItem(LPMEASUREITEMSTRUCTlpMeasureItemStruct){lpMeasureItemStruct-〉itemHeight=iIconY+5;}voidCBSColorComboBox::DrawItem(LPDRAWITEMSTRUCTlpDIS)ASSERT(lpDIS->CtlType==ODT_COMBOBOX);〃画笔CDC*pDC=CDC::FromHandle(lpDIS->hDC);ASSERT(pDC->GetSafeHdc());//绘制区RECTrc=lpDIS->rcItem;RECTrcIcon(rc),rcTxt(rc);//当前的Item索引号LPBSCBITEMlpItem=GetItem(lpDIS->itemID);if(lpItem!=NULL){//画颜色IconrcIcon.right=rcIcon.left+iIconX;rcIcon.top+=(rc.bottom-rc.top-iIconY)/2;rcIcon.bottom=rcIcon.top+iIconY;pDC->FillSolidRect(rcIcon.left,rcIcon.top,rcIcon.right-rcIcon.left,rcIcon.bottom-rcIcon.top,lpItem->crColor);pDC->DrawEdge(&rcIcon,BDR_RAISEDINNER,BF_RECT);//开始画文字intnOldBkMode=pDC->SetBkMode(TRANSPARENT);pDC->SetTextColor(RGB(0,0,0));rcTxt.left=rcIcon.right+5;rcTxt.top=rcIcon.top;pDC->DrawText(lpItem->lpCaption,&rcTxt,DT_VCENTER|DT_END_ELLIPSIS|DT_NOCLIP|DT_SINGLELINE);pDC->SetBkMode(nOldBkMode);voidCBSColorComboBox::OnMouseMove(UINTnFlags,CPointpoint)m_bOverControl=true;SetTimer(888,100,NULL);CComboBox::OnMouseMove(nFlags,point);LPBSCBITEMCBSColorComboBox::GetItem(intiIndex)//当前的Item索引号POSITIONpos=m_crItem.FindIndex(iIndex);if(pos)LPBSCBITEMlpItem=m_crItem.GetAt(pos);ASSERT(lpItem);returnlpItem;elsereturn(LPBSCBITEM)NULL;COLORREFCBSColorComboBox::GetColor()if(IsWindowEnabled())returnm_crColor;else{return(m_crColor=GetItem(this->GetCurSel())->crColor);}}voidCBSColorComboBox::GetRGBValue(int*R,int*G,int*B){*R=GetRValue((DWORD)m_crColor);*G=GetGValue((DWORD)m_crColor);*B=GetBValue((DWORD)m_crColor);}voidCBSColorComboBox::OnSelchange(){intiIndex=GetCurSel();if(iIndex!=CB_ERR&&iIndex>=0){CDC*pDC=this->GetDC();〃绘制区RECTrc;intiScrollX=::GetSystemMetrics(SM_CXVSCROLL);GetClientRect(&rc);pDC->FillSolidRect(rc.left+2,rc.top+2,rc.right-rc.left-iScrollX-4,rc.bottom-rc.top-2,::GetSysColor(COLOR_WINDOW));RECTrcIcon(rc),rcTxt(rc);//当前的Item索引号LPBSCBITEMlpItem=GetItem(iIndex);if(lpItem!=NULL){m_crColor=lpItem->crColor;//画颜色IconrcIcon.left+=2;rcIcon.right=rcIcon.left+iIconX;rcIcon.top+=(rc.bottom-rc.top-iIconY)/2;rcIcon.bottom=rcIcon.top+iIconY;pDC->FillSolidRect(rcIcon.left,rcIcon.top,rcIcon.right

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论