怎么用这个SendMessage呀!75分(另贴发分)

ExSystem 2003-07-24 05:15:01
找到一个汇编的资料,可是怎么把它转成Delphi的SendMessage呀?要求必须实现以下的三个标志,并且,能在RichEdit中选中高亮显示,或者返回行列值!谢啦75分。
//资料如下:
  RichEdit控件有几种文本操作,查找文本就是其中之一。 查找文本是由发送EM_FINDTEXT或EM_FINDTEXTEX消息来完成的。二者稍有不同。
  EM_FINDTEXT wParam == 查找操作参数。可由下列任意值组合而成。EM_FINDTEXT与EM_FINDTEXTEX二者均一样:
  ★FR_DOWN:该标志指定时,查找操作从当前选定文本之结尾开始,至控件中文本之结尾结束(向下)。该标志只在RichEdit 2.0及以后版本有效。它在版本1.0中是缺省的。版本2.0及以后版本的缺省行为是从当前选定文本之结尾开始,至控件中文本之开始结束(向上)。
  ★FR_MATCHCASE:该标志指定时,区分大小写。
  ★FR_WHOLEWORD:该标志指定时,要整字匹配。
...全文
320 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ExSystem 2003-08-14
  • 打赏
  • 举报
回复
问题用另一种方法解决了,自己顶up!
但是,还是想知道如何用消息的方法来解决这个问题!
ExSystem 2003-07-29
  • 打赏
  • 举报
回复
偶怎么可能不加入RichEdit呢???
wdonghai 2003-07-28
  • 打赏
  • 举报
回复
加入RichEdit单元
ExSystem 2003-07-28
  • 打赏
  • 举报
回复
楼上ltysunde(@ 为要饭而....呐喊 @) 的:
  首先:看不懂
  其次:文不对题!!!
ltysunde 2003-07-26
  • 打赏
  • 举报
回复
http://www.51study.net/detail.asp?ArtId=229
ltysunde 2003-07-26
  • 打赏
  • 举报
回复
SendMessage函数应用(四)



  这一期是SendMessage函数巧应用的最后一期了。在这一期中,我将向大家介绍关于RichTextBox(简称RTF)控件的消息和ListView控件的消息控制各一。

  在Windows消息中,以EM_开头的消息是专门控制TextBox类控件和RTF类控件的。下面介绍的是如何利用EM_消息实现向RichTextBox中粘贴文本和位图.在EM_消息中,有一个EM_PASTESPECIAL消息可以从剪贴板中获取文本或者位图类数据并拷贝到RTF上。消息调用范例如下:

  Private Type repastespecial
  dwAspect As Long
  dwParam As Long
  End Type

  Const WM_USER = &H400
  Const EM_PASTESPECIAL = WM_USER + 64
  Const CF_BITMAP = 2
  Const CF_TEXT = 1
  Const DVASPECT_CONTENT = 1
  Const DVASPECT_ICON = 4

  Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
  (ByVal hwnd As Long, _
  ByVal wMsg As Long, _
  ByVal wParam As Long, _
  lParam As Any) As Long

  Private Sub Command1_Click()
  Dim re As repastespecial

  re.dwAspect = DVASPECT_CONTENT
  If Clipboard.GetFormat(vbCFText) Then ''剪贴板中为文本信息
  Call SendMessage(RichTextBox1.hwnd, EM_PASTESPECIAL, CF_TEXT, re)
  ElseIf Clipboard.GetFormat(vbCFBitmap) Then ''剪贴板中为位图信息
  Call SendMessage(RichTextBox1.hwnd, EM_PASTESPECIAL, CF_BITMAP, re)
  End If
  End Sub

  运行程序,点击Command1,可以将剪贴板中的数据(位图或者文本)拷贝到RichTextBox1上。
  在EM_PASTESPECIAL,消息中,wParam定义剪贴板数据类型,lParam定义一个repastespecial类型的数据,其中的dwAspect说明
  数据以何种方式显示到RTF对象上,如果是DVASPECT_CONTENT ,则将整个数据显示在RTF上,如果是DVASPECT_ICON ,则只在RTF上显示一个图标。

  ListView控件也是Windows界面开发中重要的控件,典型的应用就是Windows资源管理器中的文件列表。而在VB中,ListView
  控件包含在Microsoft Windows Common Control 6.0(页可能是5.0,视你的VB或者系统版本而定)中。在Windows API中,有一系列的以LVM_ 开头的消息值,这些消息就是扩展ListView控件所特定的消息值,下面的范例介绍如何通过LVM_消息设置ListView控件中图标的间距。范例如下:

  Private Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
  End Type

  Const LVM_FIRST = &H1000
  Const LVM_SETWORKAREA = LVM_FIRST + 65
  Const LVM_SETICONSPACING = LVM_FIRST + 53

  Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
  (ByVal hwnd As Long, ByVal wMsg As Long, _
  ByVal wParam As Long, lParam As Any) As Long

  Private Sub Form_Load()
  Dim xn As ListItem

  Me.Show

  ListView1.Width = 4500
  ListView1.Height = 3000
  ListView1.Refresh

  Set xn = ListView1.ListItems.Add
  xn.Text = "List1"
  Set xn = ListView1.ListItems.Add
  xn.Text = "List2"
  Set xn = ListView1.ListItems.Add
  xn.Text = "List3"
  Set xn = ListView1.ListItems.Add
  xn.Text = "List4"
  Set xn = ListView1.ListItems.Add
  xn.Text = "List5"
  Set xn = ListView1.ListItems.Add
  xn.Text = "List6"

  ListView1.Refresh
  Call SendMessage(ListView1.hwnd, LVM_SETICONSPACING, 0, _
  ByVal (60 * 65536 + 190&))
  End Sub

  要运行上面的程序,首先要确保ListView1的Arrange属性为1,View属性为0。在上面的程序中,我们利用了VM_SETICONSPACING
  消息来控制图标间距。其中SendMessage中的参数lParam定义图标间距,高位为纵向间距,低位为横向间距,在上面的范例中,我们将图标的纵向间距定义为60像素,横向间距定义为190像素。
  最后要向大家在介绍一下关于在SendMessage函数中lParam的定义问题。可以看到,在前面的程序中,有时候定义lParam As Any,有时候定义 ByVal lParam As String。这是为什么呢?对于SendMessage函数。lParam的使用是很灵活的,在一般情况下,lParam是一个指针,它指向的数据类型有三种:长整形、自定义数据结构类型、字符串类型。对于前两种类型,需要将lParam定义为 lParam As Any,从而将lParam数据的指针传递到SendMessage函数。对于字符串类型,则需要定义Byval lParam As String,因为字符串类型数据不同,只有定义ByVal,得到的才是字符串的指针,如果没有ByVal,得到的将是指向字符串指针的指针。另外对于少数的消息来说,SendMessage函数需要的只是lParam本身的值,这时就需要将lParam定义为 Byval lParam As Long,或者在程序调用时在lParam之前加ByVal,例如上面的设置ListView控件图标间距的范例中的SendMessage函数。
  利用SendMessage函数控制控件的行为的方法还有很多,在这些文章中介绍的只是其中的一部分,如果大家多看一下MSDN中的消息定义方面的文档的话,一定还可以找到其中的很多的妙用的。
  (发表时间:2003-5-9 18:59)(阅读次数:1446)
http://www.51study.net/detail.asp?ArtId=229
ExSystem 2003-07-26
  • 打赏
  • 举报
回复
同意jiju(UNCC)的看法:
  我想是lParam的问题,我还没告诉它我要找那个字符串呢!可是,比如我要找“'abc'”,怎么写呀???
-------------------------------------
热烈庆祝本人被怨的信誉分回归!!!
Geranium 2003-07-25
  • 打赏
  • 举报
回复
[Error] Unit1.pas(33): Undeclared identifier: 'EM_FINDTEXT'
[Error] Unit1.pas(33): Undeclared identifier: 'FR_DOWN'
那报这些错是怎么回事呢?

ExSystem 2003-07-25
  • 打赏
  • 举报
回复
Windows.h???这个是C语言用的吧???可是Delphi把它叫做Windows.pas,而且默认就添加啦!不可能吧!
Geranium 2003-07-25
  • 打赏
  • 举报
回复
Header Declared in Winuser.h, include Windows.h

USES Windows.h了没?
Geranium 2003-07-25
  • 打赏
  • 举报
回复
在单元里加了User32.lib的文件了吗?SendMessage是这个文件里的函数,你调用它得包含这个文件才行。
jiju 2003-07-24
  • 打赏
  • 举报
回复
sorry 敲错了:
看msdn描述

:( 今天老犯错误
jiju 2003-07-24
  • 打赏
  • 举报
回复
FR_DOWN = $00000001;但是你的最后一个参数不可能是0
看csdn描述:
EM_FINDTEXT
The EM_FINDTEXT message finds text within a rich edit control.

EM_FINDTEXT
wParam = (WPARAM) (UINT) fuFlags;
lParam = (LPARAM) (FINDTEXT FAR *) lpFindText;

其delphi定义在richedit单元:TFindText
ExSystem 2003-07-24
  • 打赏
  • 举报
回复
我已经知道WM_USER+56等同于EM_FINDTEXT
但是,谁知道FR_DOWN的Integer的数值呀????(应该填在横线上)
FoundAt:=SendMessage(RichEdit1.handle,WM_USER+56,_____,0);
ExSystem 2003-07-24
  • 打赏
  • 举报
回复
不能OK~~~~~~~~~
------------------
[Error] Unit1.pas(33): Undeclared identifier: 'EM_FINDTEXT'
[Error] Unit1.pas(33): Undeclared identifier: 'FR_DOWN'
[Error] Unit1.pas(35): ';' expected but '.' found
[Error] Unit1.pas(37): Declaration expected but end of file found
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

怎么办???
STYun 2003-07-24
  • 打赏
  • 举报
回复
SendMessage(RichEdit.handle,EM_FINDTEXT{message},FR_DOWN(WParam),0);
OK

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧