News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

ComboBox problem

Started by RuiLoureiro, October 22, 2010, 06:30:18 PM

Previous topic - Next topic

RuiLoureiro

Hi,
     How do i type something in a combobox
     and how do i exit with Return ?
     The comboBox is in a dialog box not in the main window

     I am using something like this:
     (The return doesnt work !)
     
Quote
             SWITCH  uMsg
             CASE    WM_INITDIALOG

                COMBOBOX   144, 146, 160, 160, 100h
                SETUPCOMBO _TblString

                ;Get ComboBox's Edit Control handle
                invoke ChildWindowFromPoint, _hComboBox,10,10
                mov    _hComboEdit, eax
                ;Subclass the ComboBox's Edit Control
                invoke SetWindowLong,_hComboEdit, GWL_WNDPROC, addr NewEditProc
                mov    _OldEditProc, eax

            and

Quote
NewEditProc     proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
.if uMsg == WM_CHAR
   mov eax,wParam
   .if (al >= 20h && al <= 'z') || al == VK_BACK
      invoke CallWindowProc,_OldEditProc,hWin,uMsg,wParam,lParam
      ret
   .elseif al == VK_RETURN
   
      invoke  MessageBeep, MB_ICONHAND                                 
      invoke MessageBox,_hWnd,addr szAboutText,addr szProgramName,MB_OK
      ret
   .else
      ret
   .endif
.else
   invoke CallWindowProc, _OldEditProc,hWin,uMsg,wParam,lParam
   ret
.endif
NewEditProc     endp

Thanks
RuiLoureiro

Coma

Hi,
my girlfriend is waiting, so very short.

This could work:

1. Use ComboBoxEx not ComboBox (shellcc.chm is the old help reference)
2. Response to CBEN_BEGINEDIT and CBEN_ENDEDIT notification message (via WM_Notify).

good luck
Coma Homepage 20:00-23:00 GMT+2 --- http://ge2001.dyndns.org:44792

ragdog

sorry wrong post please delete
greets,

jj2007

Rui,
What happens if you use WM_KEYDOWN or WM_KEYUP instead of the WM_CHAR message?



RuiLoureiro

jj,
      Return doesnt work too.
      See Combo6.zip

Coma,     
      How do you create a ComboBoxEx ?
      WC_COMBOBOXEX ? whats the value ? It isnot defined

Coma

CN_ComboBoxEx           db "ComboBoxEx32",0
Coma Homepage 20:00-23:00 GMT+2 --- http://ge2001.dyndns.org:44792

RuiLoureiro

Coma,
        Thanks !
        How to setup the strings ?
        (you can see this in Combo7.zip=.asm+.inc+.exe)

I have this:
Quote
_String1        db "Item 1",0
_String2        db "Item 2",0
_String3        db "Item 3",0
_String4        db "Item 4",0
_String5        db "Item five",0
_String6        db "Item six",0
_String7        db "Item seven",0

                dd 7
_TblString      dd offset _String1
                dd offset _String2
                dd offset _String3
                dd offset _String4
                dd offset _String5
                dd offset _String6
                dd offset _String7
and

_cbex        COMBOBOXEXITEM <?>
_nm          NMHDR <?>

To create the combobox i am using this . It works

Quote
COMBO_STYLE equ WS_CHILD+WS_BORDER+WS_VISIBLE+WS_TABSTOP+WS_VSCROLL+CBS_HASSTRINGS+CBS_DROPDOWN

COMBOBOX    macro x, y, dx, dy, ID
            invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr CN_ComboBoxEx, NULL, COMBO_STYLE,
                                   x,y,dx,dy, hWnd, ID, _hInstance, NULL
            mov    _hComboBox, eax
ENDM


To setup the strings, i think i need to use something like this.
    But it doesnt work

Quote
SETUPCOMBO      macro   Tbl
                push    esi
                mov     esi, offset Tbl
                mov     ecx, dword ptr [esi - 4]
                xor     ebx, ebx
@@:             push    ecx

                mov     eax, CBEIF_TEXT
                ;mov     _cbex.mask, eax         ;CBEIF_TEXT   doesnt work !!!!!!!
                mov     _cbex.iItem, ebx
                mov     eax, [esi + ebx*4]
                mov     _cbex.pszText, eax

                invoke  SendMessage, _hComboBox, CBEM_INSERTITEM, 0, addr _cbex
                pop     ecx
                add     ebx, 1
                sub     ecx, 1
                jnz     short @B
               
                ;invoke SendMessage, _hComboBox, CB_SETCURSEL, 0 ,0
                mov    _hComboItem, 0
                pop     esi
ENDM

Coma

cbei            COMBOBOXEXITEM <>


invoke  CreateWindowEx,0,ADDR CN_ComboBoxEx,0,WS_CHILD+WS_VISIBLE+WS_CLIPSIBLINGS+WS_VSCROLL+CBS_DROPDOWNLIST+CBS_HASSTRINGS+CBS_AUTOHSCROLL+CBS_NOINTEGRALHEIGHT,20,40,216,700,hWndSTObject,910,wc.hInstance,0
mov     hWndCBObject,eax
invoke  SendMessage,hWndCBObject,WM_SETFONT,hFntDefGui,1
mov     cbei._mask,CBEIF_TEXT
mov     cbei.iItem,-1 ; add to end of list ?
mov     cbei.pszText,OFFSET szText
mov     cbei.cchTextMax,0
mov     cbei.iImage,0
mov     cbei.iSelectedImage,0
mov     cbei.iOverlay,0
mov     cbei.iIndent,0
mov     cbei.lParam,0
invoke  SendMessage,hWndCBObject,CBEM_INSERTITEM,0,ADDR cbei


http://msdn.microsoft.com/en-us/library/bb775740%28v=VS.85%29.aspx
Coma Homepage 20:00-23:00 GMT+2 --- http://ge2001.dyndns.org:44792

RuiLoureiro

Coma,
               Thanks !
                It doesnt WORK. Why ???

I am getting the following Error:

Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

Assembling: C:\MASM32\RCLListCombo1\Combo7.asm
C:\MASM32\RCLListCombo1\Combo7.asm(146) : error A2081: missing operand after una
ry operator
_
Assembly Error
Prima qualquer tecla para continuar . . .

Line 146 is this:
                mov     eax, CBEIF_TEXT
             mov     _cbex.mask, eax         ;CBEIF_TEXT  <<<--- Line 146

Anyone can explain why this ?


The procedure is this:
Quote
SetComboBox     proc    Tbl:DWORD
                push    esi
               
                mov     esi, Tbl
                mov     ecx, dword ptr [esi - 4]
                xor     ebx, ebx
@@:             push    ecx
               
                mov     eax, CBEIF_TEXT
                mov     _cbex.mask, eax         ;CBEIF_TEXT
                mov     _cbex.iItem, ebx
                mov     eax, [esi + ebx*4]
                mov     _cbex.pszText, eax

                invoke  SendMessage, _hComboBox, CBEM_INSERTITEM, 0, addr _cbex
                pop     ecx
                add     ebx, 1
                sub     ecx, 1
                jnz     short @B
               
                ;invoke SendMessage, _hComboBox, CB_SETCURSEL, 0 ,0
                mov    _hComboItem, 0
                pop     esi
                ret

RuiLoureiro

Ok, it is not
              mask   but    _mask

But it doesnt insert any item !
Simply, it doesnt work (See Combo8.zip)

Coma

I don't check your code ... (maybe it is a macro error)

This works:

.586
.MMX
.Model Flat, StdCall
option casemap:none

include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\gdi32.inc
include \masm32\include\comctl32.inc
include \masm32\include\comdlg32.inc
include \masm32\include\shell32.inc
;---
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\comctl32.lib
includelib \masm32\lib\comdlg32.lib
includelib \masm32\lib\shell32.lib
;---
include \masm32\include\windows.inc

; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.const
align 8
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
WP_CallBack             equ [ebp+04]                    ; return address
WP_hWnd                 equ [ebp+08]                    ; handle window for msg
WP_uMsg                 equ [ebp+12]                    ; message number
WP_wParam               equ [ebp+16]                    ; extra message info
WP_lParam               equ [ebp+20]                    ; extra message info

; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.data?
align 8
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
wc                          WNDCLASSEX <>                   ; Structures
msg                         MSG <>
icc                         INITCOMMONCONTROLSEX <>
ps                          PAINTSTRUCT <>
cbei                        COMBOBOXEXITEM <>
;---
ReturnEAX                   dd ?
;---
hInstance                   dd ?
hFntDefGui                  dd ?
hWndCBEx                    dd ?

; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.data
align 8
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_MaxTblString               dd 7
_TblString                  dd OFFSET szString1
                            dd OFFSET szString2
                            dd OFFSET szString3
                            dd OFFSET szString4
                            dd OFFSET szString5
                            dd OFFSET szString6
                            dd OFFSET szString7
;---
szCN                        db "4i28567676",0
szWN                        db "ComboBoxEx",0
CN_ComboBoxEx               db "ComboBoxEx32",0
;---
szString1                   db "Item 1",0
szString2                   db "Item 2",0
szString3                   db "Item 3",0
szString4                   db "Item 4",0
szString5                   db "Item five",0
szString6                   db "Item six",0
szString7                   db "Item seven",0

; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.code
align 8
Main:
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
invoke  GetModuleHandle,0
mov     wc.hInstance,eax
mov     hInstance,eax
;---
mov     icc.dwSize,sizeof INITCOMMONCONTROLSEX
mov     icc.dwICC,ICC_STANDARD_CLASSES or ICC_WIN95_CLASSES
invoke  InitCommonControlsEx,ADDR icc
;---
mov     wc.hIconSm,0
mov     wc.hIcon,0
invoke  LoadCursor,0,IDC_ARROW
mov     wc.hCursor,eax
mov     wc.hbrBackground,COLOR_BTNFACE+1
mov     wc.cbSize,sizeof WNDCLASSEX
mov     wc.style,CS_HREDRAW or CS_VREDRAW
mov     wc.lpfnWndProc,OFFSET WP
mov     wc.cbClsExtra,0
mov     wc.cbWndExtra,0
mov     wc.lpszMenuName,0
mov     wc.lpszClassName,OFFSET szCN
invoke  RegisterClassEx,ADDR wc
;---
invoke  CreateWindowEx,0,ADDR szCN,ADDR szWN,WS_OVERLAPPED or WS_CAPTION or WS_CLIPCHILDREN or WS_SYSMENU or WS_MINIMIZEBOX,128,128,480,320,0,0,wc.hInstance,0
mov     msg.hwnd,eax
invoke  ShowWindow,msg.hwnd,SW_SHOWNORMAL
invoke  UpdateWindow,msg.hwnd



; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MessageLoop:
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
invoke  GetMessage,ADDR msg,0,0,0
cmp     eax,0h
je      TerminateProgram
invoke  TranslateMessage,ADDR msg
invoke  DispatchMessage,ADDR msg
jmp     MessageLoop
; -------------------------------------------------------------------------
TerminateProgram:
invoke  ExitProcess,wc.hInstance
mov     eax,msg.wParam
ret



; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
WP:
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
push    ebp
mov     ebp,esp
pushad
mov     eax,WP_uMsg
; -------------------------------------------------------------------------
WP_WM_CREATE:
cmp     eax,WM_CREATE
jne     WP_WM_DESTROY
; -------------------------------------------------------------------------
invoke  GetStockObject,DEFAULT_GUI_FONT
mov     hFntDefGui,eax
;---
invoke  CreateWindowEx,0,ADDR CN_ComboBoxEx,0,WS_CHILD or WS_VISIBLE or WS_VSCROLL or CBS_DROPDOWNLIST or CBS_AUTOHSCROLL or CBS_NOINTEGRALHEIGHT,15,38,320,240,WP_hWnd,1000,wc.hInstance,0
mov     hWndCBEx,eax
invoke  SendMessage,hWndCBEx,WM_SETFONT,hFntDefGui,1

mov     cbei._mask,CBEIF_TEXT
mov     cbei.iItem,-1
mov     ebx,0
mov     esi,OFFSET _TblString
CBExLoop:
mov     eax,[esi]
mov     cbei.pszText,eax
invoke  SendMessage,hWndCBEx,CBEM_INSERTITEM,0,ADDR cbei
add     esi,4
inc     ebx
cmp     ebx,_MaxTblString
jne     CBExLoop


invoke SendMessage,hWndCBEx,CB_SETCURSEL,0,0
;---
jmp     WP_Return

; -------------------------------------------------------------------------
WP_WM_DESTROY:
cmp     eax,WM_DESTROY
jne     WP_WM_PAINT
; -------------------------------------------------------------------------
invoke  PostQuitMessage,0
popad
xor     eax,eax
mov     esp,ebp
pop     ebp
ret     10h

; -------------------------------------------------------------------------
WP_WM_PAINT:
cmp     eax,WM_PAINT
jne     WP_WM_NOTIFY
; -------------------------------------------------------------------------

jmp     WP_Return

; -------------------------------------------------------------------------
WP_WM_NOTIFY:
cmp     eax,WM_NOTIFY
jne     WP_WM_DISPLAYCHANGE
; -------------------------------------------------------------------------
mov     ebx,WP_lParam
mov     eax,[ebx+0]
cmp     eax,hWndCBEx
jne     WP_Return
;---

;---
jmp     WP_Return

; -------------------------------------------------------------------------
WP_WM_DISPLAYCHANGE:
cmp     eax,WM_DISPLAYCHANGE
jne     WP_WM_COMMAND
; -------------------------------------------------------------------------
invoke  InvalidateRect,WP_hWnd,0,0
jmp     WP_Return

; -------------------------------------------------------------------------
WP_WM_COMMAND:
cmp     eax,WM_COMMAND
jne     WP_WM_POWERBROADCAST
mov     eax,WP_wParam                           ; control or menu ID in ax
; -------------------------------------------------------------------------

jmp     WP_Return

; -------------------------------------------------------------------------
WP_WM_POWERBROADCAST:
cmp     eax,WM_POWERBROADCAST
jne     WP_Return
; -------------------------------------------------------------------------
mov     eax,WP_wParam
cmp     eax,PBT_APMRESUMESUSPEND
jne     WP_Return
mov     eax,WP_lParam
cmp     eax,PBTF_APMRESUMEFROMFAILURE
je      WP_Return
invoke  RedrawWindow,WP_hWnd,0,0,RDW_ERASE or RDW_INVALIDATE or RDW_UPDATENOW
jmp     WP_Return

; -------------------------------------------------------------------------
WP_Return:
; -------------------------------------------------------------------------
popad
invoke  DefWindowProc,WP_hWnd,WP_uMsg,WP_wParam,WP_lParam
mov     esp,ebp                                 ; delete stack frame
pop     ebp
ret     10h                                     ; return and clear stack
; -------------------------------------------------------------------------
WP_Return0:
; -------------------------------------------------------------------------
popad
mov     eax,0
mov     esp,ebp                                 ; delete stack frame
pop     ebp
ret     10h                                     ; return and clear stack
; -------------------------------------------------------------------------
WP_Return1:
; -------------------------------------------------------------------------
popad
mov     eax,1
mov     esp,ebp                                 ; delete stack frame
pop     ebp
ret     10h                                     ; return and clear stack
; -------------------------------------------------------------------------
WP_ReturnEAX:
; -------------------------------------------------------------------------
popad
mov     eax,ReturnEAX
mov     esp,ebp                                 ; delete stack frame
pop     ebp
ret     10h                                     ; return and clear stack

; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
end Main
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Coma Homepage 20:00-23:00 GMT+2 --- http://ge2001.dyndns.org:44792

RuiLoureiro

Coma,
             For now, many thanks for help me
             for your example, ...  :wink
             I go to test it
RuiLoureiro

RuiLoureiro

Coma,
           Thanks for your help
           It works corretly. The problem was in the window style
           
           But i wanted to type another item and insert it
           but in this case (in your example) i cannot type
           Is it impossible? I dont want to edit an item but
           write another to the list. If i have 7 i want to have 8

Thanks
RuiLoureiro

Coma

#13
Ok, nothing is impossible ...

1. Change the style of the ComboBoxEx to CBS_DROPDOWN
2. Add this code to the WM_NOTIFY section:


; -------------------------------------------------------------------------
WP_WM_NOTIFY:
cmp     eax,WM_NOTIFY
jne     WP_WM_DISPLAYCHANGE
; -------------------------------------------------------------------------
mov     ebx,WP_lParam
mov     eax,[ebx+0]
cmp     eax,hWndCBEx
jne     WP_Return
;---
CBExBeginEdit:
mov     eax,[ebx+8]
cmp     eax,CBEN_BEGINEDIT
jne     CBExEndEdit
jmp     WP_Return0                              ; return 0 to allow edit
;---
CBExEndEdit:
cmp     eax,CBEN_ENDEDIT                        ; NMCBEENDEDIT structure !
jne     WP_Return
mov     eax,0                                   ;
cmp     [ebx+12],eax                            ; fChanged, 0=not changed, corrected !
je      WP_Return1                              ; return 1 to abort edit
mov     eax,CBENF_RETURN                        ; if <Return> insert new item
cmp     [ebx+20+CBEMAXSTRLEN],eax
jne     WP_Return1
add     ebx,20
mov     cbei.pszText,ebx                        ; pointer to new item text
mov     cbei._mask,CBEIF_TEXT                   ; insert new item
mov     cbei.iItem,-1                           ; at end of list
invoke  SendMessage,hWndCBEx,CBEM_INSERTITEM,0,ADDR cbei
jmp     WP_Return0                              ; return 0 to allow edit


Source and exe attached (corrected).

Coma
Coma Homepage 20:00-23:00 GMT+2 --- http://ge2001.dyndns.org:44792

RuiLoureiro

Coma,
        Thanks for all !
        I think i understood
       
Quote
        Ok, nothing is impossible ...
Hummmm, it seems to be ... impossible, Coma

        If the code is used in main window, the RETURN works, all is ok
        If it is used in a dialog box, the return doesnt work

        i attached rsrc.rc and Combo11.zip (.inc+.asm+.exe)
        The combobox in the main window works correctly

        In Menu, Open ComboBox-> Open Dialog and try to do the same
        (ok, it seems i am doing something wrong ?)
        I hope i am doing something wrong !

This is the proc:
Quote
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
align 16
DialogWnd        proc    hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD

             SWITCH  uMsg
             CASE    WM_INITDIALOG

                COMA
               
                invoke   SetDlgItemText, hWnd, IDC_NEWDIS1, addr _Heading1
                invoke   GetDlgItem, hWnd, IDC_NEWDIS1
          invoke   SetFocus, eax

                mov     eax, TRUE
             ret
               
             CASE    WM_CLOSE
               
_Quit:          invoke   EndDialog, hWnd, 0

                mov     eax, TRUE
             ret
;.............................................................
             CASE    WM_NOTIFY

                mov     ebx, lParam             ;WP_lParam
                mov     eax, [ebx+0]
                cmp     eax, hWndCBEx
                jne     _exit
;---
CBExBeginEdit: 
                mov     eax, [ebx+8]
                cmp     eax, CBEN_BEGINEDIT
                jne     CBExEndEdit
                jmp     WP_Return0              ; return 0 to allow edit
;---
CBExEndEdit:
                cmp     eax,CBEN_ENDEDIT        ; NMCBEENDEDIT structure !
                ;jne     WP_Return               ; be sure to understand that !

                ;jne     _exit                  ; <--- doesnt work ###############
                ;jne     WP_Return1             ; <--- doesnt work
                jne     WP_Return0              ; <--- doesnt work  ##############
               
                mov     eax,0                                   ;
                cmp     [ebx+12],eax                            ; fChanged, 1=changed
                je      WP_Return1                              ; return 1 to abort edit
               
                mov     eax, CBENF_RETURN                       ; if <Return> insert new item
                cmp     [ebx+20+CBEMAXSTRLEN], eax
                jne     WP_Return1

    ;##################################
    invoke  MessageBeep, MB_ICONHAND
    ;##################################
               
                add     ebx, 20
                mov     cbei.pszText,ebx                         ; pointer to new item text
                mov     cbei._mask, CBEIF_TEXT                   ; insert new item
                mov     cbei.iItem,-1                            ; at end of list
                invoke  SendMessage,hWndCBEx, CBEM_INSERTITEM, 0, ADDR cbei
                jmp     WP_Return0                               ; return 0 to allow edit

WP_Return0:     mov     eax, 0
                ret

WP_Return1:     mov     eax, 1
                ret               
;.............................................................
             CASE    WM_COMMAND

;------------------ComboBox--------------------------
                mov     edx, wParam
                shr     edx, 16
                switch  edx
                    ;case    CBN_SELENDOK
                        ;invoke  MessageBeep, MB_ICONHAND
                        ;invoke  MessageBeep, MB_ICONASTERISK               

                    case    CBN_SELCHANGE

                        invoke SendMessage, _hComboBox, CB_GETCURSEL, 0 ,0
                        cmp    eax, CB_ERR
                        je     short @F

                        mov    _hComboItem, eax
                        invoke  MessageBeep, MB_ICONASTERISK                       
@@:
                endsw
;------------------ComboBox-FIM-------------------------
                switch  wParam
                    case    IDC_CANCELA
                   
                        mov     _CaseChoose, 0
                        jmp     _Quit
                                       
                    case    IDC_ALTERA
                                                                           
                        mov     _CaseChoose, 1
                        jmp     _Quit

                    case    IDC_DELETE             

                        mov     _CaseChoose, 2
                        jmp     _Quit
;.......................................................
                endsw
             ENDSW

_exit:          mov     eax, FALSE
          ret
DialogWnd       endp