[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