yamakawa
发表于 2017-9-11 08:22:57
回复 30# kk_lee69
{:face (197):}遗憾,尝试截获消息。然后自绘,可是失败了。也许是我技术不够?!!
minidick
发表于 2017-9-12 14:16:20
本帖最后由 minidick 于 2017-9-12 14:18 编辑
回复 30# kk_lee69
按照我的理解,GUIRegisterMsg截获的是主窗口的Msg队列,不能截获特定控件的Msg队列。
ListView实现了CustomDraw特性,所以会向主窗口发送WM_NOTIFY,然后主窗口去响应,实现自绘
Button可以设置BS_OWNERDRAW,所以会向主窗口发送WM_DRAWITEM,然后主窗口去响应,实现自绘
Edit(Input)没有上述属性,也不会把自己的WM_PAINT发送给主窗口(WM_KILLFOCUS等会以WM_COMMAND的形式发给主窗口)。所以没法截获WM_PAINT来自绘。更复杂的是,Edit(Input)控件因为有交互功能,除了WM_PAINT会重绘,还会在WM_SETSEL,WM_KILLFOCUS下重绘,都需要截获。
kk_lee69
发表于 2017-9-12 14:42:10
回复 32# minidick
所以理論上是困難嚕
那我可以再請教一下嗎??
INPUT 控件應該是一種特殊的EDIT控件
EDIT 控件會發送 WM_COMMAND
但是 WM_COMMAND 只有
Case $EN_ALIGN_LTR_EC ; 發送 使用者改變編輯控制項方向為左到右消息
Case $EN_ALIGN_RTL_EC ; 發送 使用者改變編輯控制項方向為右到左消息
Case $EN_CHANGE ; 發送使用者修改編輯控制項文本消息
Case $EN_ERRSPACE ; 發送記憶體分配不足的消息
Case $EN_HSCROLL ; 發送使用者點擊水平捲軸消息
Case $EN_KILLFOCUS ; 發送控制項失去鍵盤焦點消息
Case $EN_MAXTEXT ; 發送當前文本插入超過編輯控制項指定字元數消息
Case $EN_SETFOCUS ; 發送編輯控制項接收鍵盤焦點消息
Case $EN_UPDATE ; 發送編輯控制項即將更新消息
Case $EN_VSCROLL ; 發送使用者點擊編輯控制項的垂直捲動條,或使用者在編輯控制項滾動滑鼠滾輪消息
這些消息
上面的這些消息是要不是太過頻繁檢查就是 無法確定檢查的到
不像我們 使用了$EDTE1=GUICtrlCreateInput(........)
只要在後面使用case $EDIT1 這樣不管是我們按下 ENTER 或者 失去焦點 都會檢查一次
使用WM_COMMAND 我可以做一次 就好 不用 每個控件都做一次
但是 使用 case $EDIT1 的方法 就需要每個控件都得要做一次
有辦法在WM_COMMAND 得到 如同 case $EDIT1 的效果嗎??
yamakawa
发表于 2017-9-12 16:11:06
回复 32# minidick
可以获取wm_paint,,用setwindowlong,
但是问题是,如果完全重绘,,其实就不是input,而是你的自绘控件了。。所有都得重做。。。就好像是一般的label一样,什么都没有了。。所以我没思路了
yamakawa
发表于 2017-9-12 16:15:19
回复 33# kk_lee69
不明白你说的意思。。。。
{:face (197):}啥意思来着?
上面的這些消息是要不是太過頻繁檢查就是 無法確定檢查的到
不像我們 使用了$EDTE1=GUICtrlCreateInput(........)
只要在後面使用case $EDIT1 這樣不管是我們按下 ENTER 或者 失去焦點 都會檢查一次
使用WM_COMMAND 我可以做一次 就好 不用 每個控件都做一次
但是 使用 case $EDIT1 的方法 就需要每個控件都得要做一次
有辦法在WM_COMMAND 得到 如同 case $EDIT1 的效果嗎??
kk_lee69
发表于 2017-9-12 16:24:03
回复 35# yamakawa
#include <GUIConstantsEx.au3>
Opt("GUIOnEventMode", 1)
GUICreate("我的?入框 GUI", 320, 120, @DesktopWidth / 2 - 160, @DesktopHeight / 2 - 45, -1); 接受拖?文件 WS_EX_ACCEPTFILES
$EDTE1 = GUICtrlCreateInput("", 10, 5, 300, 20)
$EDTE2=GUICtrlCreateInput("", 10, 35, 300, 20)
$EDTE3=GUICtrlCreateInput("", 10, 65, 300, 20)
$EDTE4=GUICtrlCreateInput("", 10, 95, 300, 20)
GUISetState()
While 1
Switch GUIGetMsg()
Case -3
ExitLoop
Case $EDTE1
MsgBox(0,$EDTE1,"你輸入的是"&GUICtrlRead($EDTE1))
Case $EDTE2
MsgBox(0,$EDTE2,"你輸入的是"&GUICtrlRead($EDTE2))
Case $EDTE3
MsgBox(0,$EDTE3,"你輸入的是"&GUICtrlRead($EDTE3))
Case $EDTE4
MsgBox(0,$EDTE4,"你輸入的是"&GUICtrlRead($EDTE4))
EndSwitch
WEnd
上面例子MsgBox 只會在兩種情況啟動
1. 在 INPUT 輸入完畢後 按下 回車
2. 失去焦點
反觀
Case $EN_ALIGN_LTR_EC ; 發送 使用者改變編輯控制項方向為左到右消息
Case $EN_ALIGN_RTL_EC ; 發送 使用者改變編輯控制項方向為右到左消息
Case $EN_CHANGE ; 發送使用者修改編輯控制項文本消息
Case $EN_ERRSPACE ; 發送記憶體分配不足的消息
Case $EN_HSCROLL ; 發送使用者點擊水平捲軸消息
Case $EN_KILLFOCUS ; 發送控制項失去鍵盤焦點消息
Case $EN_MAXTEXT ; 發送當前文本插入超過編輯控制項指定字元數消息
Case $EN_SETFOCUS ; 發送編輯控制項接收鍵盤焦點消息
Case $EN_UPDATE ; 發送編輯控制項即將更新消息
Case $EN_VSCROLL ; 發送使用者點擊編輯控制項的垂直捲動條,或使用者在編輯控制項滾動滑鼠滾輪消息
這裡面只有 失去焦點 是一樣的沒有回車事件 其他的那些正在改變的在打字的時候就會觸發不適合用來 檢查使用這輸入的資料是否正確
yamakawa
发表于 2017-9-12 16:29:21
本帖最后由 yamakawa 于 2017-9-12 16:40 编辑
回复 36# kk_lee69
好像理解错了。。。。你是不想随时检查?而是你做了某个特定操作后才触发?
再看一下你的代码。。。哈哈,,,Opt("GUIOnEventMode", 1)
然后下面用guigetmsg。。。
kk_lee69
发表于 2017-9-12 16:40:17
可以 你RUN 看看不就知道
kk_lee69
发表于 2017-9-12 16:40:31
回复 37# yamakawa
可以 你RUN 看看不就知道
kk_lee69
发表于 2017-9-12 16:44:40
回复 37# yamakawa
修正一下
Opt("GUIOnEventMode", 1)
這行拿掉就可以 RUN
yamakawa
发表于 2017-9-12 16:45:03
回复 39# kk_lee69
{:face (356):}我特意run了下不行才那么说。。。然后才反应过来,不对啊,应该有反应才对。。。。然后再看了下你代码。。哈哈。。上面注册Opt("GUIOnEventMode", 1)
,后面用guigetmsg,,所以才没反应的。。
这个不管,小错误
问题是,你想实现的是什么?用wm command实现的千分位显示,我上面给了一个例子了。那个不行?$EN_KILLFOCUS和$EN_SETFOCUS 切换显示
kk_lee69
发表于 2017-9-12 16:46:00
回复 37# yamakawa
哈測試的 稍微修改了一下 就發了沒想到忘了拿掉 Opt("GUIOnEventMode", 1)
yamakawa
发表于 2017-9-12 16:53:21
回复 42# kk_lee69
其实你说的listview自绘那个有点像我用的两个input控件,listview可以相应custdraw消息,所以可以在上面贴一层画布,然后在上面随便写我们要的东西,但是input没有,所以我就拿另外一个input放那上面,然后在这个input上写你要的东西。。。原理来说不是一样的么?这样你以后写入数据库什么都不用改动,,因为原来那个input只是被隐藏了。。上面的数据其实都在
minidick
发表于 2017-9-15 14:11:09
回复 36# kk_lee69
我测试下来GUIGetMsg对Input控件只响应了$EN_CHANGE事件。失去焦点时,并不会弹出你的测试对话框。
minidick
发表于 2017-9-15 14:13:19
回复 43# yamakawa
我的理解是我们在尝试一题多解,探索下不同的技术。