WinBatch Tech Support Home

Database Search

If you can't find the information using the categories below, post a question over in our WinBatch Tech Support Forum.

TechHome

Samples

Can't find the information you are looking for here? Then leave a message over on our WinBatch Tech Support Forum.

Selected Text in a MULTILINEBOX

 Keywords:  DLLCall SendMessageA EM_GETSEL MULTILINEBOX MULTI LINE BOX

Reference:EM_GETSEL Message

If you try to sendmessage the EM_GETSEL to MULTILINEBOX using a button control, you will get zero for the selected text. This is because the focus has changed away from the the MULTILINEBOX. Therefore you cannot use a pushbutton event to get selected text from a MULTILINEBOX control, instead you must use a timer event. For Example:

#DefineSubRoutine InitDialogConstants()
   ;DialogprocOptions Constants
   MSG_INIT=0                ; The one-time initialization
   MSG_TIMER=1               ; Timer event
   MSG_BUTTONPUSHED=2        ; Pushbutton or Picturebutton
   MSG_RADIOPUSHED=3         ; Radiobutton clicked
   MSG_CHECKBOX=4            ; Checkbox clicked
   MSG_EDITBOX=5             ; Editbox or Multilinebox
   MSG_FILESELECT=6          ; Filelistbox
   MSG_ITEMSELECT=7          ; Itembox
   MSG_COMBOCHANGE=8         ; Combobox/Droplistbox
   MSG_CALENDAR=9            ; Calendar date change
   MSG_SPINNER=10            ; Spinner number change
   MSG_CLOSEVIA49=11         ; Close clicked (Enabled via DialogProcOptions 1002
   MSG_FILEBOXDOUBLECLICK=12 ; Get double-click message on a FileListBox
   MSG_ITEMBOXDOUBLECLICK=13 ; Get double-click message on an ItemBox
   MSG_COMEVENT=14           ; COMCONTROL Event notification from DialogObject (NOT DialogProcOptions)
   MSG_MENUITEM=15           ; MenuItem selected

   DPO_DISABLESTATE=1000     ; codes -1=GetSetting 0=EnableDialog 1=DisableDialog
   DPO_CHANGEBACKGROUND=1001 ; -1=Get Current otherise bitmap or color string
   DPO_CHANGESYSMENU=1002    ; -1=Get Current 0=none 1=close 2=close/min 3=close/max 4=close/min/max
   DPO_CHANGETITLE=1003      ; Set/Get Dialog Title - (-1 to get)
   DPO_GETNAME=1004          ;  Returns the name associated with a control's number.
   DPO_GETNUMBER=1005        ;  Returns the number associated with a control's name.

   ;DialogControlState Constants
   DCSTATE_SETFOCUS=1        ; Give Control Focus
   DCSTATE_QUERYSTYLE=2      ; Query control's style
   DCSTATE_ADDSTYLE=3        ; Add control style
   DCSTATE_REMOVESTYLE=4     ; Remove control style
   DCSTATE_GETFOCUS=5        ; Get control that has focus
   DCSTATE_MOVEMOUSEOVER=6   ; Move the mouse over the control

   DCSTYLE_DEFAULT=0         ; Set Default Style
   DCSTYLE_INVISIBLE=1       ; Set Control Invisible
   DCSTYLE_DISABLED=2        ; Set Control Disabled
   DCSTYLE_NOUSERDATA=4      ; Note: Setable via DialogControlState function ONLY SPINNER control only
   DCSTYLE_READONLY=8        ; Sets control to read-only (user cannot type in data) EDITBOX MULTILINEBOX SPINNER
   DCSTYLE_PASSWORD=16       ; Sets 'password mode' where only *'s are displayed EDITBOX
   DCSTYLE_DEFAULTBUTTON=32  ; Sets a button as the default button PUSHBUTTON PICTUREBUTTON
   DCSTYLE_DIGITSONLY=64     ; Set edit box to accept digits only EDITMOX MULTILINEBOX
   DCSTYLE_FLAT=128          ; Makes a 'flat' hyperlink-looking button PUSHBUTTON PICTUREBUTTON
   DCSTYLE_NOADJUST=256      ; Turns off auto-height adjustment  ITEMBOX FILELISTBOX
   DCSTYLE_TEXTCENTER=512    ; Center text in control VARYTEXT STATICTEXT
   DCSTYLE_TEXTRIGHT=1024    ; Flush-Right text in control VARYTEXT STATICTEXT
   DCSTYLE_NOSELCURLEFT=2048 ; No selection, cursor left EDITBOX MULTILINEBOX
   DCSTYLE_NOSELCURRIGHT=4096; No selection, cursor right EDITBOX MULTILINEBOX
   DCSTYLE_SHIELD=8192       ; Display Security Shield icon on button (Vista only) PUSHBUTTON PICTUREBUTTON
   DCSTYLE_MENUCHECK=32768   ; Adds a check mark to the left of a menu item MENUITEM
   DCSTYLE_MENURADIO=65536   ; Adds a radio button like dot graphic to the left of a menu item MENUITEM
   DCSTYLE_MENUSEP=131072    ; Separator bar graphic MENUITEM
   DCSTYLE_MENUBREAK=262144  ; column break MENUBAR

   ;DialogControlSet / DialogControlGet Constants
   DC_CHECKBOX=1             ; CHECKBOX
   DC_RADIOBUTTON=2          ; RADIOBUTTON
   DC_EDITBOX=3              ; EDITBOX MULTILINEBOX
   DC_TITLE=4                ; PICTURE RADIOBUTTON CHECKBOX PICTUREBUTTON VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON MENUITEM
   DC_ITEMBOXCONTENTS=5      ; ITEMBOX FILELISTBOX DROPLISTBOX
   DC_ITEMBOXSELECT=6        ; ITEMBOX FILELISTBOX DROPLISTBOX
   DC_CALENDAR=7             ; CALENDAR
   DC_SPINNER=8              ; SPINNER
   DC_MULTITABSTOPS=9        ; MULTILINEBOX
   DC_ITEMSCROLLPOS=10       ; ITEMBOX FILELISTBOX
   DC_BACKGROUNDCOLOR=11     ; RADIOBUTTON CHECKBOX VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON ITEMBOX FILELISTBOX DROPLISTBOX SPINNER EDITBOX MULTILINEBOX
   DC_PICTUREBITMAP=12       ; PICTURE PICTUREBUTTON
   DC_TEXTCOLOR=13           ; RADIOBUTTON CHECKBOX VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON ITEMBOX FIELLISTBOX DROPLISTBOX SPINNER EDITBOX MULTILINEBOX
   DC_ITEMBOXADD=14          ; ITEMBOX FILELISTBOX DROPLISTBOX
   DC_ITEMBOXREMOVE=15       ; ITEMBOX FILELISTBOX DROPLISTBOX
   DC_RADIOVALUE=16          ; RADIOBUTTON
   DC_POSITION=17            ; ALL CONTROLS (Except MENUBAR and MENUITEM)


   ;DialogObject constants
   DLGOBJECT_ADDEVENT=1      ; Call dialog callback when the specified event occurs
   DLGOBJECT_STOPEVENT=2     ; Stop calling dialog callback when an event previously requested with
   DLGOBJECT_GETOBJECT=3     ; Return an object references to the specified control
   DLGOBJECT_GETPICTURE=4    ; Create and return an object reference to a picture object

   ;Return code constants
   RET_DO_CANCEL=0           ; Cancels dialog
   RET_DO_DEFAULT= -1        ; Continue with default processing for control
   RET_DO_NOT_EXIT= -2       ; Do not exit the dialog
   Return
#EndSubRoutine
;============================================================
;============================================================
;============================================================


  #DefineFunction GetSel(DH, controlIDnumber)
    ; get the control ID number as from cWndInfo(x,1)
    EM_GETSEL = 176 ; &HB0 Gets the starting and ending character positions of the current selection
    ; Get control's window handle.
    hUser32 = DllLoad(DirWindows(1):"USER32.DLL") ; Get a handle to the user32.dll system dll.
    hWndControl = DllCall( hUser32, long:"GetDlgItem", long:DH, long:controlIDnumber )
    ;message(nControl,hWndControl)
    bufwParam =  BinaryAlloc(4)
    buflParam  = BinaryAlloc(4)
      lResult = DllCall(hUser32, long:"SendMessageA", long:hWndControl, long:EM_GETSEL, lpbinary:bufwParam, lpbinary:buflParam)
    BinaryEodSet( bufwParam, BinaryEodGet(bufwParam) )
    BinaryEodSet( buflParam, BinaryEodGet(buflParam) )
    startptr = BinaryPeek4( bufwParam, 0 )
    endptr = BinaryPeek4( buflParam, 0 )
    BinaryFree(bufwParam)
    BinaryFree(buflParam)
    DllFree(hUser32)
    Return startptr:",":endptr
    ;; EM_GETLINECOUNT
    ;EM_GETLINECOUNT = 186 ; &hBA
    ;lResult = DllCall(hUser32, long:"SendMessageA", long:hWndControl, long:EM_GETLINECOUNT, lpnull, lpnull)
  #EndFunction


  #DefineFunction GetIdByName(DH,name)
    ; given DialogHandle and ControlName,
    ; return the control ID for use with GetDlgItem
    ;
    AddExtender("wwctl44i.dll")

    ; loop to get state of all controls on the dialog
    arr = ArrDimension(1000)
    For j = 1 To 999
      x = cWndbyseq(DH,j)
      arr[j] = cWndState(x)
      If cWndinfo(x,6) == 0 Then Break ; no sibling? were done
    Next j

    invis = DialogControlState(DH,name,2,2) & 1 ; get invisibility
    ; flip the state
    If invis Then DialogControlState(DH,name,4,1) ; remove (4) invisibility (1)
    Else          DialogControlState(DH,name,3,1) ; add (3) invisibility (1)

    ; look to see which one changed
    For i = 1 To j
      x = cWndbyseq(DH,i)
      If arr[i] != cWndState(x) Then Break
    Next i
    Terminate(i>j,'GetIdByName','no state change detected')

    id = cWndinfo(x,1) ; This is the ID number we are after

    ; put the control back the way it was
    If invis Then DialogControlState(DH,name,3,1) ; add (3) invisibility (1)
    Else          DialogControlState(DH,name,4,1) ; remove (4) invisibility (1)

    Return id
  #EndFunction


#DefineSubRoutine MyDialogCallbackProc(MyDialog_Handle,MyDialog_Message,MyDialog_Name,MyDialog_EventInfo,rsvd)
    InitDialogConstants()                                   ; Initialize Dialog Constants
   ON_EQUAL = @TRUE                                         ; Initialize variable ON_EQUAL
   Switch MyDialog_Message                                  ; Switch based on Dialog Message type
      Case MSG_INIT                                         ; Standard Initialization message
         DialogProcOptions(MyDialog_Handle,MSG_TIMER,1000)
         DialogProcOptions(MyDialog_Handle,MSG_BUTTONPUSHED,@TRUE)
;         DialogProcOptions(MyDialog_Handle,MSG_EDITBOX,@TRUE)
         Return(RET_DO_DEFAULT)

     Case MyDialog_Message == MSG_TIMER
        If !IsDefined(controlID) Then controlID = GetIdByName(MyDialog_Handle,"MB1")
        DialogControlSet(MyDialog_Handle,"vt1",DC_TITLE, GetSel(MyDialog_Handle,controlID))
        Return(RET_DO_DEFAULT)

     Case MSG_BUTTONPUSHED
        Switch ON_EQUAL
           Case MyDialog_Name == "PushButton_Cancel"       ; Cancel
              Return(RET_DO_DEFAULT)

        EndSwitch                                          ; MyDialog_Name
        Return(RET_DO_DEFAULT)

;     case MSG_EDITBOX                                      ; ID "MultiLineBox_1"  ItemList
;        return(RET_DO_DEFAULT)

   EndSwitch                                                ; MyDialog_Message
   Return(RET_DO_DEFAULT)
#EndFunction                                                ; End of Dialog Callback MyDialogCallbackProc




ItemList = "Red":@TAB:"Green":@TAB:"Blue":@TAB:"Yellow":@TAB:"Cyan":@TAB:"Magenta"

MyDialogFormat=`WWWDLGED,6.2`

MyDialogCaption=`MultiLine Get Selected`
MyDialogX=241
MyDialogY=080
MyDialogWidth=242
MyDialogHeight=117
MyDialogNumControls=003
MyDialogProcedure=`MyDialogCallbackProc`
MyDialogFont=`DEFAULT`
MyDialogTextColor=`DEFAULT`
MyDialogBackground=`DEFAULT,DEFAULT`
MyDialogConfig=0

MyDialog001=`103,095,036,012,PUSHBUTTON,"PushButton_Cancel",DEFAULT,"Cancel",0,20,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog002=`021,015,138,066,MULTILINEBOX,"MB1",ItemList,DEFAULT,DEFAULT,30,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog003=`177,073,044,012,VARYTEXT,"vt1",vtVariable1,DEFAULT,DEFAULT,40,DEFAULT,DEFAULT,DEFAULT,DEFAULT`

ButtonPushed=Dialog("MyDialog")

Exit

Article ID:   W17765
Filename:   Selected Text in a MULTILINEBOX.txt
File Created: 2009:11:12:10:08:42
Last Updated: 2009:11:12:10:08:42