matwachich Posted July 6, 2013 Posted July 6, 2013 Hi all! Simple question: Why is the mouse click not detected on the Pic control, event WITH the SS_NOTIFY style, while it's detected on free parts of the gui??? Thanks! #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #Region ### START Koda GUI section ### Form= Global $Form1 = GUICreate("Form1", 386, 218) Global $Pic1 = GUICtrlCreatePic("", 8, 8, 184, 200, BitOR($GUI_SS_DEFAULT_PIC,$WS_BORDER,$SS_NOTIFY)) GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN") GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd Func WM_LBUTTONDOWN($hWnd, $iMsg, $iwParam, $ilParam) $iX = BitAND($ilParam, 0xFFFF) - 160 $iY = BitShift($ilParam, 16) - 8 ConsoleWrite($iX & "," & $iY & @CRLF) EndFunc
JohnOne Posted July 6, 2013 Posted July 6, 2013 (edited) I suspect because the window is receiving the message, not the control, which is basically a child window . I don't know if GUICtrlRecvMsg is applicable here, I would start with something along the lines of. While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $Pic1 _func_to_determine_control_coordinates() EndSwitch WEnd Edited July 6, 2013 by JohnOne AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans.
PhoenixXL Posted July 6, 2013 Posted July 6, 2013 A Static(Pic) control send STN_CLICKED through WM_COMMAND Reference Have a look expandcollapse popup#include-once #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <WinAPI.au3> Global Const $STN_CLICKED = 0 Global Const $STN_DBLCLK = 1 Global $Form1 = GUICreate("Form1", 386, 218) GUICtrlCreatePic("", 8, 8, 184, 200, BitOR($GUI_SS_DEFAULT_PIC, $WS_BORDER, $SS_NOTIFY)) Global $Pic1 = GUICtrlGetHandle(-1) GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam) If $ilParam = $Pic1 Then Switch _WinAPI_HiWord($iwParam) Case $STN_CLICKED ConsoleWrite("Clicked") Case $STN_DBLCLK ConsoleWrite("Double Clicked") EndSwitch ConsoleWrite(" at (" & _WinAPI_GetMousePosX(True, $Form1) & "," & _WinAPI_GetMousePosY(True, $Form1) & ")" & @CRLF) EndIf EndFunc ;==>WM_COMMAND Regards My code: PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners. MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression.
matwachich Posted July 6, 2013 Author Posted July 6, 2013 Thanks for the answers! But neither are good for me, because I also need to handle WM_LBUTTONUP, WM_RBUTTONDOWN and WM_RBUTTONUP I'm able to make some non-optimised code with _IsPressed, MouseGetPosX ... but I want (if possible) a solution as elegant than handling window messages in my first post.
PhoenixXL Posted July 7, 2013 Posted July 7, 2013 (edited) If you don't want to handle WM_COMMAND here is a work-around #include-once #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> Global $Form1 = GUICreate("Form1", 386, 218) Global $Pic1 = GUICtrlCreatePic("", 8, 8, 184, 200, BitOR($GUI_SS_DEFAULT_PIC, $WS_BORDER, $SS_NOTIFY)) GUISetState(@SW_SHOW) Do $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_PRIMARYDOWN $aInfo = GUIGetCursorInfo() If $aInfo[4] = $Pic1 Then ConsoleWrite("Pic Clicked" & @CRLF) EndSwitch Until $nMsg = $GUI_EVENT_CLOSE Yet another expandcollapse popup#include-once #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <WinAPI.au3> Global $Form1 = GUICreate("Form1", 386, 218) Global $Pic1 = GUICtrlCreatePic("", 8, 8, 184, 200, BitOR($GUI_SS_DEFAULT_PIC, $WS_BORDER, $SS_NOTIFY)) GUISetState(@SW_SHOW) Do $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_PRIMARYDOWN WM_LBUTTONDOWN($Form1) EndSwitch Until $nMsg = $GUI_EVENT_CLOSE Func WM_LBUTTONDOWN($hWnd) $iX = _WinAPI_GetMousePosX(True, $hWnd) $iY = _WinAPI_GetMousePosY(True, $hWnd) $aInfo = GUIGetCursorInfo() If $aInfo[4] = $Pic1 Then ConsoleWrite("Clk") ConsoleWrite(@TAB & $iX & "," & $iY & @CRLF) EndFunc ;==>WM_LBUTTONDOWN Regards Edited July 7, 2013 by PhoenixXL My code: PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners. MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression.
matwachich Posted July 7, 2013 Author Posted July 7, 2013 (edited) Solved for now, thanks! Gonna use GUI events for my current problem. But I'm always looking for a way to fire a WM_LBUTTONDOWN from a static control. PS: I will use something like this #NoTrayIcon #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> Global $Form1 = GUICreate("Form1", 386, 218) Global $Pic1 = GUICtrlCreatePic("", 8, 8, 184, 200, BitOR($GUI_SS_DEFAULT_PIC, $WS_BORDER, $SS_NOTIFY)) GUISetState(@SW_SHOW) Do $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_PRIMARYDOWN MOUSE($Form1, 1) Case $GUI_EVENT_PRIMARYUP MOUSE($Form1, 0) EndSwitch Until $nMsg = $GUI_EVENT_CLOSE Func MOUSE($hWnd, $iCode) $aInfo = GUIGetCursorInfo() If $aInfo[4] = $Pic1 Then Switch $iCode Case 1 ConsoleWrite("down @ " & $aInfo[0] - 8 & "," & $aInfo[1] - 8 & @CRLF) Case 0 ConsoleWrite("up @ " & $aInfo[0] - 8 & "," & $aInfo[1] - 8 & @CRLF) EndSwitch EndIf EndFunc ;==>WM_LBUTTONDOWN Edited July 7, 2013 by matwachich
PhoenixXL Posted July 7, 2013 Posted July 7, 2013 You register the message for the GUI, not the static control to receive the event of the static control through the Window Procedure of the main GUI, you would have to subclass the Static control and route the message received there to the parent GUI Have a look in the following script expandcollapse popup#include-once #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <Constants.au3> #include <WinAPI.au3> Global $Form1 = GUICreate("Form1", 386, 218) GUICtrlCreatePic("", 8, 8, 184, 200, BitOR($GUI_SS_DEFAULT_PIC, $WS_BORDER, $SS_NOTIFY)) Global $Pic1 = GUICtrlGetHandle(-1) ;get the handle for identifies the static control. DeclareGlobals() ;register the message GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN") GUISetState(@SW_SHOW) Do Sleep(10) Until GUIGetMsg() = $GUI_EVENT_CLOSE Func DeclareGlobals() ;used this to declare the globals required for the subclass. ;only to make the script look good. ;the function to release the resources upon exit OnAutoItExitRegister("Cleanup") ;callback Global $hStub = DllCallbackRegister("_WndProc", "long", "hwnd;uint;wparam;lparam") ;old window procedure Global $lpOldWndProc = _WinAPI_SetWindowLong($Pic1, $GWL_WNDPROC, DllCallbackGetPtr($hStub)) EndFunc ;==>DeclareGlobals Func _WndProc($hWnd, $iMsg, $iwParam, $ilParam) ;proceed the message to the parent Switch $iMsg Case $WM_LBUTTONDOWN Local $hParent = _WinAPI_GetParent($hWnd) Local $tPoint = DllStructCreate($tagPOINT) DllStructSetData($tPoint, 1, _WinAPI_LoWord($ilParam)) DllStructSetData($tPoint, 2, _WinAPI_HiWord($ilParam)) ;convert the points of the picture with respect to that of the parent. _WinAPI_ClientToScreen($hWnd, $tPoint) _WinAPI_ScreenToClient($hParent, $tPoint) ;make the new ilParam. $ilParam = _WinAPI_MakeLong(DllStructGetData($tPoint, 1), DllStructGetData($tPoint, 2)) ;send the message to the main GUI. _WinAPI_PostMessage($hParent, $WM_LBUTTONDOWN, $iwParam, $ilParam) Return 1 ;block the default processing EndSwitch Return _WinAPI_CallWindowProc($lpOldWndProc, $hWnd, $iMsg, $iwParam, $ilParam) EndFunc ;==>_WndProc ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms645607(v=vs.85).aspx ;Posted when the user presses the left mouse button while the cursor is in the client area of a window. Func WM_LBUTTONDOWN($hWnd, $iMsg, $iwParam, $ilParam) $iX = BitAND($ilParam, 0xFFFF) $iY = BitShift($ilParam, 16) ConsoleWrite($iX & "," & $iY & @CRLF) EndFunc ;==>WM_LBUTTONDOWN ;release the resources Func Cleanup() _WinAPI_SetWindowLong($Pic1, $GWL_WNDPROC, $lpOldWndProc) DllCallbackFree($hStub) EndFunc ;==>Cleanup Regards My code: PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners. MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression.
matwachich Posted July 7, 2013 Author Posted July 7, 2013 Very interesting! But too overhead for what I'm doing actualy. But I'm gonna study it, perhaps it will be usefull in the future. Thank you!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now