I'm trying to capture key-press messages, but they aren't available directly in the callback--my optimistic CASE %WM_KEYDOWN was a tad weak
--but that's really what I'm shooting for. Sooo, I tried subclassing each button and it seems to work okay, but I thought there might be a better way. Can I somehow sub/superclass the whole dialog at once? Or is there another way higher/faster/stronger? 


Code:
#PBFORMS Created #COMPILE EXE #DIM ALL '-------------------------------------------------------------------------------- ' ** Includes ** '-------------------------------------------------------------------------------- #PBFORMS Begin Includes #IF NOT %DEF(%WINAPI) #INCLUDE "WIN32API.INC" #ENDIF #PBFORMS End Includes '-------------------------------------------------------------------------------- '-------------------------------------------------------------------------------- ' ** Constants ** '-------------------------------------------------------------------------------- #PBFORMS Begin Constants %IDD_DIALOG1 = 101 %IDC_BUTTON1 = 1001 %IDC_BUTTON2 = 1002 %IDC_BUTTON3 = 1003 #PBFORMS End Constants '-------------------------------------------------------------------------------- '-------------------------------------------------------------------------------- ' ** Declarations ** '-------------------------------------------------------------------------------- DECLARE CALLBACK FUNCTION ShowDIALOG1Proc() DECLARE FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG #PBFORMS Declarations '-------------------------------------------------------------------------------- GLOBAL globHdlg AS LONG GLOBAL globKey AS LONG '-------------------------------------------------------------------------------- FUNCTION PBMAIN() ShowDIALOG1 %HWND_DESKTOP END FUNCTION '-------------------------------------------------------------------------------- '-------------------------------------------------------------------------------- ' ** CallBacks ** '-------------------------------------------------------------------------------- CALLBACK FUNCTION ShowDIALOG1Proc() SELECT CASE CBMSG CASE %WM_KEYDOWN '<< this is really all I'm trying to do 'code code code CASE %WM_COMMAND SELECT CASE CBCTL CASE %IDC_BUTTON1 IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN MSGBOX "%IDC_BUTTON1=" + FORMAT$(%IDC_BUTTON1), _ %MB_SYSTEMMODAL END IF CASE %IDC_BUTTON2 IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN MSGBOX "%IDC_BUTTON2=" + FORMAT$(%IDC_BUTTON2), _ %MB_SYSTEMMODAL END IF CASE %IDC_BUTTON3 IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN MSGBOX "%IDC_BUTTON3=" + FORMAT$(%IDC_BUTTON3), _ %MB_SYSTEMMODAL END IF END SELECT END SELECT END FUNCTION FUNCTION newKeyProc(BYVAL h AS LONG, BYVAL wMsg AS LONG, BYVAL wParam AS LONG, BYVAL lParam AS LONG) AS LONG SELECT CASE wMsg CASE %WM_KEYDOWN IF wParam = %VK_A THEN DIALOG POST globHdlg, %WM_COMMAND, MAKLNG(%IDC_BUTTON1, %BN_CLICKED), 0 ELSEIF wParam = %VK_B THEN DIALOG POST globHdlg, %WM_COMMAND, MAKLNG(%IDC_BUTTON2, %BN_CLICKED), 0 ELSEIF wParam = %VK_C THEN DIALOG POST globHdlg, %WM_COMMAND, MAKLNG(%IDC_BUTTON3, %BN_CLICKED), 0 END IF CASE %WM_DESTROY SetWindowLong h, %GWL_WNDPROC, globKey END SELECT FUNCTION = callWindowProc(globKey, h, wMsg, wParam, lParam) END FUNCTION '-------------------------------------------------------------------------------- '-------------------------------------------------------------------------------- ' ** Dialogs ** '-------------------------------------------------------------------------------- FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG LOCAL lRslt, hButton AS LONG #PBFORMS Begin Dialog %IDD_DIALOG1->-> LOCAL hDlg AS DWORD DIALOG NEW hParent, "Dialog1", 258, 176, 122, 71, %WS_SYSMENU TO hDlg CONTROL ADD BUTTON, hDlg, %IDC_BUTTON1, "a", 15, 15, 30, 30 CONTROL ADD BUTTON, hDlg, %IDC_BUTTON2, "b", 45, 15, 30, 30 CONTROL ADD BUTTON, hDlg, %IDC_BUTTON3, "c", 75, 15, 30, 30 #PBFORMS End Dialog globHdlg = hDlg CONTROL HANDLE hDlg, %IDC_BUTTON1 TO hButton globKey = SetWindowLong (hButton, %GWL_WNDPROC, CODEPTR(newKeyProc)) CONTROL HANDLE hDlg, %IDC_BUTTON2 TO hButton globKey = SetWindowLong (hButton, %GWL_WNDPROC, CODEPTR(newKeyProc)) CONTROL HANDLE hDlg, %IDC_BUTTON3 TO hButton globKey = SetWindowLong (hButton, %GWL_WNDPROC, CODEPTR(newKeyProc)) DIALOG SHOW MODAL hDlg, CALL ShowDIALOG1Proc TO lRslt FUNCTION = lRslt END FUNCTION '--------------------------------------------------------------------------------
Comment