MFC基本控件-静态文本的使用

简介: MFC的基本空控件可以帮助大家快速做出一个可视化界面, 下面我将使用一个常见的采集表, 为大家说明常用基本控件的使用方法。 首先从最简单的静态文本开始。

  MFC的基本空控件可以帮助大家快速做出一个可视化界面, 下面我将使用一个常见的采集表, 为大家说明常用基本控件的使用方法。 首先从最简单的静态文本开始。

       环境:VS2019

   静态文本一般用于标识信息, 和代码中的注释类似。下面请看基本使用的举例:

一.基本使用

0b1ac7173d714667a22de3b7bb7fbb6a.png     首先在窗口上放置了六个控件, 默认为“static”的就是静态文本, 左键单击就可以修改默认值, 如图:b88d252da3d24d79b9440a9e7dd42efb.png

 这就是静态文本的基本使用, 用来标识后面需要输入的内容。

二.链接使用

       如果只是用来标识,那未免有点单调, 我们有时还希望文本是个超链接, 可以帮我们链接到网页。我们添加一个为"www.baidu.com"的静态文本, 右击选择类向导, 如图:

cb49e1e904304a8e995b10bfe8b65289.png

  我们的思路是添加一个类, 继承原本的CStatic类, 在继承的类中实现我们的链接功能,如图选择添加MFC类:

cddd78cadef745e1972d3e9403d53855.png

取号类名, 基类选择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静态文本的基本使用方法, 有问题欢迎交流。

相关文章
|
数据安全/隐私保护 Windows
QT应用编程: QGraphicsView+QGraphicsTextItem动态编辑文本
QT应用编程: QGraphicsView+QGraphicsTextItem动态编辑文本
715 0
QT应用编程: QGraphicsView+QGraphicsTextItem动态编辑文本
|
5月前
13 MFC - 静态文本框CStatic
13 MFC - 静态文本框CStatic
28 0
|
5月前
19 MFC - 标签控件 CTabCtrl
19 MFC - 标签控件 CTabCtrl
20 0
|
C#
WPF整理-为控件添加自定义附加属性
原文:WPF整理-为控件添加自定义附加属性 附加属性,大家都不陌生,最常见的是Canvas.Left/Canvas.Top,类似的也有Grid.Row/Grid.Column等附加属性。举个最常见的例子 需要说明的是并不是所有的附加属性都是元素放进去后才会有附加效果,上面的例子只是刚好是这种错觉的巧合情况,Grid.Row也属于这种巧合。
2048 0
|
程序员 开发工具 C语言
Qt编写自定义控件67-通用无边框
一、前言 在之前的一篇文章中写过一个通用的移动控件,作用就是用来传入任意的widget控件,可以在父类容器中自由移动。本篇文章要写的是一个通用的无边框类,确切的说这不叫控件应该叫组件才对,控件是要看得见的东西,有绘制需求的,而这个需要依附在控件上。
906 0
|
XML 程序员 C语言
Qt编写控件属性设计器2-拖曳控件
一、前言 上一篇文章把插件加载好了,并且把插件中的所有控件都显示到了列表框中,这次要做的就是实现拖曳控件的功能,用户选择一个控件拖曳到画布上,松开,在松开位置处自动实例化该控件,这个需要用到dropEvent和dragEnterEvent事件,重新实现这两个事件,对拖曳的对象进行过滤并调用函数实例化该控件,在实例化该控件的同时实例化控件跟随控件以便拉伸调整大小和位置。
878 0
Qt编写自定义控件30-颜色多态按钮
一、前言 这个控件一开始打算用样式表来实现,经过初步的探索,后面发现还是不够智能以及不能完全满足需求,比如要在此控件设置多个角标,这个用QSS就很难实现,后面才慢慢研究用QPainter来绘制,我记得当时接到这个定制控件任务的时候是2016年,那时候对QPainter的使用还不是很熟悉,也就是从此控件开始,逐步研究QPainter的绘制,把所有的内置函数都使用一遍,最终用的越来越熟悉,使得后来到了心中有坐标,万物皆painter的境界,可能就像武林中所说的打通了任督二脉吧。
1145 0
|
C#
艾伟_转载:WPF/Silverlight陷阱:XAML自定义控件的嵌套内容无法通过名称访问
为了说明这个问题,假定我们需要实现一个具有特殊功能的按钮控件。编写Xaml文件如下: Button> 对 Code Behind类,唯一的改动是把向导生成的基类从UserControl改成Button: public partial class XamlButton : Button{    ...
1046 0
|
XML C# 数据格式
XAML属性赋值转换之谜(WPF XAML语法解密)
原文:XAML属性赋值转换之谜(WPF XAML语法解密) XAML与XML类似,就是XML延伸过来的。为了更好的表达一些功能,WPF对XML做了扩展,有些功能是WPF在后台悄悄的替你做了。有时候,虽然实现了某个功能,但是对实现原理还是很茫然。
929 0
|
API C# Windows
WPF中用于嵌入其他进程窗口的自定义控件(AppContainer)
原文:WPF中用于嵌入其他进程窗口的自定义控件(AppContainer) 版权声明:本文为博主原创文章,转载请注明作者和出处 https://blog.csdn.net/ZZZWWWPPP11199988899/article/details/78131292        在Windows上开发客户端程序的时候,有时候我们希望能将其他进程的窗口嵌入到我们自己的程序窗口中,从视觉效果上看就像是其他进程的窗口时我们自己的程序窗口的一部分。
3191 0

热门文章

最新文章