Jump to content

A strange problem in combo box.


kcvinu
 Share

Recommended Posts

Hi all,

I am playing with a combo box. The code from help file is working. But the code i wrote is not working. Help file uses "_GUICtrlComboBox_Create" for creating combo box. But i used native "GUICtrlCreateCombo". Then i replaced my native combo creation function with the UDF. Then my code worked. I think the hi word and low word parameters are the problem. 

Here is my code.

#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Local $sCMB_Items = "Apple|Orange|Mango|Banana|Grape"
#Region ### START Koda GUI section ### Form=
Global $hForm1 = GUICreate("Form1", 283, 188, 312, 166)
Global $hCombo1 = GUICtrlCreateCombo("", 40, 48, 185, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
GUICtrlSetData($hCombo1, $sCMB_Items)
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit

    EndSwitch
WEnd

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg
    Local $hWndFrom, $iIDFrom, $iCode
    $hWndFrom = $lParam
    $iIDFrom = BitAND($wParam, 0xFFFF) ; Low Word
    $iCode = BitShift($wParam, 16) ; Hi Word
    Switch $hWndFrom
        Case $hCombo1
            Switch $iCode
                Case $CBN_DBLCLK
                    ; Insert your code here
                    MsgBox(0,"","$CBN_DBLCLK")
                Case $CBN_DROPDOWN
                    ; Insert your code here
                    MsgBox(0,"","$CBN_DROPDOWN")
                Case $CBN_EDITCHANGE
                    ; Insert your code here
                    MsgBox(0,"","$CBN_EDITCHANGE")
                Case $CBN_SELCHANGE
                    ; Insert your code here
                    MsgBox(0,"","$CBN_SELCHANGE")

            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

And this is the code from help file. Slightly modified. But working

#include <GuiComboBox.au3>
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <WindowsConstants.au3>

Global $g_hCombo

Example()

Func Example()
    Local $hGUI

    ; Create GUI
    $hGUI = GUICreate("(UDF) ComboBox Create", 400, 296)
    $g_hCombo = _GUICtrlComboBox_Create($hGUI, "", 2, 2, 396, 296)
    GUISetState(@SW_SHOW)

    ; Add files
    _GUICtrlComboBox_BeginUpdate($g_hCombo)
    _GUICtrlComboBox_AddDir($g_hCombo, "", $DDL_DRIVES, False)
    _GUICtrlComboBox_EndUpdate($g_hCombo)

    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

    ; Loop until the user exits.
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete()
EndFunc   ;==>Example

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg
    Local $hWndFrom, $iIDFrom, $iCode
    $hWndFrom = $lParam
    $iIDFrom = BitAND($wParam, 0xFFFF) ; Low Word
    $iCode = BitShift($wParam, 16) ; Hi Word
    Switch $hWndFrom
        Case $g_hCombo
            Switch $iCode
                Case $CBN_CLOSEUP ; Sent when the list box of a combo box has been closed
                    MsgBox(0,"","$CBN_CLOSEUP")
                Case $CBN_DBLCLK ; Sent when the user double-clicks a string in the list box of a combo box
                    MsgBox(0,"","$CBN_DBLCLK")
                Case $CBN_DROPDOWN ; Sent when the list box of a combo box is about to be made visible
                    MsgBox(0,"","$CBN_DROPDOWN")
                Case $CBN_EDITCHANGE ; Sent after the user has taken an action that may have altered the text in the edit control portion of a combo box
                    MsgBox(0,"","$CBN_EDITCHANGE")
                Case $CBN_EDITUPDATE ; Sent when the edit control portion of a combo box is about to display altered text

                Case $CBN_ERRSPACE ; Sent when a combo box cannot allocate enough memory to meet a specific request

                Case $CBN_KILLFOCUS ; Sent when a combo box loses the keyboard focus

                Case $CBN_SELCHANGE ; Sent when the user changes the current selection in the list box of a combo box
                    MsgBox(0,"","$CBN_SELCHANGE")

            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

For those who wants the au3 file;

Here it is

 

Code From help file.au3

My code.au3

Spoiler

My Contributions

Glance GUI Library - A gui library based on Windows api functions. Written in Nim programming language.

UDF Link Viewer   --- A tool to visit the links of some most important UDFs 

 Includer_2  ----- A tool to type the #include statement automatically 

 Digits To Date  ----- date from 3 integer values

PrintList ----- prints arrays into console for testing.

 Alert  ------ An alternative for MsgBox 

 MousePosition ------- A simple tooltip display of mouse position

GRM Helper -------- A littile tool to help writing code with GUIRegisterMsg function

Access_UDF  -------- An UDF for working with access database files. (.*accdb only)

 

Link to comment
Share on other sites

  • Moderators

kcvinu,

When you create a control using a native GUICtrlCreate* function, the return value is a ControlID - an integer value. AutoIt uses this ControlID to identify the control - it is in fact the index of the internal array that AutoIt uses to track native control. When you create a control using a UDF, the return is a handle -  a special unique value used by Windows to track virtually everything in the system.

In your first script above you are using the native command - so the $hCombo1 variable holds a ControlID (and should really be named $idCombo1 or $cCombo1). However, in the message handler you are looking for the handle:

$hWndFrom = $lParam

$iIDFrom = BitAND($wParam, 0xFFFF) ; Low Word
$iCode = BitShift($wParam, 16) ; Hi Word
Switch $hWndFrom

    Case $hCombo1

If you replace $hWndFrom with $iIDFrom, you will find that the code works as expected - because you are now checking the ControlID and not the handle. In the second script, you create the combo via the UDF and so get a handle returned - unsurprisingly this works as you are this time checking the handle directly. All clear?

And as always I would counsel against using blocking functions (such as MsgBox) inside a message handle you do in both scripts - the Help file specifically mentions this and it is a warning that should be heeded.

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

@Melba23 Yes. everything is now clear. Thank you for detailed replay. And that MsgBoxes. That is only for testing purpose. I can use console write instead. Once again thanks a lot. :)

Spoiler

My Contributions

Glance GUI Library - A gui library based on Windows api functions. Written in Nim programming language.

UDF Link Viewer   --- A tool to visit the links of some most important UDFs 

 Includer_2  ----- A tool to type the #include statement automatically 

 Digits To Date  ----- date from 3 integer values

PrintList ----- prints arrays into console for testing.

 Alert  ------ An alternative for MsgBox 

 MousePosition ------- A simple tooltip display of mouse position

GRM Helper -------- A littile tool to help writing code with GUIRegisterMsg function

Access_UDF  -------- An UDF for working with access database files. (.*accdb only)

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...