SendMessage(hwndEdit,EM_GETSEL,(WPARAM) &iSelBeg,(LPARAM) &iSelEnd) ;是什么

C2S2D2Nshishabi 2015-11-05 07:13:11
SendMessage(hwndEdit,EM_GETSEL,(WPARAM) &iSelBeg,(LPARAM) &iSelEnd) ;在windows程序设计中的POPPAD3中一段代码,弄不明白,在网上搜的资料很乱
首先,在百度百科和MSDN中查到的信息大致为:获取光标的位置或取得编辑控件中选定内容的范围,
其中WPARAM是选的内容开始的位置,LPARAM是选的内容结束的位置,返回值中低16位为起点,高16位为终点
这也太乱了吧,首先SendMessage(hwnd,EM_GETSEL,WPARAM,LPARAM) ;在MSDN中查到WPARAM是选的内容开始的位置,LPARAM是选的内容结束的位置,咦?不对呀,SendMessage不是向窗口发送消息的吗,然后系统在把要获得的选的内容的位置发回来,但问题是这怎么还没等系统把要选的位置的内容发回来了,SendMessage(hwnd,EM_GETSEL,WPARAM,LPARAM) ;中的WPARAM就已经是选的内容开始的位置,LPARAM就已经是选的内容结束的位置,也就是说SendMessage(hwnd,EM_GETSEL,要选内容开始位置,要选内容的开始位置) ;发给系统,系统再把要选内容的开始和结束位置发回来,这不是白忙活吗,已经知道要选内容的开始位置和结束位置了,还用在发给系统求了吗?
难道是SendMessage(hwnd,EM_GETSEL,WPARAM,LPARAM) ;发给系统后,系统会把SendMessage(hwnd,EM_GETSEL,WPARAM,LPARAM) ;中的WPARAM设为要选内容的开始位置,LPARAM设为要选内容的结束位置?但这时这个消息还能用吗?
第二个问题,网上说SendMessage有返回值,我没看错吧,这个只是把消息发给某个窗口的函数有返回值?
第三个问题,在这个程序中,SendMessage(hwndEdit,EM_GETSEL,(WPARAM) &iSelBeg,(LPARAM) &iSelEnd) ;中的iSelBeg和iSelEnd被定义为了int,而且使用之前没有做任何初始化,本身也不是全局变量或静态变量那种默认为0的变量,这种没初始化就用是不是有问题呀?还有(WPARAM) &iSelBeg,(LPARAM) &iSelEnd,这两个变量干嘛都带着取地址符&干嘛?
第四个问题,我猜想,这个SendMessage(hwndEdit,EM_GETSEL,(WPARAM) &iSelBeg,(LPARAM) &iSelEnd) ;是不是把要选内容的初位置存在了iSelBeg变量,末位置存在了iSelEnd,SendMessage居然还有这个功能?SendMessage不就是给窗口发消息的吗?通常都是SendMessage(hwnd,WM_???,WPARAM,LPARAM) ;,其中WM_???是某个消息,WPARAM,LPARAM是这个消息的附加信息,什么时候变成了SendMessage(hwndEdit,EM_GETSEL,(WPARAM) &iSelBeg,(LPARAM) &iSelEnd) ;,一边给窗口发信息,一边初始化某个变量的值了,这里的(WPARAM) &iSelBeg,(LPARAM) &iSelEnd按这个理解显然也不是这个消息的附加信息,而是对变量的一个操作,是不是这样啊?
...全文
384 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2015-11-07
  • 打赏
  • 举报
回复
引用 13 楼 C2S2D2Nshishabi 的回复:
[quote=引用 9 楼 schlafenhamster 的回复:] 请 理解 函数 由 参数 表 返回 值。 与 函数 返回值 的 不同。 (WPARAM) &iSelBeg,(LPARAM) &iSelEnd 就是由 参数表 返回值。 就是告诉 函数 把 selection 存入 iSelBeg,和 iSelEnd 中 ,与 初始值 无关。
参数表返回值,就是把返回值放入函数的参数?换句话说SendMessage(hwndEdit,EM_GETSEL,(WPARAM) &iSelBeg,(LPARAM) &iSelEnd) ;就是把返回值放入了后面的那个参数,此时的(WPARAM) &iSelBeg,(LPARAM) &iSelEnd已经不是EM_GETSEL的附加消息,而是要把返回的值传入的地方?[/quote]不是传入,是传回 SendMessage 不仅仅是单向传送消息,还可以得到反馈, SendMessage 一直等到消息响应函数执行完成,才返回。 一般多线程,要小心使用 SendMessage 很多时候要使用SendMessageCallBack,SendMessageTimeout 等替换 PostMessage 就不能这么做,它是单向的,你只能得到很有限的反馈,一般是投递成功,失败。 消息发过去,就返回,不管对方的反应, 所以线程之间通讯,常常PostMessage。PostThreadMessage 等等
赵4老师 2015-11-06
  • 打赏
  • 举报
回复
VS IDE中,在不明白的符号上点鼠标右键,选转到定义。
C2S2D2Nshishabi 2015-11-06
  • 打赏
  • 举报
回复
引用 11 楼 paschen 的回复:
这些东西要学会看MSDN https://msdn.microsoft.com/en-us/library/windows/desktop/ms644950%28v=vs.85%29.aspx https://msdn.microsoft.com/en-us/library/bb761598(VS.85).aspx
哎呀,这两个都看了,说的不全,所以才有上面的疑问
C2S2D2Nshishabi 2015-11-06
  • 打赏
  • 举报
回复
引用 9 楼 schlafenhamster 的回复:
请 理解 函数 由 参数 表 返回 值。 与 函数 返回值 的 不同。 (WPARAM) &iSelBeg,(LPARAM) &iSelEnd 就是由 参数表 返回值。 就是告诉 函数 把 selection 存入 iSelBeg,和 iSelEnd 中 ,与 初始值 无关。
参数表返回值,就是把返回值放入函数的参数?换句话说SendMessage(hwndEdit,EM_GETSEL,(WPARAM) &iSelBeg,(LPARAM) &iSelEnd) ;就是把返回值放入了后面的那个参数,此时的(WPARAM) &iSelBeg,(LPARAM) &iSelEnd已经不是EM_GETSEL的附加消息,而是要把返回的值传入的地方?
C2S2D2Nshishabi 2015-11-06
  • 打赏
  • 举报
回复
引用 6 楼 lm_whales 的回复:
1) SendMessage 是阻塞消息,会等待消息处理完成,所以可以回传数据 他的,返回值,和参数都可以 2)WPARAM,LPARAM 传入地址, 是因为对于EM_GETSEL消息 这两个参数是out 参数, 只要不是野指针就好,EM_GETSEL 本身可以修改这两个数据。 3)整型数,当作指针用,在WinAPI 是很常见的现象。
就是说是对于EM_GETSEL消息,WPARAM,LPARAM 此时已经不是EM_GETSEL带的附加信息了,而EM_GETSEL消息要传入的数存放的地方了?
schlafenhamster 2015-11-06
  • 打赏
  • 举报
回复
请 理解 函数 由 参数 表 返回 值。 与 函数 返回值 的 不同。 (WPARAM) &iSelBeg,(LPARAM) &iSelEnd 就是由 参数表 返回值。 就是告诉 函数 把 selection 存入 iSelBeg,和 iSelEnd 中 ,与 初始值 无关。
lm_whales 2015-11-05
  • 打赏
  • 举报
回复
PostMessage 非阻塞消息,返回值不是消息处理过程的返回值。 SendMessage 是阻塞消息,返回值是消息处理过程返回的。 因为,这个SendMessage,有 整型参数, 因此,特定的消息,可以把这些参数,当成指针使用。 因为,和通常的函数调用一样,这个 整型参数(实际上是指针),可以带回数据。
lm_whales 2015-11-05
  • 打赏
  • 举报
回复
有啊 LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam) LRESULT 也是整型的,不同消息,意义不同
lm_whales 2015-11-05
  • 打赏
  • 举报
回复
1) SendMessage 是阻塞消息,会等待消息处理完成,所以可以回传数据 他的,返回值,和参数都可以 2)WPARAM,LPARAM 传入地址, 是因为对于EM_GETSEL消息 这两个参数是out 参数, 只要不是野指针就好,EM_GETSEL 本身可以修改这两个数据。 3)整型数,当作指针用,在WinAPI 是很常见的现象。
C2S2D2Nshishabi 2015-11-05
  • 打赏
  • 举报
回复
引用 2 楼 lm_whales 的回复:
EM_GETSEL消息,函数返回值,同样可以返回起始和终止位置 低16位为起点,高16位为终点 ,就这样,剩下的事情,自己试验一下就可以了
sendmessage不就是给指定窗口发消息的吗?怎么还有发消息以外的操作呀?比如这个除了给窗口发消息,还能改变那两 WPARAM,LPARAM 个参数传进去的地址的值,这样真的可以吗?
C2S2D2Nshishabi 2015-11-05
  • 打赏
  • 举报
回复
引用 2 楼 lm_whales 的回复:
EM_GETSEL消息,函数返回值,同样可以返回起始和终止位置 低16位为起点,高16位为终点 ,就这样,剩下的事情,自己试验一下就可以了
这个sendmessage有返回值吗?没听说呀
C2S2D2Nshishabi 2015-11-05
  • 打赏
  • 举报
回复
引用 1 楼 lm_whales 的回复:
哪有那么多事,把 WPARAM,LPARAM 当作指针而已 不过是发送消息的函数,传送了两个地址进去, 函数返回时, 往地址对应的内存里面,填充起始位置,终止位置而已。
这也太有点不可思议了吧,那两个地址里的数都还没初始化就把地址传进去了可以吗?
lm_whales 2015-11-05
  • 打赏
  • 举报
回复
EM_GETSEL消息,函数返回值,同样可以返回起始和终止位置 低16位为起点,高16位为终点 ,就这样,剩下的事情,自己试验一下就可以了
lm_whales 2015-11-05
  • 打赏
  • 举报
回复
哪有那么多事,把 WPARAM,LPARAM 当作指针而已 不过是发送消息的函数,传送了两个地址进去, 函数返回时, 往地址对应的内存里面,填充起始位置,终止位置而已。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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