VC++6.0实现超链接
2011年05月03日
一直不太会用VC,最近补习中。今天想要用静态文本模拟一个超链接,以为很简单(以前用VB确实很简单),结果发现要把变色,加下划线,变手形鼠标等模拟出来,还有点麻烦呢。搜索了半天,没有找到一个书面的完整解决方案,试着下载那个传说中重载CStatic来实现的类,结果水平不足,弄得头晕脑胀,还是编译不通过。一怒之下,自己研究了半天,终于比较完美的实现了,先发出来纪念下,以后熟悉VC点后也做成类吧。
首先,新建一个基于对话框的工程,添加一个静态文本框,ID为IDC_HTML。Caption为http://www.baidu.com/。然后添加单击消息映射,添加以下代码:
void CMyDlg::OnHtml()
{
// TODO: Add your control notification handler code here
//静态文本框的notify设置为true才能响应点击等
ShellExecute(NULL,"open", "http://www.baidu.com/",NULL,NULL,SW_SHOW );
}
基本的超链接功能算是实现了,很简单。不过模拟其他超链接的特效才是重点!在对话框实现文件中,添加几个全局变量,如下:
BOOL bBlue=FALSE;
CFont cfont1;
CFont cfont2;
在对话框初始化函数,OnInitDialog中加入以下初始化代码:
// TODO: Add extra initialization here
CWnd* pWnd = GetDlgItem(IDC_HTML);
LOGFONT lf;
pWnd->GetFont()->GetLogFont(&lf); //得到静态文本框的逻辑字体
lf.lfUnderline=TRUE;
cfont1.CreateFontIndirect(&lf); //修改字体1带下划线
lf.lfUnderline=FALSE;
cfont2.CreateFontIndirect(&lf); //修改字体2不带下划线
在ClassWizard中加入WM_CTLCOLOR消息映射。当控件需要重绘的时候,会发送这个消息给父窗口,可以在这个消息发送时,修改控件的字体和背景颜色。在消息映射函数中加入以下代码:
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
if (pWnd->GetDlgCtrlID()==IDC_HTML)
{
if (bBlue)
{
pDC->SetTextColor(RGB(0,0,255)); //如果鼠标在文本上,设置颜色为蓝色
GetDlgItem(IDC_HTML)->SetFont(&cfont2); //设置下划线
}
else
{
pDC->SetTextColor(RGB(255,0,0)); //设置初始颜色为红色
GetDlgItem(IDC_HTML)->SetFont(&cfont1); //取消下划线
}
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
在ClassWizard中加入WM_SETCURSOR消息映射。当鼠标在控件上移动的时候会发送 WM_SETCURSOR消息。在消息映射函数中添加处理代码:
BOOL CMyDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
//移动到静态文本上,鼠标变为手
switch(pWnd-> GetDlgCtrlID())
{
case IDC_HTML: //静态控件的ID
SetCursor(AfxGetApp()-> LoadCursor(IDC_CURSOR1)); //IDC_CURSOR1是我自己导入手形鼠标,也可以使用系统自带
if (!bBlue) //bBlue为字体是否蓝色的标志位
{
bBlue=TRUE;
Invalidate(); //强制刷新,使控件重绘,然后在WM_CTLCOLOR消息处理函数中对文本颜色和字体进行处理
}
return TRUE;
}
return CDialog::OnSetCursor(pWnd, nHitTest, message);
}
在ClassWizard中加入WM_MOUSEMOVE消息映射。当鼠标在窗体上移动的时候会发送 WM_MOUSEMOVE消息,可用来判断鼠标不在静态文本上。在消息映射函数中添加处理代码:
void CMyDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CWnd* pWnd = GetDlgItem(IDC_HTML);
if( NULL != pWnd )
{
CRect r ;
pWnd->GetWindowRect(&r);
ScreenToClient(&r);
//如果鼠标不在静态文本上方且标志位为TRUE,则将标志位置FALSE
if( !(point.x>r.left && point.xr.top && point.y<r.bottom) && bBlue )
{
bBlue=FALSE;
Invalidate();
}
}
CDialog::OnMouseMove(nFlags, point);
}
然后大功告成了^_^,VC灰常灰常菜,不要耻笑哈
发表评论
-
c语言学习笔记
2012-01-20 01:46 568c语言学习笔记 2010年12月12日 C语言学习笔记, ... -
文件操作小结
2012-01-20 01:46 534文件操作小结 2010年08 ... -
c语言的文件处理
2012-01-20 01:46 838c语言的文件处理 2010年06月03日 本章要点: ... -
Linux下文件I/O操作详解
2012-01-20 01:46 382Linux下文件I/O操作详解 2010年12月26日 ... -
fread函数和fwrite函数
2012-01-20 01:45 437fread函数和fwrite函数 2010年06月28日 ... -
经典的串口调试助手源代码(一)
2012-01-19 09:33 510经典的串口调试助手源代码(一) 2011年05月26日 ... -
经典的串口调试助手源代码(一)
2012-01-19 09:33 1268经典的串口调试助手源代码(一) 2011年04月26日 ... -
转 Windows API 函数在VFP中的运用
2012-01-19 09:33 978转 Windows API 函数在VFP中的运用 2010年 ... -
VB-2.1
2012-01-19 09:33 515VB-2.1 2011年09月26日 Option E ... -
OpenGl函数解释(转载)
2012-01-17 02:08 651OpenGl函数解释(转载) 2011年03月11日 第 ... -
怎样用OpenGL在某一位置上写字符串?
2012-01-17 02:08 697怎样用OpenGL在某一位置上写字符串? 2011年11月2 ... -
delphi中opengl程序设计
2012-01-17 02:08 769delphi中opengl程序设计 2011年06月07日 ... -
OpenGL编程设置
2012-01-17 02:08 347OpenGL编程设置 11小时前 一.环境配置 由 ... -
Opengl:显示中文改进版
2012-01-17 02:08 895Opengl:显示中文改进版 2010年07月09日 由 ... -
小学生评语大全{六年级}
2012-01-15 21:38 446小学生评语大全{六年级 ... -
“拖拉背”旅行出发篇
2012-01-15 21:36 461“拖拉背”旅行出发篇 ... -
骑行东南亚准备工作........
2012-01-15 21:36 530骑行东南亚准备工作........ 2010年10月09日 ... -
转:这个是真还是假?
2012-01-15 21:35 428转:这个是真还是假? 2010年04月14日 越南相亲网 ...
相关推荐
走进vc++,非常详尽的说明了vc6.0的使用过程,并且是Pdf版的,而且每vc一部分都有超链接,方便阅读与学习!是不可多得的的入门资料!
C语言程序设计教程(第3版)谭浩强 张基温 编著(高等教育出版社)书中所有例题习题源代码和播放ppt,其中源代码全部在VC++6.0下测试通过,播放ppt中包含题目和到各个源代码文件的超链接,文件解压缩后只要保持原有的...
VC++6.0 控制摄像头 一个视频捕捉类对摄像头的操作。 VC+++暴风影音(Media+Player+Classic)源码 知道的人不多,但提起国内的暴风影音,我想知道的人就多了,其实暴风影音就是Media Player Classic,暴风影音只是同我...
VC++6.0 控制摄像头 一个视频捕捉类对摄像头的操作。 VC+++暴风影音(Media+Player+Classic)源码 知道的人不多,但提起国内的暴风影音,我想知道的人就多了,其实暴风影音就是Media Player Classic,暴风影音只是同我...
VC++6.0 控制摄像头 一个视频捕捉类对摄像头的操作。 VC+++暴风影音(Media+Player+Classic)源码 知道的人不多,但提起国内的暴风影音,我想知道的人就多了,其实暴风影音就是Media Player Classic,暴风影音只是同我...
VC++6.0 控制摄像头 一个视频捕捉类对摄像头的操作。 VC+++暴风影音(Media+Player+Classic)源码 知道的人不多,但提起国内的暴风影音,我想知道的人就多了,其实暴风影音就是Media Player Classic,暴风影音只是同我...
VC++6.0 控制摄像头 一个视频捕捉类对摄像头的操作。 VC+++暴风影音(Media+Player+Classic)源码 知道的人不多,但提起国内的暴风影音,我想知道的人就多了,其实暴风影音就是Media Player Classic,暴风影音只是同我...
自绘CStatic,实现超链接。 iconbutton_demo 演示了多种自绘Button。 IDocHostUIHandler Extended CHtmlView 如题。 IM_毕业设计 聊天系统,操作了数据库,有服务端和客户端。 ini文件的类适合VC使用 如题。 ...
用一个基本窗口MFC程序实现WebBrowser控件对指定网页页面的加载、展示、点击事件响应,以及实现对鼠标在页面中点击标签事件的捕获,并且返回标签的超链接。 在VS2010环境下编译通过。
...................\在VC++6.0开发中实现全屏显示.doc ...................\在VC下显示JPEG、GIF格式图像的一种简便方法.doc ...................\在VC中用CMenuXP使应用程序拥有Office XP风格的界面.doc ........
改进的选项对话框,更加简单,新增了超链接选项。 其他—— 新的安装程序支持更多环境 当您滚动列表框时,定义域不在更新,避免了转移闪烁现象 HCB图标可以表示更多的条目集合,如C#中的事件和资源等。 ...