静态文本一般用于标识信息, 和代码中的注释类似。下面请看基本使用的举例:
一.基本使用
首先在窗口上放置了六个控件, 默认为“static”的就是静态文本, 左键单击就可以修改默认值, 如图:
这就是静态文本的基本使用, 用来标识后面需要输入的内容。
二.链接使用
如果只是用来标识,那未免有点单调, 我们有时还希望文本是个超链接, 可以帮我们链接到网页。我们添加一个为"www.baidu.com"的静态文本, 右击选择类向导, 如图:
我们的思路是添加一个类, 继承原本的CStatic类, 在继承的类中实现我们的链接功能,如图选择添加MFC类:
取号类名, 基类选择CStatic, 继承原本的静态文本类, 如图:
下面是代码实现, 我会在其中添加注释, 方便理解:
#pragma once // CMyStatic //这里是CMyStatic.h 继承类的头文件 class CMyStatic : public CStatic { DECLARE_DYNAMIC(CMyStatic) public: CMyStatic(); virtual ~CMyStatic(); void ClickLink(bool setLink);//自己写一个链接函数 protected: DECLARE_MESSAGE_MAP() };
我们再次来到类向导, 在CMyStatic类的的消息中找到左键单击消息,双击,点击应用和确定, 如图:
此时你会在CMyStatic.cpp中得到一个左键单击的处理函数,, 下面是CMyStatic.cpp文件的代码:
// CMyStatic.cpp: 实现文件 // #include "pch.h" #include "class05.h" #include "CMyStatic.h" // CMyStatic IMPLEMENT_DYNAMIC(CMyStatic, CStatic) CMyStatic::CMyStatic() { } CMyStatic::~CMyStatic() { } //我们定义了一个setLink类型的bool变量, 使得我们可以修改文字是否可以被点击 void CMyStatic::ClickLink(bool setLink) { if (setLink == true) { ModifyStyle(0,//窗口风格修改, 从0修改为SS_NOTIFY SS_NOTIFY);//窗口可以被点击 } else { ModifyStyle(SS_NOTIFY, 0); } } BEGIN_MESSAGE_MAP(CMyStatic, CStatic) ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() // CMyStatic 消息处理程序 void CMyStatic::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CString str; //定义一个宽字节字符 GetWindowText(str); //获取窗口文字, 这里获取的是静态文本文字 ShellExecute(NULL, L"open", str, NULL, NULL, SW_NORMAL);//normal表示正常大小 CStatic::OnLButtonDown(nFlags, point); }
接下来, 将链接文本实例化为一个类对象, 首先修改Id(记住一定要改id),右下角修改默认Id:
然后再右击文本点击添加变量。这里我已经添加过,所以是灰色的,给变量取名为"baiduLInk_Static" 如图:
变量会被实例化在主窗口的头文件中, 将继承类的头文件导入再把CStatic改为新的类名, 请看代码:
// class05Dlg.h: 头文件 // #pragma once #include"CMyStatic.h"//包含新类型的头文件 // Cclass05Dlg 对话框 class Cclass05Dlg : public CDialogEx { // 构造 public: Cclass05Dlg(CWnd* pParent = nullptr); // 标准构造函数 // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_CLASS05_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: HICON m_hIcon; // 生成的消息映射函数 virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() public: CMyStatic baiduLInk_Static;//实例化对象, 改类型名 };
最后在主窗口的cpp文件中, 在OnInitDialog函数中初始化参量, 将setLink设置为真, 代码如下:
// Cclass05Dlg 消息处理程序 BOOL Cclass05Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != nullptr) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 baiduLInk_Static.ClickLink(true); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE }
三.风格设置
接下来是静态文本的风格设置, 比如颜色, 大小等等, 话不多说直接上代码:
首先新建一个风格类的实例化对象
第二步在主窗口的cpp文件中初始化
BOOL Cclass05Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != nullptr) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 baiduLInk_Static.ClickLink(true); //初始化风格 CFont* font; font = baiduLInk_Static.GetFont();//获取链接文本的字体对象 LOGFONT lf; font->GetLogFont(&lf);//获取logfont结构体 lf.lfHeight = 26;//大小 lf.lfWeight = 500;//粗细 lf.lfUnderline = true; lf.lfItalic = true;//斜体 newFont.CreateFontIndirectW(&lf);//创建新字体 baiduLInk_Static.SetFont(&newFont);//设置文本字体 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE }
效果如图:
设置字体颜色
在主窗口的类向导中找到WM_CTLCOLOR消息 , 这是绘制控件消息:
将消息双击生成处理函数,代码如下:
HBRUSH Cclass05Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: 在此更改 DC 的任何特性 if (pWnd->GetDlgCtrlID() == IDC_STATIC_Link) { pDC->SetTextColor(RGB(255, 0, 0));//颜色 pDC->SetBkColor(TRANSPARENT);//透明背景 } // TODO: 如果默认的不是所需画笔,则返回另一个画笔 return hbr; }
总结:
以上就是MFC静态文本的基本使用方法, 有问题欢迎交流。