当前位置: 代码迷 >> VC/MFC >> SendMessage(hwndEdit,EM_GETSEL,(WPARAM) &iSelBeg,(LPARAM) &iSelEnd) ;是什么,该如何解决
  详细解决方案

SendMessage(hwndEdit,EM_GETSEL,(WPARAM) &iSelBeg,(LPARAM) &iSelEnd) ;是什么,该如何解决

热度:594   发布时间:2016-05-02 03:26:09.0
SendMessage(hwndEdit,EM_GETSEL,(WPARAM) &iSelBeg,(LPARAM) &iSelEnd) ;是什么
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按这个理解显然也不是这个消息的附加信息,而是对变量的一个操作,是不是这样啊?
------解决思路----------------------
哪有那么多事,把 WPARAM,LPARAM 当作指针而已

不过是发送消息的函数,传送了两个地址进去,
函数返回时,
往地址对应的内存里面,填充起始位置,终止位置而已。
------解决思路----------------------
请 理解 函数 由 参数 表 返回 值。 与 函数 返回值 的 不同。

(WPARAM) &iSelBeg,(LPARAM) &iSelEnd 就是由 参数表 返回值。
就是告诉 函数 把 selection 存入 iSelBeg,和 iSelEnd  中 ,与 初始值 无关。
------解决思路----------------------
VS IDE中,在不明白的符号上点鼠标右键,选转到定义。

------解决思路----------------------
这些东西要学会看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