You are not logged in. You can browse in the PowerBASIC Community, but you must click Login (top right) before you can post. If this is your first visit, check out the FAQ or Sign Up.
I've searched my poffs, maybe I'm not giving the right search key, but I can't find an example of trapping say 'Alt Y' or 'Alt N' so I can simulate the button click. I've got enter clicking the currently focused button and button clicking all working in the sub class.
This is my subclassed Dialog Confirmation y/n that is generic and self sizing based on the message passed. This code sets focus on the default button whether Yes or No and makes sure the broken line box is there (sometimes it's not). It handles the return key and throws it away.
Why do this?
In my main dialog I heavily trap many different keys for branching to lookup routines and/or dup functions. As each textbox gets focus it uses a message pump that will allow responding to any key as a field exit key if that key is setup to be a field exit key. Once the field is exited the key that was pressed is used by the program to call a dialog that presents a listbox of choices for the field or the exit key might fill in the field with default information and go on to the next field.
Other times when return is pressed I normally just go to the next field and re-enter the message pump afresh. Many times the information in the field is not valid or some other combination of fields causes a warning box to be needed.
At that point I pop up a dialog that informs the user of the problem and requires a yes/no answer and is supposed to stay in the field that caused the problem. If I don't throw away the return key it gets processed by the underlying field and it moves to the next field. Anyway, the code below successfully throws away the return and handles the button clicks.
But now the ALT Y and ALT N need to respond.
Code:
GLOBAL V_YNMSG$,CUST_ERMSG_DEPTH AS INTEGER
MACRO mSC_Set(phDlg, phCtl, pProc)
SetWindowLong GetDlgItem(phDlg, phCtl), %GWL_USERDATA, _
SetWindowLong(GetDlgItem(phDlg, phCtl), %GWL_WNDPROC, CODEPTR(pProc))
END MACRO
MACRO mSC_Kill(phCtl)
SetWindowLong(GetDlgItem(CBHNDL, phCtl), %GWL_WNDPROC, _
GetWindowLong(CBHNDL, %GWL_USERDATA))
END MACRO
MACRO mSC_OrgProc
FUNCTION = CallWindowProc(GetWindowLong(phWnd, %GWL_USERDATA), phWnd, pdMsg, pWParam, pLParam)
END MACRO
FUNCTION YNSubClassProc(BYVAL phWnd AS DWORD, BYVAL pdMsg AS DWORD, BYVAL pWParam AS DWORD, BYVAL pLParam AS LONG) AS LONG
SELECT CASE pdMsg
CASE %WM_KEYUP
IF pWParam = 13 THEN
SELECT CASE GetDlgCtrlID(phWnd)
CASE 2
V_YESNO$ = "Y"
CASE 3
V_YESNO$ = "N"
END SELECT
V_YNDEF = 0
DIALOG END GetParent(phWnd),0
END IF
CASE %WM_LBUTTONDOWN
SELECT CASE GetDlgCtrlID(phWnd)
CASE 2
V_YESNO$ = "Y"
CASE 3
V_YESNO$ = "N"
END SELECT
V_YNDEF = 0
DIALOG END GetParent(phWnd),0
END SELECT
mSC_OrgProc
END FUNCTION
CALLBACK FUNCTION YesNoMsgbxproc
DIM sCBCTL AS LONG
SELECT CASE AS LONG CBMSG
CASE %WM_INITDIALOG
IF V_YNDEF = 2 THEN
KeyBd_Event %VK_RIGHT, MapVirtualKey(%VK_RIGHT, 0), 0, 0: SLEEP 0
ELSEIF V_YNDEF = 1 THEN
KeyBd_Event %VK_RIGHT, MapVirtualKey(%VK_RIGHT, 0), 0, 0: SLEEP 0
KeyBd_Event %VK_LEFT, MapVirtualKey(%VK_LEFT, 0), 0, 0: SLEEP 0
END IF
' Initialization handler
'
SetWindowPos CBHNDL,%HWND_TOPMOST,0,0,0,0,%SWP_NOMOVE OR %SWP_NOSIZE
CASE %WM_DESTROY
mSC_Kill(2)
mSC_Kill(3)
CASE %WM_NCACTIVATE
STATIC hWndSaveFocus AS DWORD
IF ISFALSE CBWPARAM THEN
' Save control focus
hWndSaveFocus = GetFocus()
ELSEIF hWndSaveFocus THEN
' Restore control focus
SetFocus(hWndSaveFocus)
hWndSaveFocus = 0
END IF
CASE %WM_SIZE
IF IsIconic(CBHNDL) THEN
DIALOG SHOW STATE hdlg,%SW_HIDE
ELSE
DIALOG SHOW STATE hdlg,%SW_SHOW
END IF
CASE %WM_COMMAND
END SELECT
END FUNCTION
SUB YesNoMsgbx
DIM msg as tagmsg,loopcnt AS LONG,hCtrl2 AS STATIC LONG,hCtrl3 AS STATIC LONG
ALT_ERMSG_DEPTH = 0
ERMSG_DEPTH = (LEN(V_YNMSG$) / 35) * 10 + 10
IF ERMSG_DEPTH < 10 THEN ERMSG_DEPTH = 10
IF INSTR(V_YNMSG$,CHR$(10)) > 0 THEN
ALT_ERMSG_DEPTH = PARSECOUNT(V_YNMSG$,$LF) * 8
END IF
IF ALT_ERMSG_DEPTH > ERMSG_DEPTH THEN
ERMSG_DEPTH = ALT_ERMSG_DEPTH
END IF
IF CUST_ERMSG_DEPTH > 0 THEN
ERMSG_DEPTH = CUST_ERMSG_DEPTH
CUST_ERMSG_DEPTH = 0 'reset
END IF
IF V_YNSIZ < 150 THEN V_YNSIZ = 150
DIALOG DISABLE hdlg
DIALOG NEW 0,"User option",,,V_YNSIZ ,ERMSG_DEPTH + 50, %WS_SYSMENU,0 TO YesNoMsgBox&
CONTROL ADD LABEL,YesNoMsgBox&,10,V_YNMSG$,10,10,V_YNSIZ - 20,ERMSG_DEPTH,%SS_CENTER,%WS_EX_LEFT OR %WS_EX_STATICEDGE
CONTROL SEND YesNoMsgBox&, 10, %WM_SETFONT, hFontText, %True
IF V_YNDEF = 1 THEN
CONTROL ADD BUTTON,YesNoMsgBox&,2,"&Yes",V_YNSIZ/2 - 50,ERMSG_DEPTH + 13,40,14,%BS_CENTER OR %BS_VCENTER,%WS_EX_LEFT
CONTROL ADD BUTTON,YesNoMsgBox&,3,"&No",V_YNSIZ/2 + 10,ERMSG_DEPTH + 13,40,14,%BS_CENTER OR %BS_VCENTER,%WS_EX_LEFT
CONTROL SEND YesNoMsgBox&, 2, %WM_SETFONT, hFontText, %True
CONTROL SEND YesNoMsgBox&, 3, %WM_SETFONT, hFontText, %True
CONTROL SET FOCUS YesNoMsgBox&, 2
CONTROL REDRAW YesNoMsgBox&,2
ELSEIF V_YNDEF = 2 THEN
CONTROL ADD BUTTON,YesNoMsgBox&,2,"&Yes",V_YNSIZ/2 - 50,ERMSG_DEPTH + 13,40,14,%BS_CENTER OR %BS_VCENTER,%WS_EX_LEFT
CONTROL ADD BUTTON,YesNoMsgBox&,3,"&No",V_YNSIZ/2 + 10,ERMSG_DEPTH + 13,40,14,%BS_CENTER OR %BS_VCENTER,%WS_EX_LEFT
CONTROL SEND YesNoMsgBox&, 2, %WM_SETFONT, hFontText, %True
CONTROL SEND YesNoMsgBox&, 3, %WM_SETFONT, hFontText, %True
CONTROL SET FOCUS YesNoMsgBox&, 3
CONTROL REDRAW YesNoMsgBox&,3
END IF
mSC_Set(YesNoMsgBox&,2,YNSubClassProc)
mSC_Set(YesNoMsgBox&,3,YNSubClassProc)
DIALOG SHOW MODAL YesNoMsgBox& CALL YesNoMsgbxproc
SetForeGroundWindow hdlg
V_YNSIZ = 150
DIALOG ENABLE hdlg
END SUB
I will have to do a long post for the benefit of lurkers because I still don't think you need to do the work of the OS.
By the way, the code in your post will never work even if you were to replace WM_KEYUP with WM_SYSKEYUP or WM_SYSCHAR.
You can do one of the following:
1) SetWindowsHookEx(WH_GETMESSAGE)
2) Process keys in message loop
3) Process WM_GETDLGCODE
4) Turn off default dialog box keyboard handling(don't call IsDialogMessage)
I will post explanations and code at a later date.
Admittedly, I'm trying to usurp the work of the OS with my own message loop. It's clear I don't have complete command of what it takes to handle more than one dialog using custom message pumps.
We process personal data about users of our site, through the use of cookies and other technologies, to deliver our services, and to analyze site activity. For additional details, refer to our Privacy Policy.
By clicking "I AGREE" below, you agree to our Privacy Policy and our personal data processing and cookie practices as described therein. You also acknowledge that this forum may be hosted outside your country and you consent to the collection, storage, and processing of your data in the country where this forum is hosted.
Comment