友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
飞读中文网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

windows环境下32位汇编语言程序设计-第82章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




要设置文本格式可以通过发送EM_SETCHARFORMAT消息,这个消息设置控件中一段选定的文本或者全部正文的格式,消息的用法如下:

invoke  SendMessage;hWinEdit;EM_SETCHARFORMAT;uFlags;lpFmt

uFlags参数表示指定的格式所应用的范围,它可以是下面的数值。

●   SCF_ALL——为控件中的全部文本设置指定的格式。

●   SCF_SELECTION——仅为选择区域设置指定的格式,如果选择区域为空,则以后在此位置插入的新字符使用此格式。

●   SCF_WORD 与SCF_SELECTION——将格式应用到选定的单词上,如果选择区域没有落在整个单词上,那么格式会扩展到整个单词上,SCF_WORD标志必须和SCF_SELECTION标志一起使用。

lpFmt参数则指向一个CHARFORMAT或CHARFORMAT2结构,CHARFORMAT结构可以在所有版本中使用,而CHARFORMAT2结构仅可以在2。0及以上版本使用,CHARFORMAT2结构是CHARFORMAT结构的扩展,下面是CHARFORMAT2结构的定义:

CHARFORMAT2 STRUCT

  CbSize            DWORD        ?       ;结构长度

  dwMask            DWORD        ?       ;字段掩码

  dwEffects         DWORD        ?       ;文字效果

  yHeight           DWORD        ?       ;文字高度

  yOffset           DWORD        ?

  crTextColor       DWORD        ?       ;文本颜色

  bCharSet          BYTE         ?

  bPitchAndFamily   BYTE         ?

  szFaceName        BYTE LF_FACESIZE dup(?) ;字体名称

;CHARFORMAT结构的定义到此为止

  wWeight           WORD            ?

  sSpacing          WORD            ?

  crBackColor       DWORD       ?

  lcid              DWORD       ?

  dwReserved        DWORD       ?

  sStyle            WORD            ?

  wKerning          WORD            ?

  bUnderlineType    BYTE            ?

  bAnimation        BYTE            ? 

  bRevAuthor        BYTE         ?

  bReserved1        BYTE            ?

CHARFORMAT2 ENDS

CHARFORMAT2结构中szFaceName字段以前的内容就是CHARFORMAT结构,结构中各字段的含义如下。

●   cbSize——结构的大小,控件使用该字段来判断结构的版本是CHARFORMAT还是 CHARFORMAT2,所以在将结构传递给控件前必须将这个字段设置为正确的数值。

●   dwMask——字段掩码,用来指定结构中哪些字段是有效的,如果没有使用对应的标志,即使某些字段的内容被设置,控件也不会使用它,dwMask中可以使用的标志可以是下面数值的组合:

■   CFM_BOLD——dwEffects字段中CFE_BOLD 值是有效的。

■   CFM_CHARSET——bCharSet字段是有效的。

■   CFM_COLOR——crTextColor字段和dwEffects中的 CFE_AUTOCOLOR 值是有效的。

■   CFM_FACE——szFaceName字段的值是有效的。

■   CFM_ITALIC——dwEffects字段中的CFE_ITALIC值是有效的。

■   CFM_OFFSET——yOffset字段是有效的。

■   CFM_PROTECTED——dwEffects字段中的CFE_PROTECTED值是有效的。

■   CFM_SIZE——yHeight字段是有效的。



 
来源:电子工业出版社 作者:罗云彬 上一页         回书目         下一页          
上一页         回书目         下一页          
  


第9章 通用控件


9。4 使用Richedit控件(8)

    
■   CFM_STRIKEOUT——dwEffects字段中的CFE_STRIKEOUT值是有效的。

■   CFM_UNDERLINE——dwEffects字段中的CFE_UNDERLINE值是有效的。

●   dwEffects——字符效果,可以是以下值的组合:

■   CFE_AUTOCOLOR——使用系统正文颜色。

■   CFE_BOLD,CFE_ITALIC,CFE_STRIKEOUT和CFE_UNDERLINE——粗体字符、斜体字符、带删除线和带下划线。

■   CFE_PROTECTED——字符是受保护的,企图改变字符的话控件会向父窗口发送一个EN_PROTECTED通知消息。

●   yHeight——字符高度,单位是1/1 440 英寸(或1/20磅),如果这里是180,换算到“字体选择”通用对话框中的尺寸就是9磅(180×1/20=9)。

●   yOffset——从基线算起的字符偏移,单位同上,如果该成员是正值,字符显示为上标;如果是负值,字符显示为下标。

●   crTextColor——正文颜色,如果在dwEffects字段中指定了CFE_AUTOCOLOR标志,那么这个值会被忽略。

●   bCharSet和bPitchAndFamily——字符集。

●   szFaceName——用字符串表示的字体名字。

通过填充这个结构并将它通过EM_SETCHARFORMAT消息传送给控件,可以改变文字的效果(粗体、斜体、带删除线、带下划线等),正文颜色(crTextColor),字体外观(szFaceName)和字体大小(yHeight),以及使用的字符集等。使用CHARFORMAT2结构可以设置更多的文本风格,如字间距与正文背景色等。如果不需要这些额外的功能,那么只要使用CHARFORMAT结构就可以了。

例子程序Richedit。asm中只演示了使用Plain Text模式为所有文本设置字体的方法:

            nst

szFont  db      '宋体';0

            de

            invoke  SendMessage;hWinEdit;EM_SETTEXTMODE;TM_PLAINTEXT;0

            invoke  RtlZeroMemory;addr @stCf;sizeof @stCf

            mov     @stCf。cbSize;sizeof @stCf

            mov     @stCf。yHeight;9 * 20

            mov     @stCf。dwMask;CFM_FACE or CFM_SIZE or CFM_BOLD

            invoke  lstrcpy;addr @stCf。szFaceName;addr szFont

            invoke  SendMessage;hWinEdit;EM_SETCHARFORMAT;0;addr @stCf

程序首先将控件的模式设置为Plain Text模式,然后定义了一个名为@stCf的CHARFORMAT结构,将结构长度设置为CHARFORMAT结构的长度,然后在dwMask 字段中使用CFM_FACE, CFM_SIZE和CFM_BOLD标志,表示只使用字体、字体大小和字体粗细参数,最后发送EM_SETCHARFORMAT消息将控件中的全部文字设置为大小为9磅(小五号)的“宋体”。

4。 装入和保存文本

显然,使用GetWindowText和SetWindowText函数来保存和装入文本是可行的,但是RichEdit控件支持很大的文件,当文件足够大的时候,使用这种方法就很麻烦,因为必须首先要分配一块足够大的内存用做缓冲区,为了解决这个问题,Richedit控件提供了一种新方法,那就是文本流(Text Streaming)。

考虑这样一种情况:为了装入文本,可以申请一块大小合适的缓冲区(当然不会大到能容纳全部文本),每次从文件中读入缓冲区大小的文本并添加到控件中,如此循环直到读入全部文本;保存文本的时候,同样可以每次从控件中取出缓冲区大小的文本,然后写入文件,如此循环直到处理完控件中的全部文本。

文本流的操作方法与此类似,只不过缓冲区和循环都封装在控件的内部,而我们通过提供回调函数的办法提供读写文件的功能模块,Richedit控件循环调用这个模块直到处理完全部的内容。每次调用的时候,控件通过参数告诉回调函数要读写的字节数和缓冲区的地址。文本的流入和流出使用EM_STREAMIN和EM_STREAMOUT消息,这两个消息的使用格式是一样的:

    invoke  SendMessage;hWinEdit;EM_STREAMIN;uFormat;lpStream

    invoke  SendMessage;hWinEdit;EM_STREAMOUT;uFormat;lpStream

wParam参数中的uFormat指定需要流入/流出的内容,它可以是以下的取值:

●   SF_RTF——文本格式是RTF格式。

●   SF_TEXT——文本是Plain Text格式,也就是简单的文本格式。

●   SFF_SELECTION——流操作的范围是当前选择区域。如果将文本流入,当前选择区域就会被替换;如果是流出,则只有那些当前选定的文本才流出。如果没有指定这个标志,操作范围是控件中的所有文本。

●   SF_UNICODE——指定的是 Unicode 文本(2。0及以上版本提供)。

lParam参数中的lpStream指向一个EDITSTREAM 结构,该结构定义如下:

 EDITSTREAM STRUCT 

    dwCookie DWORD      ?   ;用户自定义值

    dwError DWORD       ?   ;用来返回流操作过程中的错误信息

    pfnCallback DWORD   ?   ;回调函数地址

EDITSTREAM ENDS

结构中各字段的说明如下:

●   dwCookie——应用程序自定义的数值,这个数值将会传递给回调函数。

●   dwError——指示流操作的结果,0说明没有错误。

●   pfnCallback——指向回调函数,该函数由用户定义,并由RichEdit控件调用来传输文本。RichEdit控件将文本分成多个部分,每次调用该函数处理一个部分,直到全部文本被处理为止。

回调函数的定义如下:

EditStreamCallback  proc    dwCookie;lpBuffer;NumBytes; pBytesTransferred

控件传递给回调函数的参数说明如下:

●   dwCookie——就是消息中指定的EDITSTREAM结构中定义的dwCookie值。

●   lpBuffer——指向Richedit控件提供的缓冲区。对于流入操作,这里用来接收流入的文本;对于流出操作,这里存放要流出的文本。

返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!