[C con Clase] Procesar Msj de Ctrl Edit, Combo, etc.

Adolfo Cárdenas adocardenas en gmail.com
Vie Jun 20 05:03:11 CEST 2008


El día 9 de junio de 2008 12:52, Adolfo Cárdenas
<adocardenas en gmail.com> escribió:
> 2008/6/6 Fernando <profacua en yahoo.com.mx>:
>> gracias, sabes estoy usando Dev-C++ y ya lo intenté con los mensajes q me dices, pero aún no pasa nada, parte del código del Proc de Dlg es el siguiente:
>>        ....
>>        case WM_COMMAND:
>>            switch (LOWORD(wParam))
>>            {
>>                case IDE_NTA_NOMBRE: //DESDE AQUI PRETENDO LANZAR OTRO DLG
>>                    if( (HIWORD(wParam)==VK_RETURN) && (HIWORD(wParam)==WM_KEYDOWN) )
>>                        DialogBoxParam(hInstance, "DLG_CLIENTES", hDlg, ProcClientes, (LPARAM)&stDatosCte);
>>                    break;
>>        .... otros case´s
>> IDE_NTA_NOMBRE es el nombre el ctrl EDIT
>> ¿Me faltará declarar algo adicional para que se procesen dichos mensajes?
>> GRACIAS...
>> _______________________________________________
>> Lista de correo Cconclase Cconclase en listas.conclase.net
>> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
>> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>>
>
> Hola tengo el mismo problema,
> Como emergencia uso la funcion GetAsyncKeyState(VK_RETURN); en el
> bucle de mensajes que se le envia a la ventana para detectar si se
> presiona el ENTER:
> //Uso  la variable retsoltada para indicar al  programa si ya //se
> solto el enter.
> static int retsoltada;
>  while(TRUE == GetMessage(&mensaje, NULL, 0, 0))
>  {
>    if(GetAsyncKeyState(VK_RETURN) && 0x1000)   SendMessage(hwnd,
> WM_KEYDOWN, VK_RETURN, 0);
>    else retsoltada = 1;
>        if(GetAsyncKeyState(VK_TAB) && 0x1000) SendMessage(hwnd,
> WM_KEYDOWN, VK_TAB, 0);
>    else tabsoltada = 1;
>        if(GetAsyncKeyState(VK_ESCAPE) && 0x1000) SendMessage(hwnd,
> WM_KEYDOWN, VK_ESCAPE, 0);
>    else
>    {
>      escsoltada = 1;
>      if(!IsDialogMessage(hwnd, &mensaje))
>      {
>        TranslateMessage(&mensaje);
>        DispatchMessage(&mensaje);
>      }
>    }
>  }
>
> Luego proceso los mensajes en la funcion de la ventana
>
>  case WM_KEYDOWN:
>      tecla = (int)wParam;
>      switch(tecla)
>      {
>        case VK_ESCAPE:
>          if(escsoltada == 1)
>          if(MessageBox(hwnd, "¿Salir?", "BUSCADOR", MB_YESNO |
> MB_SYSTEMMODAL) == IDYES)
>            SendMessage(hwnd, WM_DESTROY, 0, 0);
>          escsoltada = 0;
>        break;
>        case VK_RETURN: //Buscar.
>          if((GetFocus() == hESearch || GetFocus() == hEContent) && retsoltada)
>              SendMessage(hwnd, WM_COMMAND, CM_SEARCH, 0);
>          retsoltada = 0;
>        break;
>        case VK_TAB:
>          if(GetFocus() == hEContent)
>          {
>            if(tabsoltada)
>            {
>              if(shiftpress) SetFocus(hESearch); else
> SetFocus(hBFile);
>            }
>          }
>          tabsoltada = 0;
>        break;
> ........................
>
Viendo el código de Gonzalez me di cuenta que aplicar la estructura
del mensaje es mejor.
Mando un ejemplo de una ventana con dos controles EDIT que cambian de
foco al presionarse la tecla ENTER

#include <windows.h>
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
char szClassName[ ] = "WindowsApp";
//Los controles deben declararse aqui para poder manejarlos desde WinMain:
static HWND hedit1; static HWND hedit2;
//Variable para indicar a la aplicación que los controles fueron creados:
static int creados;
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance,
LPSTR lpszArgument, int nFunsterStil)
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is
called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after
the window class */
    wincl.cbWndExtra = 0;                      /* structure or the
window instance */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    if (!RegisterClassEx (&wincl)) return 0;

    hwnd = CreateWindowEx (0, szClassName, "Windows App", WS_OVERLAPPEDWINDOW,
           CW_USEDEFAULT, CW_USEDEFAULT, 544, 375,
           HWND_DESKTOP, NULL, hThisInstance, NULL );
    ShowWindow (hwnd, nFunsterStil);
    HWND h;
    while (GetMessage (&messages, NULL, 0, 0))
    {
        if(creados == 1)  //Si los controles ya están creados:
        {
          if(messages.message == WM_KEYDOWN && messages.wParam == VK_RETURN)
          {
            h = GetFocus(); //Ver cual tiene el foco.
            //Cambiar el foco:
            if(h == hedit1) SetFocus(hedit2); else SetFocus(hedit1);
          }
        }
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
    return messages.wParam;
}
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM
wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_CREATE:
          hedit1 = CreateWindow("EDIT", "",
            ES_LEFT | ES_AUTOHSCROLL |WS_CHILD | WS_VISIBLE |
WS_BORDER | WS_TABSTOP,
            20, 20, 400, 25, hwnd, (HMENU)1,
            ((LPCREATESTRUCT) lParam)->hInstance, NULL);
          hedit2 = CreateWindow("EDIT", "",
            ES_LEFT | ES_AUTOHSCROLL |WS_CHILD | WS_VISIBLE |
WS_BORDER | WS_TABSTOP,
            20, 50, 400, 25, hwnd, (HMENU)1,
            ((LPCREATESTRUCT) lParam)->hInstance, NULL);
          SetFocus(hedit1);
          creados = 1; //Marcar como creados a los controles.
        break;
        case WM_DESTROY:
            PostQuitMessage (0);
            break;
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
    return 0;
}




Más información sobre la lista de distribución Cconclase