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

下载本文档

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

文档简介

在VC+应用程序中实现颜色选择组合框-相信读者朋友们对OFFICE2000一定非常熟悉吧,它里面的东东可真不少,不管是活泼可爱的大眼夹,还是各种平面造型的Windows控件都很受广大用户喜欢。那么这次就让我们来模仿它做个十分常用的控件:颜色组合框。如果你现在正在做关于字处理类的软件时这个东东一定对你有用。程序编译运行后的界面效果如图一所示: 图一、颜色选择组合框 = 0x0400) iMaxColor = COLOR_INFOBK; if(WINVER = 0x0500) iMaxColor = 28; /初始化CB颜色列表框的Item(常见的SysColor值) for(int iLoop = iMinColor; iLoop iIndex = AddString(strColorNameiLoop); lpItem- crColor = :GetSysColor(iLoop); lpItem- lpCaption = strColorNameiLoop; / if(m_crItem.IsEmpty() m_crItem.AddHead(lpItem); else m_crItem.AddTail(lpItem); /该Item是为了用户自定义颜色而设置 LPBSCBITEM lpItem = new BSCBITEM; lpItem- iIndex = AddString(More Colors); lpItem- crColor = RGB(213, 233, 249); lpItem- lpCaption = More Colors; if(m_crItem.IsEmpty() m_crItem.AddHead(lpItem); else m_crItem.AddTail(lpItem); /初始化当前颜色 m_crColor = m_crItem.GetHead()- crColor; BOOL CBSColorComboBox:OnEraseBkgnd(CDC* pDC) ASSERT(pDC- GetSafeHdc(); return false; void CBSColorComboBox:OnPaint() CPaintDC dc(this); OnCBPaint(&dc); void CBSColorComboBox:OnCBPaint(CDC* pDC) ASSERT(pDC- GetSafeHdc(); /绘制客户区 CDC dMemDC; dMemDC.CreateCompatibleDC(pDC); dMemDC.SetMapMode(pDC- GetMapMode(); /画动作 CBitmap mNewBmp; RECT rc; 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); void CBSColorComboBox:OnTimer(UINT nIDEvent) if(nIDEvent = 888 & IsWindowEnabled() CPoint point; :GetCursorPos(&point); CRect rect; GetWindowRect(&rect); if(rect.PtInRect(point) m_bOverControl = true; else m_bOverControl = false; KillTimer(nIDEvent); CComboBox:OnTimer(nIDEvent); void CBSColorComboBox:MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) lpMeasureItemStruct- itemHeight = iIconY + 5; void CBSColorComboBox:DrawItem(LPDRAWITEMSTRUCT lpDIS) ASSERT(lpDIS- CtlType = ODT_COMBOBOX); /画笔 CDC* pDC = CDC:FromHandle(lpDIS- hDC); ASSERT(pDC- GetSafeHdc(); /绘制区 RECT rc = lpDIS- rcItem; RECT rcIcon(rc), rcTxt(rc); /当前的Item索引号 LPBSCBITEM lpItem = GetItem(lpDIS- itemID); if(lpItem != NULL) /画颜色Icon 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 - rcIcon.left, rcIcon.bottom - rcIcon.top, lpItem- crColor); pDC- DrawEdge(&rcIcon, BDR_RAISEDINNER, BF_RECT); /开始画文字 int nOldBkMode = 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); void CBSColorComboBox:OnMouseMove(UINT nFlags, CPoint point) m_bOverControl = true; SetTimer(888, 100, NULL); CComboBox:OnMouseMove(nFlags, point); LPBSCBITEM CBSColorComboBox:GetItem(int iIndex) /当前的Item索引号 POSITION pos = m_crItem.FindIndex(iIndex); if(pos) LPBSCBITEM lpItem = m_crItem.GetAt(pos); ASSERT(lpItem); return lpItem; else return (LPBSCBITEM)NULL; COLORREF CBSColorComboBox:GetColor() if(IsWindowEnabled() return m_crColor; else return (m_crColor = GetItem(this- GetCurSel()- crColor); void CBSColorComboBox:GetRGBValue(int* R, int* G, int* B) *R = GetRValue(DWORD)m_crColor); *G = GetGValue(DWORD)m_crColor); *B = GetBValue(DWORD)m_crColor); void CBSColorComboBox:OnSelchange() int iIndex = GetCurSel(); if(iIndex != CB_ERR & iIndex = 0) CDC* pDC = this- GetDC(); /绘制区 RECT rc; int iScrollX = :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); RECT rcIcon(rc), rcTxt(rc); /当前的Item索引号 LPBSCBITEM lpItem = GetItem(iIndex); if(lpItem != NULL) m_crColor = lpItem- crColor; /画颜色Icon rcIcon.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 - rcIcon.left, rcIcon.bottom - rcIcon.top, lpItem- crColor); pDC- DrawEdge(&rcIcon, BDR_RAISEDINNER, BF_RECT); /开始画文字 int nOldBkMode = pDC- SetBkMode(TRANSPARENT); pDC- SetTextColor(RGB(0, 0, 0); rcTxt.left = rcIcon.right + 5; rcTxt.top = rcIcon.top; CFont* font = CFont:FromHandle(HFONT):GetStockObject(DEFAULT_GUI_FONT); pDC- SelectObject(font); pDC- DrawText(lpItem- lpCaption, &rcTxt, DT_VCENTER | DT_END_ELLIPSIS | DT_NOCLIP | DT_SINGLELINE); pDC- SetBkMode(nOldBkMode); pDC- DeleteDC(); void CBSColorComboBox:OnSelendok() int iIndex = this- GetCurSel(); LPBSCBITEM lpTmpItem = GetItem(iIndex); if(lpTmpItem != NULL) if(lpTmpItem- lpCaption = More Colors) CColorDialog crDlg(RGB(255, 0, 0), CC_FULLOPEN); int i

温馨提示

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

评论

0/150

提交评论