Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > 技术类

[转]SendMessage函数的常用消息及其应用7

时 间:2008-12-09 08:09:53
作 者:andymark   ID:1350  城市:深圳
摘 要:SendMessage函数的常用消息及其应用
正 文:

SendMessage函数应用(五)
  RichEdit控件的正文操作

一、正文搜索
     RichEdit 控件具有几种正文操作,搜索指定正文就是其中的一种。搜索正文是通过发送
EM_FINDTEXT 或者 EM_FINDTEXTEX 消息来完成的。这两个消息有一点很小的不同点。

1.EM_FINDTEXT
 wParam=搜索选项,可以是下面3个参数的任意组合值(这些选项对 EM_FINDTEXT 和 EM_FINDTEXTEX
都是一样的):
①FR_DOWN(&H1):搜索方向。如果指定了这个标志值,搜索操作从当前选定的 end 位置开始,直到控件
  中正文的 end 位置结束(向下搜索)。这个标志影响 RichEdit 2.0 和以后版本,是 RichEdit 1.0
  的缺省行为。RichEdit 2.0或以后版本的缺省行为是:在当前选定正文内的从结尾搜索到开始位置
  (向前搜索)。概括来说就是,如果你使用 RichEdit 1.0, 无论你做什么都没法影响搜索的方向,它
  总使用向后搜索。但是如果你使用 RichEdit 2.0 而且你想使用向后搜索的话,你必须指定这个标
  志值,否则使用的是向前搜索了。
②FR_MATCHCASE(&H4):区分大小写。
③FR_WHOLEWORD(&H2):匹配指定搜索串的整个词。

 lParam = FINDTEXT 结构的指针。
Type FINDTEXT        'STRUCT
  chrg As CHARRANGE  '
  lpstrText As Long
End Type

  chrg 是一个 CHARRANGE 结构,其定义如下:
Type CHARRANGE       'STRUCT
  cpMin As Long      '包含字符数组中第一个字符的字符索引
  cpMax As Long      '包含紧跟在字符数组中最后一个字符的字符的字符索引
End Type

  基本上,要搜索一个正文串,你必须指定要搜索的字符范围。cpMin 和 cpMax 的具体意义根据搜索是向
后还是向前是不同的。
  如果是向后搜索,cpMin 指定搜索的开始字符索引,而 cpMax 则是结束字符索引。
  如果是向前搜索,则反过来才对,也就是说 cpMin 包含结束字符索引而cpMax 包含开始字符索引。

  lpstrText 是要搜索的正文串的指针。

2.EM_FINDTEXTEX
  返回控件中跟搜索串匹配的的正文串的一个字符的索引。如果没找到匹配的则返回 -1。

  wParam = 搜索选项,跟 EM_FINDTEXT 的一样。
  lParam = FINDTEXTEX 结构的指针。

Type FINDTEXTEX      'STRUCT
  chrg As CHARRANGE  '
  lpstrText As Long
  chrgText CHARRANGE 'CHARRANGE
End Type

  FINDTEXTEX 中开始的两个成员是跟 FINDTEXT 结构中的一样的。
  chrgText 是一个 CHARRANGE 结构,如果搜索到匹配串的话,其开始/结束字符索引会被填入这个结构中。

  EM_FINDTEXTEX 的返回值跟 EM_FINDTEXT的是一样的。

  EM_FINDTEXT 跟 EM_FINDTEXTEX 的不同处:
FINDTEXTEX 结构有一个另外的chrgText成员, 如果搜索到匹配串的话,其开始/结束字符索引会被填入这个成
员中。如果我们想对这个正文串进行更多的正文操作的话,有这个就方便多了。

二、替换/插入正文

  RichEdit 控件提供了 EM_SETTEXTEX 来进行正文替换/插入操作。这个消息混合了 WM_SETTEXT 和
EM_REPLACESEL 的功能. 它具有以下语法:

  wParam = SETTEXTEX 结构的指针。
Type SETTEXTEX      'STRUCT
  flags As Long
  codepage As Long
End Type

  flags 可以是以下值的组合:
  ST_DEFAULT   删除Undo堆栈,丢弃RTF格式,替换所有的正文。
  ST_KEEPUNDO  保留Undo堆栈。
  ST_SELECTION 替换选定正文并且保留RTF格式

  codepage 是一个常量,指定你的正文想要的代码页。我们通常简单的使用 CP_ACP。

三、正文选择

  我们可以使用消息 EM_SETSEL 或者 EM_EXSETSEL 来编程选择正文.其中任意的一个都可以工作的很好。
要使用哪一个消息要根据可用的字符索引格式来选择。如果它们保存在一个 CHARRANGE 结构中,则使用
EM_EXSETSEL更容易实现。

  EM_EXSETSEL
  wParam = 没有使用,必须为 0 。
  lParam = CHARRANGE 结构的指针,包含想要选定的正文字符范围。

四、事件通知

  在使用多行Edit控件时,你必须子类化它以便得到输入信息象鼠标/键盘事件等。RichEdit 控件提供了一
个更好的方案,它可以把这些消息通知父窗口。为了注册得到通知消息,父窗口发送 EM_SETEVENTMASK 消息
给 RichEdit 控件,指定它对哪些消息感兴趣。
  EM_SETEVENTMASK 具有以下的语法:
wParam  没有使用,必须为 0 。

lParam = 事件掩码值,可以是以下标志值的任意组合:

  ENM_CHANGE 发送 EN_CHANGE 通知
  ENM_CORRECTTEXT 发送 EN_CORRECTTEXT 通知
  ENM_DRAGDROPDONE 发送 EN_DRAGDROPDONE 通知
  ENM_DROPFILES 发送 EN_DROPFILES 通知
  ENM_KEYEVENTS 为键盘消息发送 EN_MSGFILTER 通知
  ENM_LINK Rich Edit 2.0 或以后版本: 当鼠标在具有 CFE_LINK 风格的正文上面移过,而且执行了一个
或几个鼠标动作时,就发送 EN_LINK 通知。
  ENM_MOUSEEVENTS 为鼠标消息发送 EN_MSGFILTER 通知。
  ENM_OBJECTPOSITIONS 发送 EN_OBJECTPOSITIONS 通知
  ENM_PROTECTED 发送 EN_PROTECTED 通知
  ENM_REQUESTRESIZE 发送 EN_REQUESTRESIZE 通知
  ENM_SCROLL 发送 EN_HSCROLL 和 EN_VSCROLL 通知
  ENM_SCROLLEVENTS 为鼠标滑轮发送 EN_MSGFILTER 通知。
  ENM_SELCHANGE 发送 EN_SELCHANGE 通知
  ENM_UPDATE 发送 EN_UPDATE 通知

  Rich Edit 2.0 和以后版本: 这个标志值会被忽略,而经常发送 EN_UPDATE 通知。然而如果 RichEdit
3.0 模拟 RichEdit 1.0的话,你必须使用这个标志值来发送 EN_UPDATE 通知

  上面的所有通知都被做为 WM_NOTIFY 消息来发送:你必须检查 NMHDR 结构的 code 成员来得到通知消
息。譬如,如果你想注册得到鼠标消息(也就是说,你想提供一给上下文相关的弹出菜单)



Access软件网官方交流QQ群 (群号:54525238)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助