Tutorial de programación VS2019 / MFC: control de cuadro combinado

La última sección habló sobre el uso del control ListBox , esta sección explica principalmente el control Combo Box. Los cuadros combinados también son bastante comunes, por ejemplo, al configurar el idioma o la ubicación en el panel de control del sistema Windows, hay muchas opciones, y el control que se utiliza para hacer la selección es el control del cuadro combinado. Proporciona mucha comodidad para nuestras operaciones diarias.

Xtreme Toolkit Pro es una biblioteca de interfaz de VC galardonada y el paquete de control de interfaz más completo en el desarrollo de MFC. Proporciona 11 controles principales de Visual C ++ MFC necesarios para el desarrollo de Windows, incluidas las barras de comando, controles, Chart Pro, calendario, panel de acoplamiento, propiedad Cuadrícula, Control de informes, Barra de accesos directos, Edición de sintaxis, Marco de piel y Panel de tareas.

Haga clic para descargar la última versión de Xtreme Toolkit Pro

Introducción a los controles del cuadro combinado

El cuadro combinado es en realidad una combinación de un cuadro de edición y un cuadro de lista. Hay tres tipos: cuadro combinado simple, cuadro combinado desplegable y cuadro combinado de lista desplegable. Déjame hablar de sus diferencias.

El cuadro de lista en el cuadro combinado simple siempre se muestra y el efecto es el siguiente:

El cuadro combinado desplegable no muestra el cuadro de lista de forma predeterminada. El cuadro de lista aparecerá solo cuando haga clic en la flecha desplegable en el lado derecho del cuadro de edición. El cuadro de lista aparecerá como se muestra a continuación:

El cuadro de edición del cuadro combinado de lista desplegable no se puede editar y el usuario solo puede mostrar su texto en el cuadro de edición después de seleccionar un elemento en el cuadro de lista desplegable. El cuadro combinado de la lista desplegable es como se muestra a continuación:

Después de la introducción anterior, todos deben saber que los más utilizados son los cuadros combinados desplegables y los cuadros combinados de listas desplegables. Pueden hacer que el programa parezca más profesional y conciso en muchos casos, y hacer que sea más conveniente para los usuarios operaciones de selección.

Cuando se opera el cuadro combinado, enviará mensajes de notificación a la ventana principal. Estos mensajes de notificación y sus significados son los siguientes:

CBN_CLOSEUP: el componente del cuadro de lista del cuadro combinado está cerrado, el cuadro combinado simple no enviará el mensaje de notificación
CBN_DBLCLK: el usuario hace doble clic en un elemento de la lista, solo el cuadro combinado simple enviará el mensaje de notificación
CBN_DROPDOWN: el cuadro de lista componente del cuadro combinado desplegable, el cuadro combinado simple no enviará el mensaje de notificación
CBN_EDITUPDATE: el mensaje se envía cuando el cuadro de edición está listo para mostrar el texto modificado, el cuadro combinado de la lista desplegable no enviará el mensaje
CBN_EDITCHANGE: el contenido del cuadro de edición ha sido cambiado por el usuario, y CBN_EDITUPDATE La diferencia es que el mensaje se envía después de que se actualiza el texto que se muestra en el cuadro de edición. El cuadro combinado de lista desplegable no enviará el mensaje.
CBN_ERRSPACE: El El cuadro combinado no puede solicitar suficiente memoria para acomodar el elemento de la lista.
CBN_SELENDCANCEL: indica que la selección del usuario debe cancelarse. Cuando el usuario selecciona un elemento en el cuadro de lista y luego hace clic con el mouse fuera del control del cuadro combinado, el mensaje será enviado
CBN_SELENDOK: El usuario selecciona un elemento y luego presiona la tecla Enter o hace clic en la flecha de desplazamiento hacia abajo, El mensaje indica que el usuario ha confirmado su elección
CBN_KILLFOCUS: el cuadro combinado ha perdido el foco de entrada
CBN_SELCHANGE: el usuario ha cambiado la selección de la lista haciendo clic o moviendo las teclas de flecha
CBN_SETFOCUS: el cuadro combinado ha ganado el foco de entrada

La creación del control de cuadro combinado

MFC encapsula todas las operaciones del control de cuadro combinado en la clase CComboBox.

Cuando agregamos un cuadro combinado al cuadro de diálogo, podemos arrastrar el control Cuadro combinado a la plantilla del cuadro de diálogo, y luego agregar la variable de control de tipo CComboBox a usar, pero si queremos crearlo dinámicamente en el programa, debemos usar la función miembro de la clase CComboBox Create it. El prototipo de la función Crear es el siguiente:

virtual BOOL Create(
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID
);

Como puede ver, la función Crear miembro de la clase CComboBox es muy similar a las funciones Crear miembro de las clases de control anteriores. DwStyle especifica el estilo del control del cuadro combinado, rect es la posición y el tamaño del cuadro combinado después de la lista aparece un cuadro emergente y pParentWnd apunta a la ventana principal. El puntero no puede ser NULL, y nID especifica el ID del control del cuadro combinado. Finalmente, me enfocaré en el parámetro dwStyle. Los estilos del control de cuadro combinado incluyen lo siguiente, y se proporcionan las descripciones correspondientes:

CBS_AUTOHSCROLL: Hacer que el componente del cuadro de edición tenga un estilo de desplazamiento horizontal
CBS_DISABLENOSCROLL: Hacer que el cuadro de lista muestre una barra de desplazamiento vertical prohibida cuando no se requiere desplazamiento
CBS_DROPDOWN: Especificar un cuadro combinado desplegable
CBS_DROPDOWNLIST: Especificar un cuadro combinado de lista desplegable
CBS_HASS_HASS: Especifique un cuadro combinado de
autodibujo que contenga una cadena de caracteres CBS_LOWERCASE: todo el texto del cuadro de edición y el cuadro de lista se convierte automáticamente a caracteres en minúscula
CBS_NOINTEGRALHEIGHT: la aplicación especifica el tamaño del cuadro combinado en lugar de Windows. Por lo general, el tamaño especificado por Windows hará el elemento de la lista Algunas partes de
CBS_OEMCONVERT: hacer que el texto en el componente del cuadro de edición se pueda convertir entre el juego de caracteres ANSI y el juego de caracteres OEM. Esto es útil cuando el nombre del archivo está incluido en el cuadro de edición.
CBS_OWNERDRAWFIXED: Especifique un cuadro combinado auto-dibujado, es decir, la ventana principal es responsable de dibujar el contenido del cuadro de lista y los elementos de la lista tienen la misma altura
CBS_OWNERDRAWVARIABLE : Especifique un
cuadro combinado de
diseño propio y los elementos de la lista tengan diferentes alturas CBS_SIIMPLE: especifique un cuadro combinado simple CBS_SORT: clasifique automáticamente los elementos en el componente del cuadro de lista
CBS_UPPERCASE: convierte automáticamente todo el texto en el cuadro de edición y cuadro de lista a caracteres en mayúscula

El parámetro dwStyle puede ser una combinación de los estilos anteriores. Al igual que con otros controles, WS_CHILD, WS_VISIBLE, WS_TABSTOP y WS_VSCROLL generalmente se especifican al crearlos.

Al agregar un control de cuadro combinado directamente a la plantilla del cuadro de diálogo, las propiedades en la página de propiedades incluyen los estilos anteriores. Por ejemplo, establecer la propiedad en mayúsculas en Verdadero equivale a especificar el estilo CBS_UPPERCASE.

Las principales funciones miembro de la clase CComboBox

Debido a que el cuadro combinado está compuesto por un cuadro de edición y un cuadro de lista, existen muchas similitudes entre el funcionamiento del cuadro combinado y el funcionamiento del cuadro de edición y el cuadro de lista. De manera similar, las funciones miembro de la clase CComboBox son también las Igual que las de las clases CEdit y CListBox.Las funciones miembro tienen muchas similitudes, no solo las funciones son similares, sino que los nombres de las funciones y los parámetros también son similares. Las principales funciones de los miembros de la clase CComboBox se explican a continuación. Para obtener un contenido más detallado, consulte MSDN.

int GetCount () const;
Obtiene el número de elementos de la lista en el cuadro de lista del control del cuadro combinado.

int GetCurSel () const;
Obtiene el índice del elemento seleccionado en el cuadro de lista del control del cuadro combinado. Si no se selecciona ningún elemento, la función devuelve CB_ERR.

int SetCurSel (int nSelect);
Seleccione un elemento en el cuadro de lista del control del cuadro combinado. El parámetro nSelect especifica el índice del elemento de la lista que se seleccionará. Si es -1, la selección actual en el cuadro de lista se deselecciona y el cuadro de edición también se borra.

DWORD GetEditSel () const;
Obtiene las posiciones de carácter inicial y final del rango de selección actual en el cuadro de edición del control del cuadro combinado. Esta función devuelve un número de 32 bits, los 16 bits inferiores almacenan la posición inicial y los 16 bits superiores almacenan la posición del primer carácter no seleccionado después del rango seleccionado. Si esta función se usa en un cuadro combinado de lista desplegable, devolverá CB_ERR.

BOOL SetEditSel (int nStartChar, int nEndChar);
Se utiliza para seleccionar caracteres en el cuadro de edición del control del cuadro combinado. El parámetro nStartChar especifica la posición inicial y el parámetro nEndChar especifica la posición final.

DWORD_PTR GetItemData (int nIndex) const;
Obtiene los datos de 32 bits asociados con el elemento especificado en el cuadro combinado. El parámetro nIndex especifica el índice (a partir de 0) de un elemento en el cuadro de lista del control del cuadro combinado.

int SetItemData (int nIndex, DWORD_PTR dwItemData);
Establecer un número asociado de 32 dígitos para un elemento de lista de cuadro combinado especificado. El parámetro nIndex especifica el índice del elemento de la lista que se va a establecer. El parámetro dwItemData especifica el nuevo valor que se asociará.

void GetLBText (int nIndex, CString & rString) const;
Obtiene la cadena de un elemento del cuadro de lista del control del cuadro combinado. El parámetro nIndex especifica el índice del elemento de la lista para obtener la cadena, y el parámetro CString se utiliza para recibir la cadena obtenida.

int GetLBTextLen (int nIndex) const;
Obtiene la longitud de la cadena de un elemento en el cuadro de lista del control del cuadro combinado. El parámetro nIndex especifica el índice del elemento de la lista cuya longitud de cadena se va a obtener.

int GetTopIndex () const;
Obtiene el índice del primer elemento visible en el cuadro de lista del control del cuadro combinado.

int SetTopIndex (int nIndex);
Establece un elemento especificado en el cuadro de lista del control del cuadro combinado para que sea visible. El parámetro nIndex especifica el índice del elemento de la lista. Esta función devuelve 0 si tiene éxito y devuelve CB_ERR si se produce un error.

BOOL LimitText (int nMaxChars);
Se usa para limitar la longitud máxima de bytes que el usuario puede ingresar en el cuadro de edición del control del cuadro combinado. El parámetro nMaxChars especifica la longitud máxima en bytes del texto que el usuario puede ingresar. Si es 0, la longitud está limitada a 65535 bytes.

int AddString (LPCTSTR lpszString);
Agregue un nuevo elemento de lista al cuadro de lista en el control del cuadro combinado. El parámetro lpszString es un puntero a la cadena que se agregará. Si el valor de retorno de esta función es mayor o igual a 0, entonces es el índice del nuevo elemento de la lista. Si ocurre un error, devolverá CB_ERR. Si no hay suficiente memoria para almacenar la nueva cadena, devuelve CB_ERRSPACE.

int DeleteString (UINT nIndex);
Elimina un elemento de la lista en una posición especificada en el cuadro combinado. El parámetro nIndex especifica el índice del elemento de la lista que se eliminará. Si el valor de retorno de esta función es mayor o igual a 0, entonces es el número de elementos de lista restantes en el cuadro combinado. Si el índice especificado por nIndex excede el número de elementos de la lista, se devuelve CB_ERR.

int FindString (int nStartAfter, LPCTSTR lpszString) const;
Busque pero no seleccione el primer elemento de la lista que contiene el prefijo especificado en el cuadro de lista del control del cuadro combinado. El parámetro nStartAfter especifica el índice del elemento de la lista antes del primer elemento de la lista que se encuentra. lpszString apunta a la cadena que contiene el prefijo que se va a buscar. Si el valor de retorno de esta función es mayor o igual a 0, entonces es el índice del elemento de lista coincidente.Si la búsqueda falla, devuelve CB_ERR.

int InsertString (int nIndex, LPCTSTR lpszString);
Inserta un elemento de lista en el cuadro de lista del control del cuadro combinado. El parámetro nIndex especifica la posición para insertar el elemento de la lista y el parámetro lpszString especifica la cadena que se insertará. Esta función devuelve la posición donde se insertó la cadena. Si ocurre un error, devolverá CB_ERR. Si no hay suficiente memoria para almacenar la nueva cadena, devolverá CB_ERRSPACE.

int SelectString (int nStartAfter, LPCTSTR lpszString);
Busque una cadena en el cuadro de lista del control del cuadro combinado, si la encuentra, selecciónela y muéstrela en el cuadro de edición. Los parámetros son los mismos que FindString. Si se encuentra la cadena, devuelve el índice de este elemento de la lista, si la búsqueda falla, devuelve CB_ERR y la selección actual no cambia.

Además, la clase CComboBox también hereda las funciones miembro GetWindowText, SetWindowText, etc. de la clase CWnd.

Ejemplo de aplicación de la clase CComboBox

Finalmente, escribiré un ejemplo simple para ilustrar el uso de varias funciones miembro y mensajes de notificación de CComboBox. La función realizada por este ejemplo: se incluye una lista de sitios web en el cuadro combinado, y cuando se cambia el elemento de lista seleccionado en el cuadro de lista del control del cuadro combinado, el texto del elemento de lista recién seleccionado se muestra en el cuadro de edición. Los siguientes son los pasos de implementación específicos:

1. Cree un proyecto MFC basado en cuadros de diálogo y establezca el nombre en "Example25".

2. En la plantilla de diálogo generada automáticamente IDD_EXAMPLE25_DIALOG, borre el control de texto estático "TODO: Colocar controles de diálogo aquí", el botón "Aceptar" y el botón "Cancelar". Agregue un control de cuadro combinado, el ID se establece en IDC_WEB_COMBO, la propiedad Tipo se establece en Lista desplegable, es un cuadro combinado de lista desplegable, el cuadro de edición no permite la entrada del usuario y la propiedad Ordenar se establece en Falso para cancelar la pantalla de clasificación. Agregue un control de texto estático y un cuadro de edición. La propiedad Título del control de texto estático se establece en "Sitio web de su elección:", el ID del cuadro de edición se establece en IDC_SEL_WEB_EDIT y la propiedad Solo lectura se establece en Verdadero. La plantilla del cuadro de diálogo en este momento es la siguiente:

3. Agregue la variable de control de tipo CComboBox m_comboWeb al cuadro combinado IDC_WEB_COMBO.

4. Cuando se inicializa el diálogo, agregamos el nombre del sitio al cuadro combinado y seleccionamos el primer elemento por defecto, luego necesitamos modificar la función CExample25Dlg :: OnInitDialog () de la siguiente manera:

Código C ++

BOOL CExample25Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog.  The framework does this automatically
//  when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE);         // Set big icon
SetIcon(m_hIcon, FALSE);        // Set small icon
// TODO: Add extra initialization here
// 为组合框控件的列表框添加列表项“鸡啄米”
m_comboWeb.AddString(_T("鸡啄米"));
// 为组合框控件的列表框添加列表项“百度”
m_comboWeb.AddString(_T("百度"));
// 在组合框控件的列表框中索引为1的位置插入列表项“新浪”
m_comboWeb.InsertString(1, _T("新浪"));
// 默认选择第一项
m_comboWeb.SetCurSel(0);
// 编辑框中默认显示第一项的文字“鸡啄米”
SetDlgItemText(IDC_SEL_WEB_EDIT, _T("鸡啄米"));
return TRUE;  // return TRUE  unless you set the focus to a control
}

5. Esperamos que cuando el elemento de lista seleccionado en el cuadro combinado cambie, el último elemento seleccionado se muestre en el cuadro de edición en tiempo real, luego se utilizará el mensaje de notificación CBN_SELCHANGE. Agregue la función de procesamiento de mensajes CExample25Dlg :: OnCbnSelchangeWebCombo () al mensaje de notificación CBN_SELCHANGE del cuadro de lista IDC_WEB_COMBO y modifíquelo de la siguiente manera:

Código C ++

void CExample25Dlg::OnCbnSelchangeWebCombo()
{
// TODO: Add your control notification handler code here
CString strWeb;
int nSel;
// 获取组合框控件的列表框中选中项的索引
nSel = m_comboWeb.GetCurSel();
// 根据选中项索引获取该项字符串
m_comboWeb.GetLBText(nSel, strWeb);
// 将组合框中选中的字符串显示到IDC_SEL_WEB_EDIT编辑框中
SetDlgItemText(IDC_SEL_WEB_EDIT, strWeb);
}

6. Ejecute el programa y aparecerá un cuadro de diálogo de resultados.Cuando cambie la selección en el cuadro combinado del cuadro de diálogo, la visualización en el cuadro de edición cambiará en consecuencia. Las representaciones son las siguientes:

Introducción a la programación de VS2010 / MFC 25 (Controles de uso común: Control de cuadro combinado)

Eso es todo por el contenido del cuadro combinado. En comparación con la gran cantidad de funciones miembro de la clase CComboBox, los ejemplos de esta sección solo usan unas pocas.Puede probar otras funciones miembro basadas en lo anterior.

Dirección de reimpresión de este artículo, por favor indique: Ji Zhuomi

Supongo que te gusta

Origin blog.csdn.net/qq_42444778/article/details/115198640
Recomendado
Clasificación