用 VB 来开发高效率的底层程序

原创 2001年07月02日 23:13:00
本程序介绍一种自绘制按钮的实现:当鼠标光标拖过按钮时,文本变成黑体,具有焦点的按钮在文本下加下划线。当点击它时,文本变成黑体。同时该按钮还支持位图。使用SetBitmap (UINT ID) 可以将位图添加到按钮上:如果按钮不具有焦点,位图为单色;当鼠标拖过它时,位图将恢复到它以前的颜色。 ******************************************************************************** // BtnMenu.cpp : implementation file // #include "stdafx.h" #include "BtnMenu.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CBtnMenu CBtnMenu::CBtnMenu() { m_clrText = GetSysColor (COLOR_BTNTEXT); m_clrBack = GetSysColor (COLOR_BTNFACE); m_brBackground.CreateSolidBrush (m_clrBack); m_crText = m_clrText; m_bLBtnDown = FALSE; m_idCursor = 0; m_idBitmap = 0; } CBtnMenu::~CBtnMenu() { if ((HBRUSH) m_brBackground != NULL) m_brBackground.DeleteObject (); } BEGIN_MESSAGE_MAP(CBtnMenu, CButton) //{{AFX_MSG_MAP(CBtnMenu) ON_WM_CTLCOLOR_REFLECT() ON_WM_MOUSEMOVE() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_TIMER() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CBtnMenu message handlers HBRUSH CBtnMenu::CtlColor(CDC* pDC, UINT nCtlColor) { // TODO: Change any attributes of the DC here // TODO: Return a non-NULL brush if the parent's handler should not be called return NULL; } void CBtnMenu::OnMouseMove(UINT nFlags, CPoint point) { //Here I will set a timer and see if the current cursor is within our boundaries if // not kill the timer and remove the current highlighting SetTimer (1,55,NULL); CButton::OnMouseMove(nFlags, point); } void CBtnMenu::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default m_bLBtnDown= TRUE; CButton::OnLButtonDown(nFlags, point); } void CBtnMenu::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default m_bLBtnDown= FALSE; //Take out the cursor CButton::OnLButtonUp(nFlags, point); } void CBtnMenu::DrawItem(LPDRAWITEMSTRUCT lpDIS) { ASSERT(lpDIS != NULL); CDC* pDC = CDC::FromHandle(lpDIS->hDC); CRect rect; HBITMAP hBitmap =NULL; // draw the colored rectangle portion rect.CopyRect(&lpDIS->rcItem); // draw the up/down/focused/disabled state UINT state = lpDIS->itemState; if ( (state & ODS_SELECTED) ) { // draw the down edges CBrush *pOldBrush = pDC->SelectObject(&m_brBackground); pDC->RoundRect(rect.left, rect.top, rect.Width(), rect.Height(), 2, 2); pDC->SelectObject(pOldBrush); if (m_idBitmap) hBitmap = (HBITMAP) LoadImage (AfxGetInstanceHandle (),MAKEINTRESOURCE (m_idBitmap), IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR|LR_LOADMAP3DCOLORS|LR_LOADTRANSPARENT); pDC->Draw3dRect (rect,GetSysColor (COLOR_3DDKSHADOW),GetSysColor (COLOR_3DHILIGHT)); } else { CBrush *pOldBrush = pDC->SelectObject(&m_brBackground); pDC->RoundRect(rect.left, rect.top, rect.Width(), rect.Height(), 2, 2); pDC->SelectObject(pOldBrush); if (m_idBitmap) hBitmap = (HBITMAP) LoadImage (AfxGetInstanceHandle (),MAKEINTRESOURCE (m_idBitmap), IMAGE_BITMAP,0,0,LR_MONOCHROME|LR_LOADMAP3DCOLORS); // draw the up edges pDC->Draw3dRect (rect,m_clrBack,m_clrBack); } // draw the text if there is any //We have to paint the text only if the image is nonexistant CString strText; GetWindowText(strText); if ( !strText.IsEmpty()) { LOGFONT lf; ZeroMemory ((PVOID) &lf,sizeof (LOGFONT)); CFont * pFont = GetFont(); CFont dispFont; pFont->GetLogFont (&lf); if ((state & ODS_SELECTED)) { lf.lfWeight = FW_EXTRABOLD; dispFont.CreateFontIndirect (&lf); pFont = pDC->SelectObject (&dispFont); //While selected move the text a bit rect.top +=2; rect.left +=2; rect.right -=2; rect.bottom -=2; } int iOldMode = pDC->GetBkMode(); COLORREF crOldText = pDC->GetTextColor(); pDC->SetBkMode( TRANSPARENT ); pDC->SetTextColor( m_crText ); if (state & ODS_FOCUS ) { if (!(state & ODS_SELECTED)) { lf.lfUnderline = TRUE; lf.lfWeight = FW_LIGHT; dispFont.CreateFontIndirect (&lf); pFont = pDC->SelectObject (&dispFont); if (m_idBitmap) hBitmap =(HBITMAP) LoadImage (AfxGetInstanceHandle (),MAKEINTRESOURCE (m_idBitmap), IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR|LR_LOADMAP3DCOLORS|LR_LOADTRANSPARENT); } } if (state & ODS_DISABLED) { CBrush grayBrush; grayBrush.CreateSolidBrush (GetSysColor (COLOR_GRAYTEXT)); pDC->GrayString (&grayBrush,NULL,(LPARAM)((LPCSTR)strText),-1,rect.left, rect.top,rect.Width(),rect.Height()); } else { if (!hBitmap) pDC->DrawText(strText, rect, DT_LEFT | DT_VCENTER | DT_SINGLELINE); else { CDC memdc; CBitmap bmp; CBitmap *poldbmp; bmp.Attach (hBitmap); BITMAP bitmap; bmp.GetBitmap (&bitmap); memdc.CreateCompatibleDC( pDC ); // Select the bitmap into the DC poldbmp = memdc.SelectObject( &bmp); // Copy (BitBlt) bitmap from memory DC to screen DC pDC -> StretchBlt( rect.left,rect.top, rect.right-rect.left, rect.bottom -rect.top, &memdc, 0,0, bitmap.bmWidth,bitmap.bmHeight,SRCCOPY ); memdc.SelectObject( poldbmp ); bmp.Detach (); } } pDC->SetBkMode( iOldMode ); pDC->SetTextColor( crOldText ); pDC->SelectObject (pFont); //set it to the old font dispFont.DeleteObject (); } if ( (state & ODS_DISABLED) ) { //AST - how should we indicate this??? } } void CBtnMenu::OnTimer(UINT nIDEvent) { POINT pt; static BOOL pPainted = FALSE; GetCursorPos(&pt); CRect rect; GetWindowRect (rect); if (m_bLBtnDown) { KillTimer (1); //Take the cursor out if the man has pressed de button if (m_idCursor) { ::SetCursor (AfxGetApp () -> LoadStandardCursor (IDC_ARROW)); } if (pPainted) InvalidateRect (NULL); pPainted = FALSE; return; } if (!rect.PtInRect (pt)) { KillTimer (1); //Take out the cursor if the thing is out if (m_idCursor) { ::SetCursor (AfxGetApp () -> LoadStandardCursor (IDC_ARROW)); } if (pPainted) InvalidateRect (NULL); pPainted = FALSE; return; } else { if (pPainted) return; else pPainted = TRUE; //Here we need to put the cursor in for the settings if (m_idCursor) { HCURSOR hCursor = AfxGetApp () -> LoadCursor (m_idCursor); ::SetCursor (hCursor); } CDC *pDC = GetDC (); if (!m_idBitmap) { LOGFONT lf; ZeroMemory ((PVOID) &lf,sizeof (LOGFONT)); CFont * pFont = GetFont(); CFont dispFont; pFont->GetLogFont (&lf); lf.lfUnderline = TRUE; lf.lfWeight = FW_BOLD; int iOldMode = pDC->GetBkMode(); COLORREF crOldText = pDC->GetTextColor(); dispFont.CreateFontIndirect (&lf); pDC->SetBkMode( TRANSPARENT ); pDC->SetTextColor( m_crText); pDC -> SelectObject (dispFont); CString strText; GetWindowText (strText); CRect rect; GetClientRect (rect); pDC->FillSolidRect (rect,m_clrBack); pDC->DrawText(strText, rect, DT_LEFT | DT_VCENTER | DT_SINGLELINE); pDC->SetBkMode( iOldMode ); pDC->SetTextColor( crOldText ); pDC->SelectObject (pFont); //set it to the old font dispFont.DeleteObject (); } else { HBITMAP hBitmap =(HBITMAP) LoadImage (AfxGetInstanceHandle (),MAKEINTRESOURCE (m_idBitmap), IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR|LR_LOADMAP3DCOLORS|LR_LOADTRANSPARENT); GetClientRect (rect); CDC memdc; CBitmap bmp; CBitmap *poldbmp; bmp.Attach (hBitmap); BITMAP bitmap; bmp.GetBitmap (&bitmap); memdc.CreateCompatibleDC( pDC ); // Select the bitmap into the DC poldbmp = (CBitmap *) memdc.SelectObject( &bmp ); // Copy (BitBlt) bitmap from memory DC to screen DC pDC -> StretchBlt( rect.left,rect.top, rect.right-rect.left, rect.bottom -rect.top, &memdc, 0,0,bitmap.bmWidth,bitmap.bmHeight, SRCCOPY ); memdc.SelectObject( poldbmp ); } ReleaseDC (pDC); } CButton::OnTimer(nIDEvent); } void CBtnMenu::SetBkgndColor (COLORREF rgb) { m_clrBack = rgb; if ((HBRUSH)m_brBackground != NULL) m_brBackground.DeleteObject(); m_brBackground.CreateSolidBrush (m_clrBack); } void CBtnMenu::SetTextColor (COLORREF rgb) { m_clrText = rgb; m_crText = m_clrText; } void CBtnMenu::SetCursor(UINT idCursor) { m_idCursor = idCursor; } void CBtnMenu::SetBitmap (UINT idBmp) { m_idBitmap = idBmp; } **************************************************************************************** // BtnMenu.h : header file // ///////////////////////////////////////////////////////////////////////////// // CBtnMenu window #ifndef _BTNMENU_H #define _BTNMENU_H class CBtnMenu : public CButton { // Construction public: BOOL m_bLBtnDown; CBrush m_brBackground; COLORREF m_crText; CBtnMenu(); void SetBkgndColor (COLORREF rgb); void SetTextColor (COLORREF rgb); void SetBitmap (UINT); // Attributes public: // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CBtnMenu) public: virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); //}}AFX_VIRTUAL // Implementation protected: COLORREF m_clrBack; COLORREF m_clrText; UINT m_idBitmap; public: UINT m_idCursor; void SetCursor (UINT idCursor); virtual ~CBtnMenu(); // Generated message map functions protected: //{{AFX_MSG(CBtnMenu) afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnTimer(UINT nIDEvent); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// #endif //_BTNMENU_H

iOS常用的高效开发宏

#ifndef MacroDefinition_h #define MacroDefinition_h //-------------------获取设备大小--------------------...
  • sunnyboy9
  • sunnyboy9
  • 2016年04月23日 15:30
  • 342

VB程序打包方法

VB学习已经有很长一段时间了,在马上就迎来的作品展中,相信大家的作品也接近了尾声,VB程序的最后一步就是打包发布,对此,我遇到了很多问题,我找到了两个解决的方法。利用VB本身提供的打包程序可以实现打包...
  • lu930124
  • lu930124
  • 2013年04月24日 21:15
  • 5078

使用VB6资源文件开发多国语言应用攻略

使用VB6资源文件开发多国语言应用
  • fulcrumtech
  • fulcrumtech
  • 2016年06月17日 12:12
  • 620

第一课:ARM底层开发笔记之ARM基础概念

arm 1.arm的概念 2.arm体系架构版本 3.arm处理器系列 4.arm开发板 5.bootloader 6.tftp...
  • vertor11
  • vertor11
  • 2016年04月14日 15:25
  • 1180

芯钰科运动控制卡--VB 快速搭建软件平台(运动控制卡编程示范)

首先,将函数包放入系统 找到VB函数包,复制 将YK8A04VB函数包放入C盘windows/system32     1定长运动控制示范程序 2 打开或初始化卡 /**************...
  • evenou
  • evenou
  • 2014年03月23日 22:47
  • 2473

如何编写高效率稳定的单片机代码

由于单片机的性能同电脑的性能是天渊之别的,无论从空间资源上、内存资源、工作频率,都是无法与之比较的。PC 机编程基本上不用考虑空间的占用、内存的占用的问题,最终目的就是实现功能就可以了。对于单片机来说...
  • slj_win
  • slj_win
  • 2015年04月10日 15:19
  • 965

VB 执行其他程序并等待其结束

VB 执行其他程序并等待其结束           近期在编写程序过程中用Winrar中的DOS程序rar.exe 对.Rar文件进行处理,并将结果写入一个文件,后面的程序将此文件用RichTex...
  • whchensir
  • whchensir
  • 2013年05月17日 22:14
  • 1368

asp.net vb版 cache 处理缓存实例

asp.net vb版 cache 处理缓存
  • Jamie2012
  • Jamie2012
  • 2017年04月26日 22:46
  • 441

ECU软件开发介绍篇

近年来,汽车上面的电控单元(ECU)越来越多,汽车电子产品已经占到了车辆成本的1/3。国内各OEM也有自己的ECM开发团队,但是占据市场的主要还是博世、大陆、电装等国际巨头。        ECM全称...
  • jianfengxia
  • jianfengxia
  • 2015年04月15日 13:00
  • 2727

手把手教你用VB制作ActiveX控件

随着控件在可视化编程中地位地位提高,控件也成了编程中最重要的一部分。许多VB编程者也许苦于没有好看的控件,今天登高望远来教大家如何制作ActiveX控件。 一、新建工程       1.选择Acti...
  • qq_33582668
  • qq_33582668
  • 2016年06月11日 19:41
  • 3965
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用 VB 来开发高效率的底层程序
举报原因:
原因补充:

(最多只允许输入30个字)