仿Scroll.ocx控件的VC类实现

http://tech.ddvip.com   2007年03月25日    社区交流

本文详细介绍仿Scroll.ocx控件的VC类实现

  前些天进行一个项目,在进行界面设计的时候进行了一些换肤操作。但是由于界面采用图形界面开发,菜单栏和工具栏都进行了图形化处理,状态栏相比就显得单调了许多,所以替换了windows程序生成的状态栏,用了网络上面的Scroll.ocx控件。但是由于程序属于小程序如果加载较多控件可能不太方便,加上在使用这个控件的过程中发现如果输入显示字体长度比较长的时候在显示刷新的时候会出现问题,所以自己仿造那个显示方法进行了这个控件的编写。

  程序继承静态控件类,在程序创建的时候可以代替一些控件用来进行一些信息的显示。在这里我用来代替状态栏显示一些欢迎登录,以及登录名称等。程序采用双缓冲的方式进行不同位置的Rect输出。程序采用文字从右至左的方式运行。由于在CDC类的DrawText调用中要制定输出文字的区域,我们可以在这里做文章,动态改变这个区域。从右至左的方法就是所有程序由该控件的右边为起点作为输出文字的left边界,采用定时器对这个left进行逐步递减操作。那么我们的输出文字的区域就会由该控件的最右边区域往左边区域递增。配合上我们的DT_LEFT方式绘制文字,经过不停的控件刷新就会出现文字从右往左的运行诡计了。

  控件的一些主要绘制方法:(都是一些简单的调用绘制,^_^)

  绘制控件背景:

void CScrollCtrl::DrawCtrlBackground(CDC *pDC, CRect &rect)
{
  CBrush pNewBrush, *pOldBrush;
  pNewBrush.CreateSolidBrush(m_clBkColor);
  pOldBrush = (CBrush *)pDC->SelectObject(pNewBrush);
  pDC->FillRect(&rect, &pNewBrush);
  pDC->SelectObject(&pOldBrush);
  pNewBrush.DeleteObject();
  //重新设置文字位置,默认为最右边
  CSize sSize;
  pDC->GetTextExtent(m_strText);
  m_nXPos = sSize.cx;
}

  绘制文字

void CScrollCtrl::DrawCtrlText(CDC *pDC, CRect rect)
{
  CRect rectText;
  CFont *pOldFont;
  pDC->SetBkMode(TRANSPARENT);
  pDC->SetTextColor(m_clTextColor);
  pOldFont = (CFont *)pDC->SelectObject(m_pFnt);
  //选择了字体要重新获得字体宽度
  CSize sSize;
  sSize = pDC->GetTextExtent(m_strText);
  m_nTextWidth = sSize.cx;
  rectText.left = m_nXPos;
  rectText.top = rect.top;
  rectText.bottom = rect.bottom;
  rectText.right = rect.right;
  
  pDC->DrawText(m_strText, rectText, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
  
  pDC->SelectObject(&pOldFont);
}

  调用方法:

  新建一个工程,基于对话框的直接调用,基于SDI等的需要动态创建。拷贝ScrollCtrl.h和ScrollCtrl.cpp到程序目录,通过“工程”-》“添加工程”-》“Files”加载到工程中间。通过定义控件对象和设置显示背景颜色,字体颜色和显示字体就可以了。

  程序演示情况见下:

  

  由于时间匆忙控件的封装和功能都不是很完善,各位有兴趣的可以进行功能的扩充,如果有好的修改请把代码发给我!比如背景渐变或者提供更多的接口等。如有什么问题请和我联系:successq_g@163.com

  程序源代码 testSCrollCtrl.rar

  原调用OCX控件 Scroll.rar

来源:vchelp    作者:戚高    责编:豆豆技术应用

正在加载评论...