RichEdit Code PowerBASIC Peer Support Community (original) (raw)

No need to jump in, Jules has already answered. Also no need to create any fonts - just do what Jules shows. The flags can be %SCF_ALL, %SCF_SELECTION (most common) or combination %SCF_WORD OR %SCF_SELECTION (word at caret's place is changed). Here's an old "Tiny word" example that may be of help:
'

Code:

'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ' RichEdit demo - Public Domain by Borje Hagsten, October 2002 ' Shows how to change font settings in selection and update controls ' when caret moves around, etc. Even handles WingDings font properly. ' ' Basically the same as a sample I posted a year ago, but updated ' for PBWIN 7.0 (can now use plain CHARFORMAT structure), plus I ' added a working right-click popup edit menu. Also implemented ' %SCF_WORD to enable settings on non-selected word at caret's place. ' Note: no sub-classing needed or used for right-click popup menu. ' %EM_SETEVENTMASK enables us to get the notifications we need anyway. ' ' Tip: Can combine this sample with Don Dickinson's excellent RTF routines ' (see: http://dickinson.basicguru.com/code.htm), add ways to set bulleted ' paragraphs, etc. via EM_SETPARAFORMAT, mix it all up in NotePad sample ' and you have made yourself an almost complete Word Processor. Also, lots ' of other RichEdit samples here with code that can be fun to add.. :) '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ #COMPILE EXE #INCLUDE "WIN32API.INC" #INCLUDE "RICHEDIT.INC"

%IDBTN_BOLD = 110 %IDBTN_ITALIC = 111 %IDBTN_ULINE = 112 %IDBTN_STRIKE = 113 %IDCHK_COLOR = 120 %IDCB_FONTNAMES = 130 %IDCB_FONTSIZES = 131 %ID_RICHEDIT = 151 %IDM_UNDO = 220 %IDM_CUT = 222 %IDM_COPY = 223 %IDM_PASTE = 224 %IDM_DELETE = 225 %IDM_SELALL = 226

GLOBAL hDlg AS LONG, hEdit AS LONG, gLF AS LOGFONT

'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ' Create dialog and controls, etc '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ FUNCTION PBMAIN () AS LONG LOCAL hLib AS DWORD

hLib = LoadLibrary("MSFTEDIT.DLL") IF hLib = 0 THEN EXIT FUNCTION '---------------------------------------------------------- DIALOG NEW 0, "TinyWord - RichEdit sample for PBWIN",,, 400, 242, _ %WS_BORDER OR %WS_SYSMENU, 0 TO hDlg '---------------------------------------------------------- CONTROL ADD "RICHEDIT50W", hDlg, %ID_RICHEDIT, "Here is some text to start with..", _ 1, 22, 395, 202, _ %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP OR %WS_VSCROLL OR _ %ES_AUTOVSCROLL OR %ES_MULTILINE OR %ES_WANTRETURN OR _ %ES_NOHIDESEL OR %ES_SAVESEL, %WS_EX_CLIENTEDGE CONTROL HANDLE hDlg, %ID_RICHEDIT TO hEdit

CONTROL ADD COMBOBOX, hDlg, %IDCB_FONTNAMES, , 4, 4, 100, 120, _ %CBS_DROPDOWNLIST OR %CBS_SORT OR %WS_VSCROLL

'should enumerate, but lazy - with TrueType font one can simply list desired sizes.. REDIM fs(15) AS STRING fs(0) = "8" : fs(1) = "9" : fs(2) = "10" : fs(3) = "11" fs(4) = "12" : fs(5) = "14" : fs(6) = "16" : fs(7) = "18" fs(8) = "20" : fs(9) = "22" : fs(10) = "24" : fs(11) = "26" fs(12) = "28" : fs(13) = "36" : fs(14) = "48" : fs(15) = "72" CONTROL ADD COMBOBOX, hDlg, %IDCB_FONTSIZES, fs(), 110, 4, 30, 120, _ %CBS_DROPDOWNLIST OR %WS_VSCROLL

CONTROL ADD BUTTON, hDlg, %IDBTN_BOLD, "&B", 150, 4, 14, 14, %BS_AUTOCHECKBOX OR %BS_PUSHLIKE CONTROL ADD BUTTON, hDlg, %IDBTN_ITALIC, "&I", 164, 4, 14, 14, %BS_AUTOCHECKBOX OR %BS_PUSHLIKE CONTROL ADD BUTTON, hDlg, %IDBTN_ULINE , "&U", 178, 4, 14, 14, %BS_AUTOCHECKBOX OR %BS_PUSHLIKE CONTROL ADD BUTTON, hDlg, %IDBTN_STRIKE , "&S", 192, 4, 14, 14, %BS_AUTOCHECKBOX OR %BS_PUSHLIKE CONTROL ADD CHECKBOX, hDlg, %IDCHK_COLOR , "&Red ", 210, 4, 30, 14 CONTROL ADD BUTTON, hDlg, %IDOK, "&Open file", 242, 4, 50, 14

'---------------------------------------------------------- DIALOG SHOW MODELESS hDlg, CALL DlgProc DO DIALOG DOEVENTS LOOP WHILE ISWIN(hDlg)

IF hLib THEN FreeLibrary hLib 'unload RichEdit on exit.. END FUNCTION

'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ' Main callback '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ CALLBACK FUNCTION DlgProc() AS LONG

SELECT CASE CBMSG CASE %WM_INITDIALOG 'first message - initiate LOCAL hDC AS LONG, lRet AS LONG, txt AS STRING, cr AS CHARRANGE

    lRet = 1 'enumerate all fonts and fill font name combobox
    hDC = GetDC(%HWND_DESKTOP)
    EnumFontFamilies hDC, BYVAL %NULL, CODEPTR(EnumFontFamProc), BYVAL VARPTR(lRet)
    ReleaseDC %HWND_DESKTOP, hDC

    'set event mask so we'll get EN_SELCHANGE and %ENM_MOUSEEVENTS notifications
    SendMessage(hEdit, %EM_SETEVENTMASK, 0, %ENM_SELCHANGE OR %ENM_MOUSEEVENTS)

    'start out with this font
    SendMessage(hEdit, %EM_SETSEL, 0, -1)
    SetRFname(hEdit, "Times New Roman")
    SetRFsize(hEdit, 12)
    SendMessage(hEdit, %EM_SETSEL, 0, 0)
    SendMessage(hEdit, %EM_EMPTYUNDOBUFFER, 0, 0)
    UpdateControls(CB.HNDL, hEdit)

    'uncomment next line to test with another background color
    'SendMessage hEdit, %EM_SETBKGNDCOLOR, 0, RGB(196,255,255)


 CASE %WM_COMMAND
    SELECT CASE CBCTL
       CASE %IDCANCEL 'EXIT (also via Escape key)
          IF CBCTLMSG = %BN_CLICKED THEN DIALOG END CBHNDL

       CASE %IDOK
           IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN
               LOCAL dwStyle AS DWORD, sBuf, sFile AS STRING
               dwStyle = %OFN_EXPLORER OR %OFN_FILEMUSTEXIST OR %OFN_HIDEREADONLY

               DISPLAY OPENFILE CB.HNDL, , , "", CURDIR$, _
                                CHR$("RTF Files", 0, "*.rtf", 0, _
                                     "Text Files", 0, "*.txt", 0, _
                                     "All Files", 0, "*.*", 0), _
                                     "", "rtf", dwStyle TO sFile

               IF LEN(sFile) THEN
                   DIALOG SET TEXT CB.HNDL, PATHSCAN$(NAMEX, sFile)
                   OPEN sFile FOR BINARY AS #1
                     GET$ #1, LOF(1), sBuf
                   CLOSE #1
                   LOCAL stx AS SETTEXTEX
                   stx.flags    = %ST_DEFAULT
                   stx.codepage = 1200
                   SendMessage hEdit, %EM_SETTEXTEX, VARPTR(stx), STRPTR(sBuf) ' works
               END IF
           END IF

       'EDIT MENU COMMANDS
       CASE %IDM_UNDO
          IF CBCTLMSG = %BN_CLICKED THEN
             SendMessage hEdit, %EM_UNDO, 0, 0
             UpdateControls(CB.HNDL, hEdit)
          END IF

       CASE %IDM_CUT
          IF CBCTLMSG = %BN_CLICKED THEN
             SendMessage hEdit, %WM_CUT, 0, 0
             UpdateControls(CB.HNDL, hEdit)
          END IF

       CASE %IDM_COPY
          IF CBCTLMSG = %BN_CLICKED THEN
             SendMessage hEdit, %WM_COPY, 0, 0
             UpdateControls(CB.HNDL, hEdit)
          END IF

       CASE %IDM_PASTE
          IF CBCTLMSG = %BN_CLICKED THEN
             SendMessage hEdit, %WM_PASTE, 0, 0
             UpdateControls(CB.HNDL, hEdit)
          END IF

       CASE %IDM_DELETE
          IF CBCTLMSG = %BN_CLICKED THEN
             SendMessage hEdit, %WM_CLEAR, 0, 0
             UpdateControls(CB.HNDL, hEdit)
          END IF

       CASE %IDM_SELALL
          IF CBCTLMSG = %BN_CLICKED THEN
             cr.cpMin = 0 : cr.cpMax = -1
             SendMessage(hEdit, %EM_EXSETSEL, 0, VARPTR(cr)) 'Get selStart and selEnd
          END IF

       'FORMAT CONTROLS COMMANDS
       CASE %IDCB_FONTNAMES
          IF CBCTLMSG = %CBN_SELENDOK THEN
             COMBOBOX GET TEXT CBHNDL, %IDCB_FONTNAMES TO txt
             SetRFname(hEdit, txt)
             UpdateControls(CB.HNDL, hEdit)
          END IF

       CASE %IDCB_FONTSIZES
          IF CBCTLMSG = %CBN_SELENDOK THEN
             COMBOBOX GET TEXT CBHNDL, %IDCB_FONTSIZES TO txt
             SetRFsize(hEdit, VAL(txt))
             UpdateControls(CB.HNDL, hEdit)
          END IF

       CASE %IDBTN_BOLD
          IF CBCTLMSG <> %BN_CLICKED THEN EXIT FUNCTION
          IF SendMessage(CBLPARAM, %BM_GETCHECK, 0, 0) THEN
             SetRFeffect(hEdit, BYVAL (GetRFEffect(hEdit) OR %CFE_BOLD))
          ELSE
             SetRFeffect(hEdit, BYVAL (GetRFEffect(hEdit) AND NOT %CFE_BOLD))
          END IF
          UpdateControls(CB.HNDL, hEdit)

       CASE %IDBTN_ITALIC
          IF CBCTLMSG <> %BN_CLICKED THEN EXIT FUNCTION
          IF SendMessage(CBLPARAM, %BM_GETCHECK, 0, 0) THEN
             SetRFeffect(hEdit, BYVAL (GetRFEffect(hEdit) OR %CFE_ITALIC))
          ELSE
             SetRFeffect(hEdit, BYVAL (GetRFEffect(hEdit) AND NOT %CFE_ITALIC))
          END IF
          UpdateControls(CB.HNDL, hEdit)

       CASE %IDBTN_ULINE
          IF CBCTLMSG <> %BN_CLICKED THEN EXIT FUNCTION
          IF SendMessage(CBLPARAM, %BM_GETCHECK, 0, 0) THEN
             SetRFeffect(hEdit, BYVAL (GetRFEffect(hEdit) OR %CFE_UNDERLINE))
          ELSE
             SetRFeffect(hEdit, BYVAL (GetRFEffect(hEdit) AND NOT %CFE_UNDERLINE))
          END IF
          UpdateControls(CB.HNDL, hEdit)

       CASE %IDBTN_STRIKE
          IF CBCTLMSG <> %BN_CLICKED THEN EXIT FUNCTION
          IF SendMessage(CBLPARAM, %BM_GETCHECK, 0, 0) THEN
             SetRFeffect(hEdit,  BYVAL (GetRFEffect(hEdit) OR %CFE_STRIKEOUT))
          ELSE
             SetRFeffect(hEdit, BYVAL (GetRFEffect(hEdit) AND NOT %CFE_STRIKEOUT))
          END IF
          UpdateControls(CB.HNDL, hEdit)

       CASE %IDCHK_COLOR
          IF CBCTLMSG <> %BN_CLICKED THEN EXIT FUNCTION
          IF SendMessage(CBLPARAM, %BM_GETCHECK, 0, 0) THEN
             SetRFcolor(hEdit, %RED)
          ELSE
             SetRFcolor(hEdit, %BLACK)
          END IF
          UpdateControls(CB.HNDL, hEdit)

    END SELECT

 CASE %WM_NOTIFY
    LOCAL hMenuEdit AS LONG, pNmh AS NMHDR PTR, mf AS MSGFILTER PTR, pt AS POINTAPI
    pNmh = CBLPARAM

    IF @pNmh.hWndFrom = hEdit THEN
       IF @pNmh.code = %EN_SELCHANGE THEN 'update comboboxes and effect buttons..
          UpdateControls(CB.HNDL, hEdit)
       ELSEIF @pNmh.code = %EN_MSGFILTER THEN 'see if user right-clicked for popup menu
          mf = CBLPARAM
          IF @mf.msg = %WM_RBUTTONDOWN THEN 'ok, so build and show popup menu
             SendMessage hEdit, %EM_EXGETSEL, 0, VARPTR(cr) 'Get selStart and selEnd

             MENU NEW POPUP TO hMenuEdit
               MENU ADD STRING, hMenuEdit, "&Undo"  & $TAB & "Ctrl + Z", %IDM_UNDO, _
                        IIF&(SendMessage(hEdit, %EM_CANUNDO, 0, 0), %MF_ENABLED, %MF_GRAYED)
               MENU ADD STRING, hMenuEdit, "-", 0, 0
               MENU ADD STRING, hMenuEdit, "Cu&t"   & $TAB & "Ctrl + X", %IDM_CUT, _
                        IIF&(cr.cpMin <> cr.cpMax, %MF_ENABLED, %MF_GRAYED)
               MENU ADD STRING, hMenuEdit, "&Copy"  & $TAB & "Ctrl + C", %IDM_COPY, _
                        IIF&(cr.cpMin <> cr.cpMax, %MF_ENABLED, %MF_GRAYED)
               MENU ADD STRING, hMenuEdit, "&Paste" & $TAB & "Ctrl + V", %IDM_PASTE, _
                        IIF&(SendMessage(hEdit, %EM_CANPASTE, 0, 0), %MF_ENABLED, %MF_GRAYED)
               MENU ADD STRING, hMenuEdit, "&Delete" & $TAB & "Del", %IDM_DELETE, _
                        IIF&(cr.cpMin <> cr.cpMax, %MF_ENABLED, %MF_GRAYED)
               MENU ADD STRING, hMenuEdit, "-", 0, 0
               MENU ADD STRING, hMenuEdit, "&Select all" & $TAB & "Ctrl + A", %IDM_SELALL, _
                        IIF&(SendMessage(hEdit, %WM_GETTEXTLENGTH, 0, 0), %MF_ENABLED, %MF_GRAYED)

             pt.x = LOWRD(@mf.lParam)
             pt.y = HIWRD(@mf.lParam)
             ClientToScreen hEdit, pt 'convert mouse position
             TrackPopupMenu hMenuEdit, 0, pt.x, pt.y, 0, CBHNDL, BYVAL %NULL
          END IF
       END IF
    END IF

END SELECT END FUNCTION

'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ' Set font name at caret's place/selection '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ SUB SetRFname(BYVAL hEdit AS DWORD, BYVAL fontName AS STRING) LOCAL hDC AS LONG, lRet AS LONG, cf AS CHARFORMAT

cf.cbsize = LEN(cf) cf.dwMask = %CFM_FACE OR %CFM_CHARSET

hDC = GetDC(%HWND_DESKTOP) 'important: get proper bCharSet and bPitchAndFamily via enumeration EnumFontFamilies hDC, BYVAL STRPTR(fontName), CODEPTR(EnumFontFamProc), BYVAL VARPTR(lRet) ReleaseDC %HWND_DESKTOP, hDC

cf.szFaceName = gLF.lfFaceName cf.bCharSet = gLF.lfCharSet cf.bPitchAndFamily = gLF.lfPitchAndFamily

CALL SendMessage(hEdit, %EM_SETCHARFORMAT, %SCF_WORD OR %SCF_SELECTION, VARPTR(cf))

END SUB

'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ' Set font size at caret's place/selection '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ SUB SetRFsize(BYVAL hEdit AS DWORD, BYVAL fontSize AS LONG) LOCAL cf AS CHARFORMAT

cf.cbsize = LEN(cf) cf.dwMask = %CFM_SIZE cf.yHeight = fontSize * 20

CALL SendMessage(hEdit, %EM_SETCHARFORMAT, %SCF_WORD OR %SCF_SELECTION, VARPTR(cf)) END SUB

'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ' Set font effect at caret's place/selection '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ SUB SetRFeffect(BYVAL hEdit AS DWORD, BYVAL fontEffect AS LONG) LOCAL cf AS CHARFORMAT

cf.cbsize = LEN(cf) cf.dwMask = %CFM_BOLD OR %CFM_ITALIC OR %CFM_UNDERLINE OR %CFM_STRIKEOUT cf.dwEffects = fontEffect

CALL SendMessage(hEdit, %EM_SETCHARFORMAT, %SCF_WORD OR %SCF_SELECTION, VARPTR(cf)) END SUB

'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ' Set text color at caret's place/selection '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ SUB SetRFcolor(BYVAL hEdit AS DWORD, BYVAL fontColor AS LONG) LOCAL cf AS CHARFORMAT

cf.cbsize = LEN(cf) cf.dwMask = %CFM_COLOR cf.crTextColor = fontColor

CALL SendMessage(hEdit, %EM_SETCHARFORMAT, %SCF_WORD OR %SCF_SELECTION, VARPTR(cf)) END SUB

'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ' Enumerate fonts '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ FUNCTION EnumFontFamProc(lf AS LOGFONT, tm AS TEXTMETRIC, _ BYVAL FontType AS LONG, lRet AS LONG) AS LONG IF lRet = 0 THEN gLF = lf ELSE IF (FontType AND %TRUETYPE_FONTTYPE) AND _ ASC(lf.lfFaceName) <> 64 THEN ' no leading @ COMBOBOX ADD hDlg, %IDCB_FONTNAMES, lf.lfFaceName END IF END IF FUNCTION = lRet 'lRet decides: 0 stops enumeration, <> 0 makes sure it continues END FUNCTION

'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ' Return font name at caret's place '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ FUNCTION GetRFname(BYVAL hEdit AS DWORD) AS STRING LOCAL cf AS CHARFORMAT

cf.cbsize = LEN(cf) cf.dwMask = %CFM_FACE

CALL SendMessage(hEdit, %EM_GETCHARFORMAT, %SCF_SELECTION, VARPTR(cf))

FUNCTION = cf.szFaceName END FUNCTION

'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ' Return font size at caret's place '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ FUNCTION GetRFsize(BYVAL hEdit AS DWORD) AS LONG LOCAL cf AS CHARFORMAT

cf.cbsize = LEN(cf) cf.dwMask = %CFM_SIZE

CALL SendMessage(hEdit, %EM_GETCHARFORMAT, %SCF_SELECTION, VARPTR(cf))

FUNCTION = cf.yHeight / 20 END FUNCTION

'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ' Return font effects at caret's place '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ FUNCTION GetRFeffect(BYVAL hEdit AS DWORD) AS LONG LOCAL cf AS CHARFORMAT

cf.cbsize = LEN(cf) cf.dwMask = %CFM_BOLD OR %CFM_ITALIC OR %CFM_UNDERLINE OR %CFM_STRIKEOUT

CALL SendMessage(hEdit, %EM_GETCHARFORMAT, %SCF_SELECTION, VARPTR(cf))

FUNCTION = cf.dwEffects END FUNCTION

'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ' Return text color at caret's place '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ FUNCTION GetRFcolor(BYVAL hEdit AS DWORD) AS LONG LOCAL cf AS CHARFORMAT

cf.cbsize = LEN(cf) cf.dwMask = %CFM_COLOR

CALL SendMessage(hEdit, %EM_GETCHARFORMAT, %SCF_SELECTION, VARPTR(cf))

FUNCTION = cf.crTextColor END FUNCTION

'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ' Update comboboxes and font effect buttons '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ SUB UpdateControls(BYVAL hDlg AS DWORD, BYVAL hEdit AS DWORD) LOCAL lRet AS LONG, txt AS STRING

txt = GetRFname(hEdit) SendMessage GetDlgItem(hDlg, %IDCB_FONTNAMES), %CB_SELECTSTRING, -1, BYVAL STRPTR(txt)

txt = FORMAT$(GetRFsize(hEdit)) SendMessage GetDlgItem(hDlg, %IDCB_FONTSIZES), %CB_SELECTSTRING, -1, BYVAL STRPTR(txt)

lRet = GetRFeffect(hEdit) CONTROL SEND hDlg, %IDBTN_BOLD, %BM_SETCHECK, _ IIF&((lRet AND %CFE_BOLD), %BST_CHECKED, %BST_UNCHECKED), 0

CONTROL SEND hDlg, %IDBTN_ITALIC, %BM_SETCHECK, _ IIF&((lRet AND %CFE_ITALIC), %BST_CHECKED, %BST_UNCHECKED), 0

CONTROL SEND hDlg, %IDBTN_ULINE, %BM_SETCHECK, _ IIF&((lRet AND %CFE_UNDERLINE), %BST_CHECKED, %BST_UNCHECKED), 0

CONTROL SEND hDlg, %IDBTN_STRIKE, %BM_SETCHECK, _ IIF&((lRet AND %CFE_STRIKEOUT), %BST_CHECKED, %BST_UNCHECKED), 0

lRet = GetRFcolor(hEdit) CONTROL SEND hDlg, %IDCHK_COLOR, %BM_SETCHECK, _ IIF&(lRet = %RED, %BST_CHECKED, %BST_UNCHECKED), 0

SetFocus hEdit

END SUB '