仿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

时间: 2024-08-22 14:37:37

仿Scroll.ocx控件的VC类实现的相关文章

VISUAL C++中的OCX控件的使用方法

新一代32位操作系统WINDOWS 95舍弃了VBX控件,取而代之的是OCX控件.OCX控件具有功能强大,界面美观的特点,然而许多参考书中并没有详细阐述OCX控件的使用方法,使得一些如数据库表格,远程数据控件等接口复杂的OCX难于使用.这里将详细阐述OCX的使用方法. 首先提醒读者要注意的是:使用OCX构件之前,必须登记注册,否则不能使用.安装VISUAL C++时,系统自动注册登记软件附带的OCX控件.如果不幸没有登记,那么请使用REGSVR32应用程序来注册.以VISUAL C++ 5.0为

vc++写一个OCX控件 怎么打印当前网页

问题描述 vc++写一个OCX控件 怎么打印当前网页 vc++写一个OCX控件 怎么打印当前网页 应该怎么样实现? 解决方案 网页通过脚本语言可以调用控件的方法和属性, 同时网页可以接收控件抛出的事件, 但控件不能反过来调用网页的函数, 网页与控件之间的交互就是通过网页调用控件的方法和属性来实现的 解决方案二: http://www.cnblogs.com/batman425/archive/2013/04/18/3028670.html

VC++如何在程序中用代码注册和卸载ocx控件(代码)

方法一:在dos或Windows命令行下运行:regsvr32 ocxname.ocx 注册 示例:regsvr32 netshare.ocx     //注册netshare.ocx控件regsvr32 /u netshare.ocx    //解除netshare.ocx控件的注册 如果netshare.ocx文件不在system目录时,还必须在文件名前加上完整的路径.除了regsvr32应用程序之外,Microsoft在它的 web 站点上还提供了一个称为regclean.exe 的程序,

ocx控件避免弹出警告的类--2

本文与 OCX控件避免弹出安全警告的类 http://www.cnblogs.com/lidabo/archive/2013/03/26/2981852.html 有些类似,只不过增加了几行代码(红色标注)   1.要加一个头文件:         #include <objsafe.h>2.在控件头文件中加入: ////////////////////////////////////////////////////////////////////////// //安全接口实现 DECLARE

VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程

开篇语:最近在弄ocx控件发布到asp.net网站上使用,就是用户在使用过程中,自动下载安装ocx控件.(此文章也是总结了网上好多人写的文章,我只是汇总一下,加上部分自己的东西,在这里感谢所有在网上发表相关内容的朋友们.) ActiveX控件用于Web的过程是将控件嵌入主页中,用户通过浏览器访问该主页时,将主页中的控件下载,并在用户机器上注册,以后就可在用户的浏览器上运行.控件下载一次后就驻留在用户本地机器上,下次再访问相同的主页时,可不再下载该控件,而是直接运行用户本地的控件.这里控件容器就是

JS实现OCX控件的事件响应示例

 JS支持OCX控件的事件(event),当OCX控件定义的事件发生时,JS可以捕获该事件并对事件进行相应的处理. 个人理解,其实就是事件的响应由谁来完成,OCX控件自身肯定是可以实现的,JS提供的这种机制使JS也可以完成OCX控件事件的响应. 简单举例如下: 首先在OCX控件中添加自定义事件(预定义事件同理,如鼠标点击等,没亲自试,感觉原理应该是一样的), 事件应该是属于窗口的,所以在Ctrl类上单击右键,Add->Add Event,如下图: 在打开的对话框中输入事件名称,例如OnChang

c++-使用ocx控件关联变量,其m_hWnd=NULL

问题描述 使用ocx控件关联变量,其m_hWnd=NULL 我用C++写了一个OCX控件.在MFC程序调用的使用,对该控件关联了一个变量m_myoxc.然后模仿其它人的代码进行判断if(m_myoxc.m_hWnd == NULL){ return -1}.我也不知道为什么这么写.但是现在程序卡在这边了.在什么情况下m_myoxc.m_hWnd == NULL??我控件也注册过了. 解决方案 控件这是初始化成功,m_hWnd 应该就不为空. 否则,说明控件变量初始化失败.可以在 OCX 控件的初

mfc-vc如何实现按下回车后编辑框输入焦点传递到下一编辑框?控件如何绑定类

问题描述 vc如何实现按下回车后编辑框输入焦点传递到下一编辑框?控件如何绑定类 vc如何实现按下回车后编辑框输入焦点传递到下一编辑框?控件如何绑定类? 解决方案 在对话框界面按下Ctrl+D组合键,将各个控件的Order进行排序,设置你想要的次序,设置好后,添加PreTranslateMessage函数并加入如下代码···试试吧 BOOL CCodeMess::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code

word嵌入到ocx控件中,怎么实现打印文件

问题描述 word嵌入到ocx控件中,怎么实现打印文件 我把word文档打开嵌入到ocx控件中,(vc代码)现在想编程实现打印. 直接在word程序中点击打印时会出现打印对话框,我的想法是怎么弹出这个打印对话框, 然后可打印. 我想可能这样实现 LPDISPATCH lpDisp = m_pSelection->GetIDispatch(); CDocument0 testDoc(lpDisp); CApplication _app(testDoc.get_Application()); CDi