Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
How does a button implement two functions
#4
this is not a simple thing to do.Many many functions involved to do this its not really that many lines of code

Code:
Copy      Help
str dd=
;BEGIN DIALOG
;0 "" 0x90000A40 0x0 0 0 398 210 "Dialog"
;3 Button 0x54032000 0x0 368 0 30 14 "Close" "left click to close left click+drag to move"
;END DIALOG
;DIALOG EDITOR: "" 0x2040700 "*" "" "" ""
if(!ShowDialog(dd &sub.DlgProc 0)) ret
#sub DlgProc
function# hDlg message wParam lParam
sel message
,case WM_INITDIALOG
,sub.DialogDragSubclassControl id(3 hDlg) ;;subclass button 3    
,case WM_DESTROY
,case WM_COMMAND goto messages2
ret
;messages2
sel wParam
,case IDOK
,case IDCANCEL
,case 3 ;;Close
,DT_Ok hDlg
ret 1

#sub DialogDragSubclassControl
function hwndctrl [modifiers] ;;modifiers: 1 Shift, 2 Ctrl, 4 Alt, 8 Win
;Use this function to subclass a control to enable dialog moving. Call it eg under WM_INITDIALOG.
SetProp hwndctrl "qm_wndproc" SubclassWindow(hwndctrl &sub.DialogDragSubclassProc)
SetProp hwndctrl "qm_modifiers" modifiers
#sub DragDialog
function# hDlg message [modifiers] ;;modifiers: 1 Shift, 2 Ctrl, 4 Alt, 8 Win
POINT-- pp_drag
POINT p
RECT r
int-- t_indrag
sel message
,case WM_LBUTTONDOWN
,t_indrag=0
,if(GetMod!=modifiers) ret
,if(GetWinStyle(hDlg)&WS_CHILD) ;;need to detect drag, or the control will not respond to clicks
,,xm p
,,if(!DragDetect(hDlg p))
,,,ScreenToClient hDlg &p
,,,PostMessage hDlg WM_LBUTTONUP 0 p.y<<16|p.x
,,,ret
,xm pp_drag
,SetCapture hDlg
,t_indrag=1
,
,case [WM_LBUTTONUP,WM_CANCELMODE]
,if(!t_indrag or GetCapture!=hDlg) ret
,ReleaseCapture
,t_indrag=0
,case WM_MOUSEMOVE
,if(!t_indrag or GetCapture!=hDlg) ret
,hDlg=GetAncestor(hDlg 2) ;;in case hDlg is a subclassed control
,GetWindowRect hDlg &r
,xm p
,mov r.left+p.x-pp_drag.x r.top+p.y-pp_drag.y hDlg
,pp_drag=p
ret 1
#sub DialogDragSubclassProc
function# hWnd message wParam lParam
;Used internally in case a control is subclassed. Don't call explicitly.
sel message
,case [WM_LBUTTONDOWN,WM_LBUTTONUP,WM_MOUSEMOVE,WM_CANCELMODE]
,if(sub.DragDialog(hWnd message GetProp(hWnd "qm_modifiers"))) ret
int wndproc=GetProp(hWnd "qm_wndproc"); if(!wndproc) ret
int r=CallWindowProc(wndproc hWnd message wParam lParam)
if(message=WM_NCDESTROY)
,RemoveProp(hWnd "qm_wndproc")
,RemoveProp(hWnd "qm_modifiers")
ret r
its either this way using sub functions or can use user defined functions but code will not get smaller

example using external functions
only code which will be smaller is main dialog
Function DragDialogButton
Code:
Copy      Help
str dd=
;BEGIN DIALOG
;0 "" 0x90000A40 0x0 0 0 398 210 "Dialog"
;3 Button 0x54032000 0x0 368 0 30 14 "Close" "left click to close left click+drag to move"
;END DIALOG
;DIALOG EDITOR: "" 0x2040700 "*" "" "" ""
if(!ShowDialog(dd &sub.DlgProc 0)) ret
#sub DlgProc
function# hDlg message wParam lParam
sel message
,case WM_INITDIALOG
,DialogDragSubclassControl id(3 hDlg) ;;subclass button 3    
,case WM_DESTROY
,case WM_COMMAND goto messages2
ret
;messages2
sel wParam
,case IDOK
,case IDCANCEL
,case 3 ;;Close
,DT_Ok hDlg
ret 1
Function DialogDragSubclassControl
Code:
Copy      Help
;/
function hwndctrl [modifiers] ;;modifiers: 1 Shift, 2 Ctrl, 4 Alt, 8 Win

;Use this function to subclass a control to enable dialog moving.
;Call it eg under WM_INITDIALOG.


SetProp hwndctrl "qm_wndproc" SubclassWindow(hwndctrl &DialogDragSubclassProc)
SetProp hwndctrl "qm_modifiers" modifiers
Function DialogDragSubclassProc
Code:
Copy      Help
;/
function# hWnd message wParam lParam

;Used internally in case a control is subclassed. Don't call explicitly.


sel message
,case [WM_LBUTTONDOWN,WM_LBUTTONUP,WM_MOUSEMOVE,WM_CANCELMODE]
,if(DragDialog_renamed(hWnd message GetProp(hWnd "qm_modifiers"))) ret

int wndproc=GetProp(hWnd "qm_wndproc"); if(!wndproc) ret
int r=CallWindowProc(wndproc hWnd message wParam lParam)

if(message=WM_NCDESTROY)
,RemoveProp(hWnd "qm_wndproc")
,RemoveProp(hWnd "qm_modifiers")

ret r
Function DragDialog_renamed
Code:
Copy      Help
;/
function# hDlg message [modifiers] ;;modifiers: 1 Shift, 2 Ctrl, 4 Alt, 8 Win

;Moves the dialog when the user presses left mouse button on the client area and drags.
;Returns 1 if suscessful, 0 if not (then the message should be passed to the default window procedure).
;The dialog must be a smart dialog, ie with dialog procedure.
;Call this function from the dialog procedure as shown below:

,;case [WM_LBUTTONDOWN,WM_LBUTTONUP,WM_MOUSEMOVE,WM_CANCELMODE] DragDialog hDlg message

;To enable moving the dialog by dragging a control, call DialogDragSubclassControl on WM_INITDIALOG.
;If the control has scroll bars, use Ctrl or other modifier key to scroll.


POINT-- pp_drag
POINT p
RECT r
int-- t_indrag

sel message
,case WM_LBUTTONDOWN
,t_indrag=0
,if(GetMod!=modifiers) ret
,if(IsChildWindow(hDlg)) ;;need to detect drag, or the control will not respond to clicks
,,xm p
,,if(!DragDetect(hDlg p))
,,,ScreenToClient hDlg &p
,,,PostMessage hDlg WM_LBUTTONUP 0 p.y<<16|p.x
,,,ret
,xm pp_drag
,SetCapture hDlg
,t_indrag=1
,
,case [WM_LBUTTONUP,WM_CANCELMODE]
,if(!t_indrag or GetCapture!=hDlg) ret
,ReleaseCapture
,t_indrag=0
,
,case WM_MOUSEMOVE
,if(!t_indrag or GetCapture!=hDlg) ret
,hDlg=GetAncestor(hDlg 2) ;;in case hDlg is a subclassed control
,GetWindowRect hDlg &r
,xm p
,mov r.left+p.x-pp_drag.x r.top+p.y-pp_drag.y hDlg
,pp_drag=p

ret 1


Messages In This Thread
RE: How does a button implement two functions - by Kevin - 06-09-2018, 03:03 AM

Forum Jump:


Users browsing this thread: 2 Guest(s)