VC++60 第九章 在窗体上写字

C++笔记之文本输入 1、使用cin和循环结合进行文本输入 #include <iostream> int main() { using namespace std ; int count= 0; char ch ; cout << "Please enter character,end with # :\n"; cin >> ch ; while (ch != '*') { count++ ; cout <& 阅读详情

第九章 在窗体上写字

从前面的例程中我们看到,要在视窗式的应用程序中显示文字可用静态文本、编辑框和弹出消息框等方法。另外的一种方法是直接在窗口面版上写字,用这种方法还可以自由设置字体、大小和颜色。在窗体上写字实际上是“画”字,需要先创建一个可以“画”的对象——CPaintDC对象。

 

本章要点

1 用CFont类和创建字体
2 如何在窗体上写字?
3 单选按钮组的用法
4 利用列表框进行选择

 

9.1 CFont类简介

 

要设置字体需要创建一个CFont类对象,然后利用它的CreateFont()函数来设置当前字体。CreateFont()有14个参数,下面我们用代码加注释的方法简要介绍,详情可查阅MSDN连机帮助文档,参看MFC库手册。

        CFont myFont;             //创建一个字体对象
        myFont.CreateFont(
           16,                   //1.字体高度。
            0,                    //2. =0 表示保持纵横比
            0, 0,                 //3.4.角度
            400,                  //5.线的宽度,400为正常  
            FALSE, FALSE, 0,      //6.7.8.斜体,下划线,删除线(否)
            ANSI_CHARSET,         //9.字符集
            OUT_DEFAULT_PRECIS,       //10.精度
            CLIP_DEFAULT_PRECIS,      //11.
            DEFAULT_QUALITY,          //12.质量
            DEFAULT_PITCH|FF_SWISS,   //13.强度和家族 
            "Arial"                  //14.字体名称
            );

这14个参数中第一个和最后一个最重要。第一个表示字体高度,它决定了字符的大小,数值16表示字符举行的高为16个点,字体大小与你在本文中看到的差不多。而第二个参数=0 表示保持纵横比,这就字体的宽度了。最后一个字体名称用字符串表示,你的机器上有些什么字体好用,你打开记事本程序就可以查到。

9.2 MyFont.exe程序的界面和功能

本例程我们设计一个应用程序可以不同大小和颜色的字体来显示用户任意输入的字符串。

VC++60 <wbr>第九章 <wbr>在窗体上写字
图chap09-01

 

当你在下面的编辑框中输入一行文字后,窗口内会同时显示两行文本。你可以用左边的单选按钮选择字体大小,文本大小会立即改变。你可以在左下角的列表框中选择文本的颜色,但要点击[设置]按钮后才生效。
输入文字后的界面如图02。

VC++60 <wbr>第九章 <wbr>在窗体上写字
图chap09-02

 

9.3 设计MyFont程序的界面

 

按照图1和参考下列属性表设计界面。

控件 标题 ID 其它属性
编辑框 - IDC_DATA_EDIT  
按钮 设置 IDC_SET_BUTTON  
按钮 EXIT ID_EXIT_BUTTON Styles:默认按钮
组框 Size IDC_STATIC  
单选按钮组 8,16,24... IDC_SIZE_RADIO0
IDC_SIZE_RADIO1 ...
 
列表框 - IDC_COLOR_LIST 选择方式=simple;Border选中
主对话框 MyFont IDD_MYFONT_DIALOG  

 

9.4 编写在窗体上写字的代码

 

给编辑框引进CString类的变量m_DataEdit。
为了在窗体上显示一行提示语,我们在OnPaint()函数中用默认字体来写字。

        CPaintDC dc(this); //
        UpdateData(TRUE); //Allow draw onto the panal
        dc.SetBkMode(TRANSPARENT);
        dc.TextOut(100,10,"请输入一行文本,Input a text please.");

语句1创建一个绘画的设备环境变量(对象)dc。语句2用TRUE允许更新。语句3设置北京模式为透明的。语句4用函数TextOut()输出文字,起始位置在坐标(100,0)处,窗口的左上角为坐标原点(0,0)。
下面紧接着创建新字体并用编辑框的输入信息来画字,代码如下:

        dc.TextOut(100,60,m_DataEdit);
        CFont myFont;
        myFont.CreateFont(16, 0, 0, 0 ,400,
            FALSE, FALSE, 0,
            ANSI_CHARSET,
            OUT_DEFAULT_PRECIS,
            CLIP_DEFAULT_PRECIS,
            DEFAULT_QUALITY,
            DEFAULT_PITCH|FF_SWISS,
            "Arial");
        //Use new Font, store old font
        CFont* pOldFont = dc.SelectObject(&myFont);
        dc.TextOut(100,120,m_DataEdit);
        dc.SelectObject(pOldFont);

语句dc.TextOut(...)的前一语句的功能是,创建一个CFont对象pOldFont来寄存老字体,函数SelectObject()的功能是设置由参数指定的字体为当前字体。你立马就会明白,后一语句的功能就是恢复老字体为当前字体了。

为了让编辑框的输入能够写出来,就必须在编辑框有输入时让窗口重新画一遍。这需要给编辑框添加消息映射EN_CHANGE,在自动生成的OnChangeDataEdit()函数中加入语句:
   
      Invalidate();
它会调用OnPaint()函数重画窗口。
给[EXIT]按钮写好退出代码,保存、编译、连接和运行,输入文字已经能够显示了。

 

9.5 设计单选按钮组和列表框

 

单选按钮组的功能是:点击某个按钮就改变字体的大小重画窗体。为此,需要把这六个单选按钮归并为一组。方法是把第一个按钮IDC_SIZE_RADIO0设置为组属性,就是选中Group选项。但是,其他几个单选按钮的组属性必须为“不选中”。
VC++60 <wbr>第九章 <wbr>在窗体上写字
图chap09-03

 

这样,这组控件就是一个整体,选择某一个,就返回它的索引号,按钮IDC_SIZE_RADIO0的索引号是0,下一个是1,2...等。我们只要给第一个按钮IDC_SIZE_RADIO0设置变量m_Size,它就代表这个组。

现在来修改代码,把ONPaint()函数中创建字体的语句中的“字体高度”修改一下就行:
        myFont.CreateFont(8+ 8*m_Size, 0, 0, 0 ,400,
我们设定每个单选按钮相隔8点,因为第一个按钮的索引号是0,所以H的值是8,下一个是24,...。
为了在点击某个单选按钮时发出消息要求窗体重画,需要给每个单选按钮引进BN_ONCLICK事件,给响应函数添加要求重画的代码 Invalidate()。例如,按钮IDC_SIZE_RADIO0的函数为:,
void CMyFontDlg::OnSizeRadio1()
{
    // TODO: Add your control notification handler code here
    Invalidate();
}
操作时,你只要双击改按钮,就弹处确认对话框,当你[确定]后,就添加了响应函数并定位到那里可,可立即输入代码了。
现在再编译和运行,观看改变字体大小的效果。

编写列表框选择颜色的代码
设计时列表框的“选择方式”必须是单一选择,即simple,因为我们只能使用一种颜色啊。对列表框的、选择结果也是通过返回的索引号来识别的。在列表框中显示的项不能在设计时给定,需要在初始化函数OnInitDialog()中用代码来实现:
    m_Size = 0 ;
    UpdateData(TRUE);
    m_Color_List.AddString("黑色");
    m_Color_List.AddString("红色");
    m_Color_List.AddString("绿色");
    m_Color_List.AddString("蓝色");

在OnPaint()函数中需要增加设置颜色的语句。设置文本颜色用dc.SetTextColor(RGB(255,0,0))函数,其中参数RGB(255,0,0)是颜色类型RGB的构造函数,数值表示红色。一般格式是RGB(red,green,blue),取值0~255。为了列表框的成员函数来返回用户选择的索引号,需要引进列表框控件型变量m_Color_List,于是用m_Color_List.GetCaretIndex()就获得了索引号,根据索引号设置颜色,代码如下:
        switch(m_Color_List.GetCaretIndex())
        {
        case 0 : dc.SetTextColor(RGB(0, 0, 0));
            break;
        case 1 : dc.SetTextColor(RGB(255,0,0));
            break;
        case 3 : dc.SetTextColor(RGB(0,255,0));
            break;
        case 2 : dc.SetTextColor(RGB(0,0,255));
            break;
        default : dc.SetTextColor(RGB(0, 0, 0));
            break;
        }

这些代码都要在语句
    dc.TextOut(100,120,m_DataEdit);
之前。最后,要让[设置]按钮使用颜色生效,还要加入能够重画的语句Invalidate()。重新编译和运行后,就可以用不同的颜色和大小的字体来写字了。

9.6 附录 OnPaint()函数全文

为了方便读者使用,下面把OnPaint()函数全部复制下来,着色部分是我们自己的代码。

void CMyFontDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting

        SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
      //My code start from here
        CPaintDC dc(this); //
        UpdateData(TRUE); //Allow draw onto the panal

        dc.SetBkMode(TRANSPARENT);
        dc.TextOut(100,10,"请输入一行文本,Input a text please.");
        dc.TextOut(100,60,m_DataEdit);
        //Create a new font
        CFont myFont;
        myFont.CreateFont(16+ 8*m_Size, 0, 0, 0 ,400,
            FALSE, FALSE, 0,
            ANSI_CHARSET,
            OUT_DEFAULT_PRECIS,
            CLIP_DEFAULT_PRECIS,
            DEFAULT_QUALITY,
            DEFAULT_PITCH|FF_SWISS,
            "Arial");
        //Use new Font, store old fomt
        CFont* pOldFont = dc.SelectObject(&myFont);
        //Set textcolor
        switch(m_Color_List.GetCaretIndex())
        {
        case 0 : dc.SetTextColor(RGB(0, 0, 0));
            break;
        case 1 : dc.SetTextColor(RGB(255,0,0));
            break;
        case 3 : dc.SetTextColor(RGB(0,255,0));
            break;
        case 2 : dc.SetTextColor(RGB(0,0,255));
            break;
        default : dc.SetTextColor(RGB(0, 0, 0));
            break;
        }
        dc.TextOut(100,120,m_DataEdit);
        //Restore old Font
        dc.SelectObject(pOldFont);
        //My code end
        CDialog::OnPaint();
    }
}

练习和思考

1 单选按钮组没有一个是被选择的,这不符合常规。如何修改使得显示第一个按钮是选中状态?
2 设计一个弹出对话框,其中有一个列表框提供4-5种字体(含两种汉字字体)。利用它来改变主窗口显示的字体(FaceFont)。

C/C++ 实现一个简单的文本编辑器(windows程序设计) 一.实现目的 为了更好的学习QT中的窗口、句柄等概念,先对Windows编程进行了大体了解,通过一个简单文本编辑器的实现,来加深对这些基本概念的理解。 二.具体实现 //! C/C++语言Windows程序设计 -> 简易文本编辑器 -> 演示 #include <windows.h> #include <winldap.h> #include <stdio.h> #include <stdlib.h> //! 各控件所使用的ID #define 阅读详情

相关推荐

MFC实现绘制文字(附完整源码)

MFC实现绘制文字(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 903

透视挂原理:透明窗口,画框,画线,绘制文字的实现(C++)

先上效果图: 新建一个空项目,根据自己的D3D库路径导入D3D库(这里是用DrectX9,手贱画了三根线,不用理): 新建一个预编译.h头文件: #pragma once #include <d3d9.h> #include <d3dx9.h> #pragma comment(lib, "d3d9.lib") #pragma comment(lib,...

吾无法无天的博客 2万+

在窗口中显示文字C++实例

如何用C++在窗口中显示文字,初学者使用

创建屏幕DC并在上面输出文字

// TODO: 在此添加控件通知处理程序代码 CDC* pDC = new CDC(); //产生字体 CFont font; font.CreateFont(14,0,0,900,FW_NORMAL,0,0,0,ANSI_CHARSET,OUT_TT_PRECIS,CLIP_TT_ALWAYS,PROOF_QUALITY,VARIABLE_PITCH|FF_ROM...

weixin_34220963的博客 1668

STM32CubeIDE离线安装芯片PACK包全攻略(附离线包下载与导入步骤)

本文详细介绍了在STM32CubeIDE中离线安装芯片PACK包的完整流程,包括官方和第三方资源获取方法、本地安装步骤及常见问题解决方案。特别针对网络隔离环境下的嵌入式开发需求,提供了实用的版本管理和自动化部署技巧,帮助开发者高效完成芯片固件支持包的离线配置。

weixin_30825581的博客 300

STM32F103开发实战:如何用CubeMX+CLion调整Flash起始地址(附完整CMake配置)

本文详细介绍了在STM32F103开发中如何使用CubeMX和CLion工具链调整Flash起始地址,包括链接脚本修改、系统文件配置和CMake工程适配。通过实战步骤和完整配置示例,帮助开发者实现固件双备份、OTA升级等高级功能,提升嵌入式开发效率。

5b6n7m8的博客 209

java文件流 不清除文件内容进行续写

进行文件流操作,首先需要的就是头文件 import java.io.*; java创建新文件 1.用文件写功能创建文件 OutputStream fs=new OutputStream("F:\\javatest\\test1.txt");//如果该文件不存在就会创建文件 用creatNewFile()创建文件 File fs=new File("F:\\javatest\\test1.txt"); fs.createNewFile(); java文件续写 FileOutputStream fos=ne

weixin_43975276的博客 1061

<Verilog实现除法器> Verilog实现牛顿-拉夫逊(Newton-Raphson)除法器

阿斯顿阿斯顿啊啊是打发士大夫

IC跳跳鱼的博客 3586

C++控制台窗口文字高亮显示

​ 前言 由于亿些事情,最近一个月实在没有时间更新,今天终于是挤出来时间更一期了。 正文 定义变量+导入库文件: #include #include #include #include using namespace std; int choice;//保存虚拟按键值,可以上网搜,也可以自己做程序,个人感觉自己做程序更方便 //本章节使用的按键值:W(向上):119 S(向下):115 Enter:13 int

ljw0001_2022的博客 1355

Ubuntu终端接入Codex:一行脚本搞定AI编程助手安装与配置

在开发者日常工作中,命令行终端是最高频的操作环境,而AI编程助手的出现正在改变传统的编码方式。通过将大模型能力与终端工具链结合,开发者无需切换窗口即可完成命令查询、代码生成、项目理解和自动执行等任务。Ubuntu作为服务器和开发机的主流系统,搭配Node.js生态和API Key认证,即可在本地闭环运行AI助手。本文从环境准备、密钥配置、权限管理到自动化脚本封装,系统拆解在终端中接入Codex的完整流程,并分享高频用法与实测排障经验,帮助开发者安全、高效地让AI融入命令行工作流。

weixin_29061041的博客 322

手把手教你接入京东购物小程序:从领券到下单的全流程解析

本文详细解析了如何从API申请到领券下单,手把手教你接入京东购物小程序的全流程。涵盖京东联盟账号注册、商品信息获取、优惠券链接转换等关键技术实践,帮助开发者高效实现电商功能集成,提升用户购物体验。

g5h6i的博客 910

C/C++编写Windows窗口应用程序(Win32程序),非黑漆漆的控制台窗口

Windows应用程序是基于消息驱动的,任何线程只要注册窗口类都会有一个消息队列用于接收用户输入的消息和系统消息。 一、 窗口的创建流程 创建一个完整的窗口需要经过下面四个操作步骤: 设计一个窗口类(填写Win32程序必要信息) 注册窗口类 创建窗口 显示及更新窗口 二、相关函数及术语 1、WinMain函数 // Windows程序的入口函数...

任逍遊 --- [专用空间] 2万+

创意视觉项目实战:用ESP32-S3+OV5640构建智能图像流系统

本文详细介绍了如何使用ESP32-S3开发板与OV5640摄像头模块构建智能图像流系统。从硬件连接到软件配置,涵盖Arduino环境搭建、图像采集优化、WiFi视频流传输及外设集成,为开发者提供完整的实战指南,助力智能家居和机器人视觉项目开发。

tech5的博客 1292

c++实现窗口类 字母坠落

/定时器,只能在图形窗口。//定时器,只能在图形窗口。char Char(int mod=0)//mod=0产生大写字母,mod=1产生小写字母。//随机数序列产生的值不变,伪随机数。void GetRandChar()//对象化处理。//窗口的宽度,保证在界面存在。

weixin_74979100的博客 252

AI Agent Harness实时监控大屏搭建实战

本文将以目前主流的AI Agent管控框架Harness为基础,结合React、ECharts、WebSocket技术,手把手带你搭建一套完整的实时监控大屏,覆盖全局概览、状态分布、工具调用统计、异常告警、实时日志等核心功能,不需要复杂的底层开发,复制代码就能快速跑通。本文我们从需求出发,先梳理了AI Agent的核心监控指标,然后搭建了监控大屏的静态布局,逐个实现了各个图表,对接了Harness的实时数据源,最后加了交互和告警功能,完整走了一遍监控大屏从设计到落地的全流程。

大数据洞察的博客 174

【Unity3D开发小游戏】《打地鼠游戏》Unity开发教程

文章目录一、前言二、源码三、正文版本1、相机设置2、洞口设置3、洞口脚本4、鼹鼠5、鼹鼠动画6、鼹鼠碰撞器7、鼹鼠脚本8、击中鼹鼠的效果9、实现击中效果10、增加更多的洞口 一、前言 让我们使用Unity3D开发一个打地鼠游戏吧。 打地鼠游戏是一个非常有趣的街机游戏,是在1976年左右发明的。 游戏的主要玩法就是打击从洞里出来的鼹鼠,玩家击中鼹鼠的速度越快,得分就越高 我们将讲解制作游戏的所需的每...

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 8461

c++windows创建简单的窗口程序

简单的窗口创建(无注释)

weixin_50765298的博客 4342

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

c++关于windows窗体编程简单实例

Windows 操作系统提供了各种各样的函数,以方便我们开发windows应用程序,这些函数是windows操作系统提供给应用程序编程的接口(Appliaction Programming Interface),简称为API函数所有主要的Windows函数都是在Windows.h头文件中进行了声明。 所谓的Win32 SDK(Software Development Kit)为软件开发包,是开发

小龙王2010 8930

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++ 窗体程序初步(全网最全)

C++窗体程序入门开发:从IDE的选择到每部分的详细讲解再到最后完成窗体程序创建,讲的那是非常详细呢

沛沛霖的博客 4405

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Windows消息列举

消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做TMsg,它在Windows单元中是这样声明的:type TMsg =...

445822357 482

Visual C++ 6.0 开发win32 窗口程序 -- 学习(3)

今天来学习用windows应用程序编程的窗口绘图功能 首先是主函数,还是四部曲:窗口类注册,窗口生成,显示窗口,消息循环 // 主程序 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { MSG Message; HWND hWnd; WNDCLASS WndClass; //1-定义窗口类 WndClass.cbClsExtra=0; WndCla

zjjsd195的专栏 892

C++实现一个可视化Windows窗口程序

/这个消息循环会持续运行,不断从消息队列中获取消息,将其翻译和分派给窗口过程函数,直到接收到退出消息。L"MyWindowClass", // 窗口类名称。CW_USEDEFAULT, // 窗口的X坐标。CW_USEDEFAULT, // 窗口的Y坐标。400, // 窗口的宽度。300, // 窗口的高度。NULL, // 父窗口句柄。

weixin_45568421的博客 2051

模拟键盘按键 自动输入文字

模拟键盘按键 自动输入文字  键盘对于每个操作电脑的人员来说是最熟悉不过的了。键盘上的按键可分为两类: 按下后会在电脑的输入窗口上出现对应字符的按键,如字母键和数字键等,我们称之为字符键;按下后虽然看不到字符但会产生控制作用的按键,如回车键、光标键等,我们称之为控制键。  对于程序员来说,键盘上的每个按键都一样,无非是不同按键产生的键盘扫描码不同。在不同的操作系统下,键盘扫描码常常被转换为不同

Danisの一棵树的软件历程 4617

CreateFont

函数功能:该函数创建一种有特殊性的逻辑字体,此逻辑字体可以在后面被任何设备选择。  函数原型:HFONT CreateFont(int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight, DWORD fdwltalic, DWORD fdwUnderline, DWORD fdwStrikeOut,

思若星辰 670

VC CFont::CreateFont 使用说明

BOOL    CreateFont (           int    nHeight,              //字体的高度         int    nWidth,               //字体的宽度         int    nEscapement,          //字体显示的角度         int    nOrientation,       

FishYu的专栏 2186

vc++字体类CFont详解及用法实例《转》

CFont详解: Windows提供了多种与设备无关的不同尺寸的字体。有效地使用这些Windows字体,不用在编程时下很大功夫,就可以明显地增强各种应用程序的功能。字体是Windows GDI必要的组成部分,这意味字体的使用与其他GDI对象一样。它们可以缩放和剪切,可以像选取画笔或者画刷一样选取设备环境。所有关于撤消选中和删除的GDI规则都适用于字体。字体由CFont类进行管理,创建CFont类必...

weixin_33711641的博客 1056
上一篇: VC++60 第八章 自定义对话框
下一篇: VC++60 第十章 绘制图形
GL_a_
博客等级 码龄11年 29粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值