When I subclass the richedit control and load a popup menu under the WM_CONTEXTMENU handler, the cursor remains in the editor shape (I-beam) and MOUSEPTR appears to have no effect.
The same menu works in a similar context in the dialog with the correct pointer shape.
Any suggestions most welcome.
Compileable code is PBWin 8.04
The same menu works in a similar context in the dialog with the correct pointer shape.
Any suggestions most welcome.
Compileable code is PBWin 8.04
Code:
' Popup Menu mouse cursor problem ' Chris Holbrook 18 Mar 2008 ' why does the mouse cursor look like I-beam not pointer #COMPILE EXE #DIM ALL #INCLUDE "WIN32API.INC" #INCLUDE "RICHEDIT.INC" %IDD_DIALOG1 = 101 %IDC_RICHEDIT1 = 102 '--------------------------------------------------------------------------- FUNCTION subClassEditProc(BYVAL hWnd AS DWORD, BYVAL wMsg AS DWORD, BYVAL wParm AS DWORD, BYVAL lParm AS DWORD) AS LONG LOCAL p AS PointAPI LOCAL hpopup, MenuChoice AS LONG LOCAL smsg AS STRING STATIC dwOrigEditProc AS DWORD STATIC InfoDlg AS DWORD' handle of Ctrl-G info dialog ' IF hWnd = 0 THEN ' initial message from parent dwOrigEditProc = wparm FUNCTION = 1 EXIT FUNCTION END IF SELECT CASE wMsg CASE %WM_CONTEXTMENU hPopup = CreatePopupMenu CALL InsertMenu(hPopup, 0, %MF_BYCOMMAND , 1, "&Apples") CALL InsertMenu(hPopup, 0, %MF_BYCOMMAND , 2, "&Oranges") CALL InsertMenu(hPopup, 0, %MF_BYCOMMAND , 3, "&Done") CALL InsertMenu(hPopup, 0, %MF_BYCOMMAND , 4, "&Cancel") MOUSEPTR 1 ' pointer shape CALL GetCursorPos(BYREF p) MenuChoice = TrackPopupMenuEx(hPopup, %MF_ENABLED OR %MF_BYCOMMAND OR %TPM_RETURNCMD, p.x, p.y, _ hWnd, BYVAL %NULL) CALL DestroyMenu(hPopup) SELECT CASE menuchoice ' END SELECT MOUSEPTR 3 'I-beam shape END SELECT FUNCTION = CallWindowProc(dwOrigEditProc, hWnd, wMsg, wParm, lParm) END FUNCTION '--------------------------------------------------------------------------- CALLBACK FUNCTION ShowDIALOG1Proc() LOCAL dwOrigEditProc AS DWORD SELECT CASE AS LONG CBMSG CASE %WM_INITDIALOG dwOrigEditProc = SetWindowLong(getdlgitem(CBHNDL, %IDC_RICHEDIT1), _ %GWL_WNDPROC, CODEPTR(subClassEditProc)) 'subclass ' call the subclassed control directly to tell it what it's original WndProc is subClassEditProc 0, 0, dwOrigEditProc, 0 END SELECT END FUNCTION '---------------------------------------------------- FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG LOCAL lRslt AS LONG LOCAL hDlg AS DWORD DIALOG NEW hParent, "Mouse Cursor Question 18-MAR-2008", 70, 70, 201, 121, %WS_POPUP OR %WS_BORDER OR %WS_DLGFRAME OR _ %WS_SYSMENU OR %WS_CLIPSIBLINGS OR %WS_VISIBLE OR %DS_MODALFRAME 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 "RichEdit50W", hDlg, %IDC_RICHEDIT1, "RichEdit1", 5, 5, 190, 110, %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP OR _ %WS_VSCROLL OR %WS_HSCROLL OR %ES_LEFT OR %ES_MULTILINE OR %ES_AUTOVSCROLL OR %ES_AUTOHSCROLL OR %ES_WANTRETURN, _ %WS_EX_CLIENTEDGE OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR DIALOG SHOW MODAL hDlg, CALL ShowDIALOG1Proc TO lRslt FUNCTION = lRslt END FUNCTION '================================================================= FUNCTION PBMAIN() LOCAL hlib AS LONG LOCAL s AS STRING hLib = LoadLibrary("Msftedit.dll") 'Riched32.dll") IF hLib = 0 THEN s = "File 'Riched20.dll' required" MSGBOX s, %MB_ICONWARNING, "File not Found": EXIT FUNCTION END IF ShowDIALOG1 %HWND_DESKTOP FreeLibrary hLib END FUNCTION
Comment