5_文本编程

1、插入符(Caret):

  (1) 文本插入符 函数的原型声明:(CWnd类)

void CreateSolidCaret ( int Nwidth, int nHeight );

    ·nwidth:指定插入符的宽度(逻辑单位)。参数值为0,则系统将其设置为系统定义的窗口边界的宽度。

    ·nHeight:(同理)...高度。

    `默认是隐藏的,需调用 Showcatet(); 来显示;

  插入符的创建应该在窗口创建之后进行,可以在WM_CREATE消息的响应函数OnCreate中(在创建窗口的代码之后)添加创建插入符的代码。

  怎样得到设备描述表中当前字体的信息(即:文本信息):

    调用CDC类的GetTextMetrics成员函数可以得到设备描述表中当前字体的度量信息。

BOOL GetTextMetrics( LPTEXTMETRIC lpMetrics ) const; 

      ·该函数的参数是一个TEXTMETRIC结构体的指针;定义一个TEXTMETRIC结构体类型的变量,然后将该变量的地址传递给这个参数。

      ·通过GetTextMetrics这个函数调用,它会用设备描述表中当前字体的信息来填充这个结构体。

typedef struct tagTEXTMETRIC {
  LONG tmHeight;
  LONG tmAscent;
  LONG tmDescent;
  LONG tmInternalLeading;
  LONG tmExternalLeading;
  LONG tmAveCharWidth;
  LONG tmMaxCharWidth;
  LONG tmWeight;
  LONG tmOverhang;
  LONG tmDigitizedAspectX;
  LONG tmDigitizedAspectY;
  TCHAR tmFirstChar;
  TCHAR tmLastChar;
  TCHAR tmDefaultChar;
  TCHAR tmBreakChar;
  BYTE tmItalic;
  BYTE tmUnderlined;
  BYTE tmStruckOut;
  BYTE tmPitchAndFamily;
  BYTE tmCharSet;
} TEXTMETRIC, *PTEXTMETRIC; 

      ·字体没有一个具体的宽度值,只有一个平均值(tmAveCharWidth)。

  (2) 图形插入符 的函数声明:

void CreateCaret( CBitmap* pBitmap );

      ·在使用这个函数前,需先构造一个CBitmap对象,并利用CBitmap的成员函数初始化位图对象之后,才能使用这个位图对象。

2、窗口重绘:

  如果希望输入的内容始终保留在窗口上,就要在响应WM_PAINT消息的函数中将内容再次输出。MFC AppWizard产生的视类代码中,给我们提供了一个类似于WM_PAINT消息响应函数的OnDraw函数,当窗口发生重绘时,应用程序框架代码就会调用该函数。

  (1) OnDraw函数;

void CTextView::OnDraw(CDC* pDC)
{
    CTextDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
}

  提示:CDC类封装的TextOut函数与Platform SDK提供的全局TextOut函数类的区别:前者不需要DC句柄作为参数,因为CDC内部专门有一个成员变量(m_hDC)保存了DC句柄。

3、路径:

  路径层(path bracket)【设备描述表中】的概念:

  路径层的作用:看代码效果!!!!

//cdc::GetTextExtent
CSize GetTextExtent( const CString& str ) const;

    ·该函数可以获得一个字符串在屏幕上显示的宽度和高度;(要想得到字符串在窗口中的显示宽度,必须针对特定的字符串电泳GetTextExtent函数;

    ·返回一个CSize类型的对象,CSize类 类似于 Windows的SIZE结构体:

typedef struct tagSIZE {
  LONG cx;
  LONG cy;
} SIZE, *PSIZE; 

    ·cx 和 cy 表示 宽度 和 高度。

  GetTextExtent 与 GetTextMetrics 的作用:

    GetTextExtent函数:它获得的是设备描述表中当前字体的度量信息;

    GetTextMetrics函数:则是获得某个特定的字符串在窗口中显示时所暂据的宽度和高度。

  提示:设备描述表中有一个默认的白色画刷,当绘制图形时,默认用该画刷填充图形内部。

//CDC::SelectClipPath
BOOL SelectClipPath( int nMode );

    ·作用:把当前设置的路径层和设备描述表中已有的裁剪区域按照一种指定的模式进行一个互操作;

    ·参数nMode用来指定互操作的模式;如RGN_DIFF(新的裁剪区域包含当前裁剪区域,但排除当前路径层区域)、RGN_AND(新的裁剪区域是当前裁剪区域和当前路径层的交集)等;

    ·该函数与路径层一起作用。

4、字符输入:

      当用户在键盘上按下某个字符按键后,要把该字符输出到程序窗口上,该操作需要程序捕获键盘按下这一消息。WM_CHAR消息可以捕获这个消息,在该消息的响应函数中完成字符输出功能。

  注意:TextOut函数在窗口中输出字符时,需要提供字符显示位置的x坐标和y坐标。

问题提出:

  1、每个字符在屏幕上所占据的宽度都是不一样的,怎样获得下一个输入点的坐标?

   2、程序应当在当前插入符的位置输出字符;

  3、用来存储输入的字符串的成员变量:m_strLine的取值变化问题;

  4、每次输入的字符串都应在当前插入符位置,也就是鼠标左键单击处开始显示;

  5、在输出字符时,还应考虑到回车字符的处理;

  6、在输出字符时,还要处理一个特殊的字符:退格键(Backspace);

  7、插入符的位置如何随字符输出的变化而变化;

  (1) 设置字体:CFont类 派生于 CGDiObject类,封装了一个Windows图形设备接口(GDI)的字体。

  在构造了一个CFont对象后,必须利用该类提供的几个初始化函数之一对该对象进行初始化,然后才能使用这个对象:

  在程序中,与其他GDI对象一样,当创建了一个字体对象并初始化后,还必须将它选入设备描述表,之后这个新字体才能发挥作用。我们可以保存这个字体,在使用完新字体后,再把设备描述表中的字体恢复为先前的字体。

  (2) 字幕变色共更能的实现:

//CDC::DrawText

int DrawText(const CString& str, LPRECT lpRect, UINT nFormat ); 

    ·功能:在指定的举行范围内输出文字;

//CWnd::SetTimer
UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)( HWND, UINT, UINT, DWORD) ); 

    ·如果这个函数调用成功,它将返回新定时器的标识。

    ·nIDEvent:指定一个非零值的定时器标识。(如果该函数调用成功,那么这个表示将作为返回值返回,即函数执行成功,它的第一个参数和返回值就是相等的)

    ·nElapse:指定定时器的时间间隔;毫秒为单位的。

    ·lpfnTimer:函数只剩,并且是一个回调函数。当设定好定时器之后,每隔设定的时间间隔,它就会发送一条定时器消息。如果在这里设置了回调函数,这时操作系统就会调用这个回调函数来处理定时器消息。如果我们将此参数设置为NULL值,定时器消息,即WM_TIMER消息就会被放到应用程序的消息队列中,然后由程序相应此消息的窗口对象来处理。

  

    提示:对一个变量进行自加自减操作前,一定要初始化这个变量。否则,结果是不确定的。

5_文本编程

时间: 2024-10-22 06:24:04

5_文本编程的相关文章

MFC文本编程概述

本节是对文本编程的基本知识介绍 我们通过以下代码熟悉文本编程的基本函数有哪些,并且这些函数各有什么作用. 我们通过CClientDC创建一个设备描述上下文对象dc,然后定义一个TEXTMETRIC对象,TEXTMETRIC结构体对象用来表示目前设备描述表中字体的相关信息,其中最为重要的信息就是tmAveCharWidth平均字符的宽度(因为字符之间的宽度不一样,比如'w'和'i',明显前者比后者宽),tmHeight字符的高度,这个数据是相对于整体字符来说的,它包括tmAscent和tmDesc

还是用文本编辑器编程让人愉悦

千禧年左右有文章说有人厌恶集成开发环境,喜欢文本编程,自己编译,当时甚为不解.之后集成开发环境如雨后春笋般出现,这句话也成为笑谈. 然而Eclispe发展至今,要做一个程序居然要装一批插件,出了问题抓耳挠腮,搞不出来病急乱投医,支招的也是从手术刀抗生素到偏方都用上了,这个时候才想起文本编程的好处. 用Editplus写Canvas,Nodejs让人愉悦,反而用Eclipse开发Java越来越让人痛苦.

GDI编程

一.GDI相关概念 1.GDI(Graphics Device Interface):图形设备接口,是一个应用程序与输出设备之间的中介.它提供了一套函数库,这些函数在不同的输出设备上输出图形和文字.一方面,GDI向应用程序提供一个与设备无关的编程环境,另一方面,它又以设备相关的格式和具体的设备打交道. 2.DC (Device Context):设备描述表(设备上下文),是一种Windows数据结构,包括了如线的宽度和颜色.刷子的样式和颜色.字体.剪裁区域等信息.用于表达显示器.打印机等设备.

shell编程(六)脚本初步

shell脚本编程: 编程语言的分类:根据运行方式 编译运行:源代码 --> 编译器 (编译)--> 程序文件: 解释运行:源代码 --> 运行时启动解释器,由解释器边解释边运行: 根据其编程过程中功能的实现是调用库还是调用外部的程序文件: shell脚本编程: 利用系统上的命令及编程组件进行编程: 完整编程: 利用库或编程组件进行编程: 编程模型:过程式编程语言,面向对象的编程语言 程序=指令+数据 过程式:以指令为中心来组织代码,数据是服务于代码: 顺序执行 选择执行 循环执行 代表

(GDI)GDI编程

GDI编程 一.GDI相关概念 1.GDI(Graphics Device Interface):图形设备接口,是一个应用程序与输出设备之间的中介.它提供了一套函数库,这些函数在不同的输出设备上输出图形和文字.一方面,GDI向应用程序提供一个与设备无关的编程环境,另一方面,它又以设备相关的格式和具体的设备打交道. 2.DC (Device Context):设备描述表(设备上下文),是一种Windows数据结构,包括了如线的宽度和颜色.刷子的样式和颜色.字体.剪裁区域等信息.用于表达显示器.打印

Windows-文本编程基本技术

Windows-文本编程基本技术 这里介绍一些MFC文本编程的简单技术点. 一.插入符 (1).创建文本插入符 #if 1 //创建插入符, 参数:宽,高 CreateSolidCaret(20, 100); //必须显示出来,默认是隐藏的 ShowCaret(); #endif (2).创建图形插入符 #if 1 //创建图形插入符,根据图片的ID加载 m_Bitmap.LoadBitmap(IDR_MAINFRAME); CreateCaret(&m_Bitmap); ShowCaret()

6.shell脚本基础和grep文本处理工具企业应用

6.1shell脚本基础-bash变量和逻辑运行 bash特性及bash脚本编程初步 终端:附着在终端接口程序: GUI:KDE,GNome,Xfce CLI:/etc/shells bash的特性 命令行展开:~,{} 命令别名:alias,unalias 命令历史: history 文件名通配:glob 快捷键:Ctrl+a, e, u, k, l 命令补全: $PATH 路径补全: bash特性之:命令hash 缓存此前命令的查找结构:key-vlaue key:搜索值 value:值 h

马哥第3期运维班第一周作业

1.描述计算机的组成及其功能. 控制器(Control): 是整个计算机的中枢神经,其功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序.数据.地址,协调计算机各部分工作及内存与外设的访问等. 运算器(Datapath): 运算器的功能是对数据进行各种算术运算和逻辑运算,即对数据进行加工处理. 存储器(Memory): 存储器的功能是存储程序.数据和各种信号.命令等信息,并在需要时提供这些信息. 输入(Input system): 输入设备是计算机的重要组成部分,输入设备与输出设备

第一周作业

1.描述计算机的组成及其功能. 计算机的组成部分有运算器,控制器,存储器,输入设备,输出设备 1. 控制器(Control):是整个计算机的中枢神经,其功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序.数据.地址,协调计算机各部分工作及内存与外设的访问等. 2. 运算器(Datapath):运算器的功能是对数据进行各种算术运算和逻辑运算,即对数据进行加工处理. 3. 存储器(Memory):存储器的功能是存储程序.数据和各种信号.命令等信息,并在需要时提供这些信息. 4. 输入(