[C con Clase] Obtener el ID de un botón creado fuera del WinMain
Steven Davidson
srd4121 en njit.edu
Jue Sep 18 05:57:47 CEST 2008
Hola Daniel,
Roberto Daniel Virgili wrote:
> Hola a todos
> La cuestión es la siguiente, gracias a Steven tengo como crear los
> controles en un archivo aparte al del WinMain, pero ete aquí que me
> surge la siguiente duda, en el código que dejo a continuación, como
> hago para obtener el ID del botón..?
>
Ten presente que el ID de una ventana hija es indicado en el parámetro
del menú en la función 'CreateWindowEx()'. Como las ventanas hijas no
pueden tener un menú, se usa este parámetro para el número de
identificación.
> controles.h
> ---------------------
> #include <windows.h>
> HWND * CrearControles( HWND lista[], int nCant, HWND hWnd, HINSTANCE hInst );
> ---------------------
> controles.cpp
> ---------------------
> #include <windows.h>
> #include "controles.h"
>
> HWND * CrearControles( HWND lista[], int nCant, HWND hwnd, HINSTANCE hInst )
> {
> lista[1] = CreateWindowEx( 0L, "BUTTON", "&Salir",
> BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,
> 410,220,70,40,hwnd,(HMENU)NULL,NULL,NULL);
> lista[2] = CreateWindowEx( 0L, "BUTTON", "&Editar",
> BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,
> 320,220,70,40,hwnd,(HMENU)NULL,NULL,NULL);
Ten presente que en esta funcidn, los dos botones tienen el mismo ID:
'NULL' que seguramente es 0 (cero). Por lo tanto, no te va a servir
conocer sus ID's o no, ya que no podrías distinguir un botón del otro.
> }
> ---------------------
> botonesFm.cpp
> ---------------------
> LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT mensaje, WPARAM wParam, LPARAM lParam)
> {
> switch (mensaje)
> {
> case WM_CREATE:
> static HWND listaControles[5];
> static int nControles=0;
> static HINSTANCE hInstancia;
Esto es un error. No puedes crear variables en la estructura de control
'switch/case'. Tendrías que hacer tales declaraciones en un bloque. Por
ejemplo,
case WM_CREATE:
{
static HWND listaControles[5];
static int nControles=0;
static HINSTANCE hInstancia;
...
}
break;
Sin embargo, esto no tiene mucho sentido. Principalmente, porque no se
recibirá más mensajes 'WM_CREATE' automáticamente. Además, estas
variables sólo existen en este ámbito - dentro de este bloque.
Lo que quieres hacer es declarar las variables estáticamente en el
ámbito de la función 'WindowProcedure()'. Es decir,
static HWND listaControles[5];
static int nControles=0;
static HINSTANCE hInstancia;
switch( mensaje )
{
case WM_CREATE:
...
}
> CrearControles(listaControles, nControles, hwnd, hInstancia );
> break;
> case WM_COMMAND:
> MessageBox(NULL, " Esta seguro que desea abandonar el
> programa...", " Salir ",
> MB_OKCANCEL | MB_ICONEXCLAMATION);
> PostQuitMessage (0);
> .............
> ---------------------
> Creando los controles en el mismo archivo del WinMain me funcionan
> perfectamente.-
>
La verdad es que no estoy seguro de por qué quieres conocer los ID's de
los controles, cuando ya conoces sus manipuladores en 'listaControles'.
De todas maneras, para que lo sepas, la función que te interesa es
'GetDlgCtrlID()' la cual requiere el manipulador del control.
Espero que esto te ayude.
Steven
Más información sobre la lista de distribución Cconclase