Visual C++程序开发范例宝典(软件工程师典藏版)
上QQ阅读APP看书,第一时间看更新

2.3 静态文本控件典型实例

静态文本控件(Static Text)是一种单向交互的控件,用于显示数据,但是不接受输入,本节通过几个实例介绍静态文本控件在程序中的应用。

实例050 制作超链接控件

这是一个可以提高基础技能的实例

实例位置:光盘\mingrisoft\02\050

实例说明

设计应用程序时,为了让用户方便地通过程序访问某个网站,需要采用具有超级链接功能的控件,本实例通过静态文本控件设计一个超级链接控件,实例运行结果如图2.11所示。

图2.11 实现超级链接

技术要点

本实例通过新建SetCursor函数和ShellExecute函数来实现控件的超链接功能。SetCursor函数用于设置鼠标光标的样式,ShellExecute函数用来打开超链接。

(1)SetCursor函数,语法如下:

HCURSOR SetCursor( HCURSOR hCursor );

参数说明:

● hCursor:光标的句柄。

(2)ShellExecute函数,语法如下:

HINSTANCE APIENTRY ShellExecute(HWND hwnd,LPCTSTR lpOperation,LPCTSTR lpFile,LPCTSTR lpParameters,LPCTSTR lpDirectory,INT nShowCmd);

参数说明:

● hwnd:窗口句柄。

● lpOperation:执行的操作,包括open、print和explore。

● lpFile:文件路径。

● lpParameters:执行操作的参数。

● lpDirectory:指定默认目录。

● nShowCmd:是否显示。

实现过程

(1)新建一个基于对话框的应用程序。

(2)在工程中添加一个以CStatic类为基类的类CSuperLabel。

(3)在对话框上添加5个静态文本控件和3个编辑框控件,设置其中1个静态文本控件的ID为IDC_CONNECT。

(4)在CSuperLabel类的OnPaint方法中绘制控件外观,代码如下:

        void CSuperLabel::OnPaint()
        {
            CPaintDC dc(this);
            CDC*pDC=GetDC();                        //获得设备上下文
            CString text;
            GetWindowText(text);                    //获得控件显示文本
            if (m_ConnectStr.IsEmpty())
                m_ConnectStr=text;                  //设置超链接文本
            pDC->SetBkMode(TRANSPARENT);            //设置背景透明
            pDC->SetTextColor(RGB(0,0,255));        //设置文本颜色为蓝色
            pDC->SelectObject(&m_Font);             //选入字体对象
            pDC->TextOut(0,0,text);                 //绘制超链接文本
        }

(5)重载CSuperLabel类的PreSubclassWindow虚方法,在该虚方法中设置超链接文本和字体,代码如下:

        void CSuperLabel::PreSubclassWindow()
        {
            GetWindowText(m_ConnectStr);               //获得超链接文本
            CFont*pFont=GetFont();                     //获得控件字体
            pFont->GetLogFont(&lfont);
            lfont.lfUnderline=TRUE;                    //设置下划线
            m_Font.CreateFontIndirect(&lfont);         //创建新字体
            CStatic::PreSubclassWindow();
        }

(6)处理CSuperLabel类的鼠标移动消息,在该消息的处理函数中修改鼠标的样式,代码如下:

        void CSuperLabel::OnMouseMove(UINT nFlags, CPoint point)
        {
            ::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR1));             //设置鼠标样式
            CStatic::OnMouseMove(nFlags, point);
        }

(7)处理CSuperLabel类的鼠标左键按下消息,在该消息的处理函数中打开超级链接,代码如下:

        void CSuperLabel::OnLButtonDown(UINT nFlags, CPoint point)
        {
            ShellExecute(m_hWnd,NULL,m_ConnectStr,NULL,NULL,SW_SHOW);   //打开超链接
            CStatic::OnLButtonDown(nFlags, point);
        }

举一反三

根据本实例,读者可以:

自绘静态文本控件。