about SetWindowLong(100分)

  • 主题发起人 主题发起人 SuperMMX
  • 开始时间 开始时间
S

SuperMMX

Unregistered / Unconfirmed
GUEST, unregistred user!
SetWindowLong 什么时候起作用?<br><br>我用 SetWindowLong(Edit1.Handle, GWL_STYLE, <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GetWindowLong(Edit1.Handle, GWL_STYLE) or <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ES_READONLY);<br><br>来把 &nbsp;edit1 改为 readonly, 但无效。<br>(别说用 &nbsp;Edit1.readonly := True, SendMessage<br>我知道)<br><br>其中一些有效果,一些没有效果。为什么?<br><br>窗口的 style 是不是与外形有关的就有效果,<br>而一些实际属性比如 readonly password (不仅是这些,<br>还有其他窗口类的 style) 动态改动就没有效果,<br>得重建????
 
不会吧, 没人回答?
 
可能(可能!)是这样:<br>因为READONLY属性涉及到了控件本身的处理过程(WindowProc)。<br>所以只改这个就没用了。<br>如果只是改显示方面的属性,就与内部处理函数无关了。。。。
 
确实不能用SetWindowLong来改变这些属性,而理由从逻辑上将应该是你所说的这样,<br><br>那些能改,那些不能改,MSDN讲得很明白.<br><br>如果你没有msdn光盘:<br>http://msdn.microsoft.com/library/psdk/winui/editcon_7rqr.htm
 
如果有一些不能用 &nbsp;SendMessage 来解决而要改变它<br>该怎么办?<br><br><br>另:我在 msdn 里怎么没找到,关于 SetWindowLong 和 GetWindowLong<br>看来,得好好看看。
 
那还是把环境和需求说出来,研究一下有没有别的办法吧!
 
暂时想不起来,呵呵
 
我曾经用SetWindowLong来把一个窗体改为无标题条但又能用鼠标拖动边框改变<br>窗体大小的样子,但刚开始也是和你遇见的问题一样,改了之后似乎没有效果,<br>最后用SetBounds改变一下窗体的大小后才生效。我想(猜)是不是需要刷新之<br>类的操作来使它生效?
 
Zephyr:<br><br>你说的没错,但是只能这样说:<br>对SetWindowLong有效的属性,修改完了还应该刷新一下,<br>而对于不能用SetWindowLong修改的属性.....唉!,就是不能呀!<br><br>看看我提到的网址,已经很明确了,至于根本原因,wint<br>的说法应该有道理.
 
不过没法试了,我的 windows 不行了,装了 6 遍老出错,<br><br>to 温柔一刀:<br>&nbsp; &nbsp;当然是在能改的情况下,<br><br>to Zephyr<br>&nbsp; &nbsp;你的那个必须得重新设一下大小。但其他的不会只刷新一下大小吧
 
还有要说的吗?没说的就分分了,虽然还不是很明确。
 
try &nbsp; <br>&nbsp; &nbsp; ShowWindow( Edit1.Handle, SW_HIDE );<br>&nbsp; &nbsp; SetWindowLong(Edit1.Handle, GWL_STYLE, <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GetWindowLong(Edit1.Handle, GWL_STYLE) or <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ES_READONLY);<br>&nbsp; &nbsp; ShowWindow( Edit1.Handle, SW_SHOW );
 
to victortim:<br>&nbsp; 不行的,<br><br>期待有人能回答,
 
还有什么疑问呢?MSDN上写得很清楚,<br>能用这种方法修改的属性都列出来了。<br><br>比如Edit,只有这几个能用SetWindowLong修改:<br>ES_WANTRETURN<br>ES_UPPERCASE<br>ES_OEMCONVERT<br>ES_NUMBER<br>ES_LOWERCASE<br><br>我能理解你的想法,是希望了解这里的技术原因,<br>但有些事情虽然是技术问题,答案也许只能问MS.
 
并不是所有的属性都能用setwindowslong来修改<br>对于那些能改的,调用时有一个参数(SHOWWINDOW? SHOWNORMAL?)指明是否修改后<br>立即刷新...<br>具体可以查阅msdn
 
奇怪,我怎么没找到,是在control 部分吗?<br>还是在 SetWindowLong.<br><br>to 温柔一刀:<br>我之所以来问,自然有我的原因,或者是没找到,或者一时没想到<br>
 
请问,谁能贴出一段原话来,在 msdn 的光盘中找不到。
 
To create an edit control using the CreateWindow or CreateWindowEx <br>function, specify the EDIT class, appropriate<br>window style constants, and a combination of the following edit <br>control styles. After the control has been created, these styles<br>cannot be modified, except as noted. <br>^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^<br>......<br><br>ES_LOWERCASE<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Converts all characters to lowercase as they are typed into the edit control. <br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;To change this style after the control has been created, use SetWindowLong.
 
谢谢! 其实是不知道该查什么。
 
多人接受答案了。
 
后退
顶部