This code shows messages captured by the CALL and Subclass procedures. It would be improved by suppressing all but the first of a series of mousemoves (and probably in 100 other ways) but I ran out of time, any offers?
Code:
#PBFORMS CREATED V1.51 #COMPILE EXE #DIM ALL #PBFORMS BEGIN INCLUDES #IF NOT %DEF(%WINAPI) #INCLUDE "WIN32API.INC" #ENDIF #PBFORMS END INCLUDES #PBFORMS BEGIN CONSTANTS %IDD_DIALOG1 = 101 %IDC_LABEL1 = 1001 %IDC_BUTTON1 = 1003 %IDC_TEXTBOX3 = 1008 '* %IDC_LISTBOX1 = 1010 %IDC_LABEL4 = 1012 %IDC_LINE1 = 1013 %IDC_TEXTBOX1 = 1014 '* %IDC_LABEL2 = 1015 '* #PBFORMS END CONSTANTS $PROGNAME = "xxx.bas" DECLARE CALLBACK FUNCTION ShowDIALOG1Proc() DECLARE FUNCTION ShowDIALOG1(BYVAL ghMainDlgarent AS DWORD) AS LONG #PBFORMS DECLARATIONS GLOBAL goldLabelProc AS DWORD GLOBAL ghMainDlg AS DWORD GLOBAL gsleepytime AS LONG '---------------------------------------------------------------------------------- '---------------------------------------------------------------------------------- FUNCTION PBMAIN() gSLEEPYTIME = 0 ShowDIALOG1 %HWND_DESKTOP END FUNCTION '---------------------------------------------------------------------------------- CALLBACK FUNCTION ShowDIALOG1Proc() LOCAL s, sline AS STRING STATIC stitle AS STRING STATIC hLABEL1 AS LONG ' handle to LABEL1's window SELECT CASE AS LONG CBMSG CASE %WM_INITDIALOG REDIM tbs(0 TO 2) AS LONG 'Note: negative values makes tabs stops right aligned, ' positive values makes them left aligned tbs(0) = -50 : tbs(1) = -100 : tbs(2) = -210 CONTROL SEND CBHNDL, %IDC_LISTBOX1, %LB_SETTABSTOPS, UBOUND(tbs)+1, VARPTR(tbs(0)) ' DIALOG GET TEXT CBHNDL TO stitle CONTROL HANDLE CBHNDL, %IDC_LABEL1 TO hLABEL1 gOldLabelProc = SetWindowLong(hLABEL1, %GWL_WNDPROC, CODEPTR(LabelSCProc)) CASE %WM_MOUSEMOVE DIALOG SET TEXT CBHNDL, stitle CASE %WM_NCACTIVATE STATIC hWndSaveFocus AS DWORD IF ISFALSE CBWPARAM THEN hWndSaveFocus = GetFocus() ELSEIF hWndSaveFocus THEN SetFocus(hWndSaveFocus) hWndSaveFocus = 0 END IF CASE %WM_COMMAND SELECT CASE AS LONG CBCTL CASE %IDC_BUTTON1 IF CBCTLMSG = %BN_CLICKED THEN IF IsWindowEnabled(GetDlgItem(CBHNDL, %IDC_LABEL1)) THEN CONTROL DISABLE CBHNDL, %Idc_LABEL1 DIALOG SET TEXT CBHNDL, stitle CONTROL SET TEXT CBHNDL, %IDC_BUTTON1, "Press me to enable LABEL1" ELSE CONTROL ENABLE CBHNDL, %Idc_LABEL1 DIALOG SET TEXT CBHNDL, stitle CONTROL SET TEXT CBHNDL, %IDC_BUTTON1, "Press me to disable LABEL1" END IF END IF END SELECT CASE %WM_DESTROY SetWindowLong CBHNDL, %GWL_WNDPROC, gOldLabelProc END SELECT END FUNCTION '----------------------------------------------------------- FUNCTION LabelCallProc(BYVAL hWnd AS DWORD, BYVAL wMsg AS LONG, _ BYVAL wParam AS LONG, BYVAL lParam AS LONG) AS LONG LOCAL ghMainDlg, lcbctlmsg AS LONG LOCAL sz AS STRING *64 SELECT CASE AS LONG wMsg sz = "" CASE %WM_COMMAND IF LO(WORD, wparam) = %IDC_LABEL1 THEN 'listbox add hWnd, %IDC_LISTBOX1, STR$(LO(WORD,lparam)) + ":" + STR$(HI(WORD,lparam)) 's = FORMAT$(, "#") ' there must be a more efficient way of doing this! lcbctlmsg = HI(WORD, wParam) SELECT CASE lcbctlmsg CASE %STN_CLICKED sz = $TAB + "LABELCALLPROC" + $TAB + "STN_CLICKED" CASE %STN_DBLCLK sz = $TAB + "LABELCALLPROC" + $TAB + "STN_DBLCLK" CASE %STN_DISABLE sz = $TAB + "LABELCALLPROC" + $TAB + "STN_DISABLE" CASE %STN_ENABLE sz = $TAB + "LABELCALLPROC" + $TAB + "STN_ENABLE" END SELECT IF TRIM$(sz) <> "" THEN CONTROL SEND hWnd, %IDC_LISTBOX1, %lb_insertstring, 0, VARPTR(sz) END IF END SELECT END FUNCTION '-------------------------------------------------------------------------------------------- FUNCTION LabelSCProc(BYVAL hWnd AS DWORD, BYVAL wMsg AS LONG, _ BYVAL wParam AS LONG, BYVAL lParam AS LONG) AS LONG LOCAL hP, lcbctlmsg AS LONG LOCAL sz AS STRING *64 hP = getparent(hWnd) sz = "" SELECT CASE AS LONG wMsg CASE %WM_NOTIFY sz = $TAB + "LABELSCPROC" + $TAB + "STN_CLICKED" CASE %WM_MOUSEMOVE sz = $TAB + "LABELSCPROC" + $TAB + "WM_MOUSEMOVE" CASE %WM_RBUTTONDOWN sz = $TAB + "LABELSCPROC" + $TAB + "WM_RBUTTONDOWN" CASE %WM_LBUTTONDOWN sz = $TAB + "LABELSCPROC" + $TAB + "WM_LBUTTONDOWN" CASE %WM_LBUTTONDBLCLK sz = $TAB + "LABELSCPROC" + $TAB + "WM_LBUTTONDBLCLK" END SELECT IF TRIM$(sz) <> "" THEN CONTROL SEND hP, %IDC_LISTBOX1, %lb_insertstring, 0, VARPTR(sz) FUNCTION = CallWindowProc(gOldLabelProc, hWnd, wMsg, wParam, lParam) END FUNCTION '------------------------------------------------------------------------------------------ FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG LOCAL lRslt AS LONG #PBFORMS BEGIN DIALOG %IDD_DIALOG1->-> LOCAL hDlg AS DWORD DIALOG NEW hParent, "DDT LABEL TRIGGERS", 7, 62, 408, 161, %WS_POPUP OR %WS_BORDER OR %WS_DLGFRAME OR %WS_SYSMENU OR _ %WS_CLIPSIBLINGS OR %WS_VISIBLE OR %DS_MODALFRAME OR %DS_CENTER OR %DS_3DLOOK OR %DS_NOFAILCREATE OR %DS_SETFONT, _ %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg CONTROL ADD LABEL, hDlg, %IDC_LABEL1, "Label1", 30, 35, 85, 20, %WS_CHILD OR %WS_VISIBLE OR %SS_LEFT OR %SS_NOTIFY OR _ %SS_SUNKEN OR %SS_NOTIFY, %WS_EX_LEFT OR %WS_EX_LTRREADING CALL LabelCallProc CONTROL ADD BUTTON, hDlg, %IDC_BUTTON1, "Press me to disable LABEL1", 10, 60, 125, 15 CONTROL ADD LISTBOX, hDlg, %IDC_LISTBOX1, , 155, 20, 240, 130, %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP OR %WS_VSCROLL OR _ %LBS_MULTIPLESEL OR %LBS_SORT OR %LBS_NOTIFY OR %LBS_USETABSTOPS, %WS_EX_CLIENTEDGE OR %WS_EX_LEFT OR %WS_EX_LTRREADING _ OR %WS_EX_RIGHTSCROLLBAR CONTROL ADD LABEL, hDlg, %IDC_LABEL4, "Function and message id", 155, 5, 240, 15 CONTROL ADD LINE, hDlg, %IDC_LINE1, "Line1", 5, 25, 135, 55 #PBFORMS END DIALOG ghMainDlg = hDlg DIALOG SHOW MODAL hDlg, CALL ShowDIALOG1Proc TO lRslt #PBFORMS BEGIN CLEANUP %IDD_DIALOG1 #PBFORMS END CLEANUP FUNCTION = lRslt END FUNCTION
Comment