| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
untio

Registrado: 17 Sep 2008 Mensajes: 360 Ubicación: MICA S.A.
| Publicado: 05/12/2012 5:56 am | | | Título: |
| Hola de nuevo,
El código de hoy está dividido en tres ficheros. El fichero cpp:
| Código: | #include <windows.h> #include "resource.h"
INT_PTR OnInitDialog(HWND hw, WPARAM wp, LPARAM lp) { SendDlgItemMessage(hw, IDC_RADIO1, BM_SETCHECK, BST_CHECKED, 0); SendDlgItemMessage(hw, IDC_RADIO3, BM_SETCHECK, BST_CHECKED, 0); return TRUE; } /////////////////////////////////////////////////// INT_PTR OnCommand(HWND hw, WPARAM wp, LPARAM lp) { char cadena [400]; switch(LOWORD(wp)) { case IDC_BUTTON1: { strcpy(cadena, "A los hombres les gustan las mujeres "); if(SendDlgItemMessage(hw, IDC_RADIO1, BM_GETCHECK, 0, 0) == BST_CHECKED) { strcat(cadena, "rubias y "); } else { strcat(cadena, "morenas y "); } if(SendDlgItemMessage(hw, IDC_RADIO3, BM_GETCHECK, 0, 0) == BST_CHECKED) { strcat(cadena, "altas."); } else { strcat(cadena, "bajitas."); } MessageBox(hw, cadena, "Así es la vida:", MB_OK); } return TRUE; } return FALSE; } ///////////////////////////////////////////////////////////////// INT_PTR CALLBACK DialogProcedure (HWND hw, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_INITDIALOG: return OnInitDialog(hw, wp, lp); case WM_COMMAND: return OnCommand(hw, wp, lp); case WM_CLOSE: EndDialog(hw, 0); return TRUE; default: return FALSE; } } ////////////////////////////////////////////////////////////////// int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) { DialogBox(hThisInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProcedure); return 0; }
|
El fichero rc:
| Código: | // Generated by ResEdit 1.5.11 // Copyright (C) 2006-2012 // http://www.resedit.net
#include <windows.h> #include <commctrl.h> #include <richedit.h> #include "resource.h"
// // Dialog resources // LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL IDD_DIALOG1 DIALOG 0, 0, 186, 98 STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU CAPTION "Dialog" FONT 8, "Ms Shell Dlg" { DEFPUSHBUTTON "Resumir", IDC_BUTTON1, 78, 74, 30, 14 AUTORADIOBUTTON "Rubias", IDC_RADIO1, 11, 25, 38, 8, WS_GROUP AUTORADIOBUTTON "Morenas", IDC_RADIO2, 11, 42, 43, 8 AUTORADIOBUTTON "Altas", IDC_RADIO3, 95, 26, 31, 8, WS_GROUP AUTORADIOBUTTON "Bajitas", IDC_RADIO4, 95, 44, 37, 8 LTEXT "A los hombres les gustan", IDC_STATIC, 11, 6, 79, 8, SS_LEFT }
|
Y el fichero h:
| Código: | #ifndef IDC_STATIC #define IDC_STATIC (-1) #endif
#define IDD_DIALOG1 100 #define IDC_BUTTON1 1002 #define IDC_RADIO1 1003 #define IDC_RADIO2 1004 #define IDC_RADIO3 1005 #define IDC_RADIO4 1006
|
Bueno, como veis los botones de radio se comportan bastante como los check boxes.
Sólo puede estar seleccionado uno de cada grupo. Lo importante es saber cómo se determina cuál pertenece a cada grupo. Es bastante fácil. El grupo comienza con el primer botón de radio con el estilo WS_GROUP (grupo) y acaba en el anterior al próximo botón con ese estilo. (Para comprobarlo podéis mirar en el ficheor .rc ó modificarlo según vuestras necesidades.
Un saludo. _________________ Hago algo muy raro: primero leo las instrucciones. |
| | Volver arriba | |  | untio

Registrado: 17 Sep 2008 Mensajes: 360 Ubicación: MICA S.A.
| Publicado: 16/12/2012 4:45 am | | | Título: |
| Hola de nuevo,
El fichero cpp de hoy es:
| Código: | #include <windows.h> #include "resource.h"
INT_PTR OnInitDialog(HWND hw, WPARAM wp, LPARAM lp) { SendDlgItemMessage(hw, IDC_RADIO1, BM_SETCHECK, BST_CHECKED, 0); SendDlgItemMessage(hw, IDC_CHECKBOX1, BM_SETCHECK, BST_CHECKED, 0); return TRUE; } /////////////////////////////////////////////////// INT_PTR OnCommand(HWND hw, WPARAM wp, LPARAM lp) { HWND hw1, hw2; BOOL b; switch(LOWORD(wp)) { case IDC_CHECKBOX1: { hw1 = GetDlgItem(hw, IDC_RADIO1); hw2 = GetDlgItem(hw, IDC_RADIO2); if(SendDlgItemMessage(hw, IDC_CHECKBOX1, BM_GETCHECK, 0, 0) == BST_CHECKED) b = TRUE; else b = FALSE; EnableWindow(hw1, b); EnableWindow(hw2, b); return TRUE;
} case IDC_BUTTON1: { if(SendDlgItemMessage(hw, IDC_CHECKBOX1, BM_GETCHECK, 0, 0) == BST_CHECKED) { if(SendDlgItemMessage(hw, IDC_RADIO1, BM_GETCHECK, 0, 0) == BST_CHECKED) MessageBox(hw, "Prefieres el fútbol", "Es curioso:", MB_OK); else MessageBox(hw, "Prefieres el basket", "Es curioso:", MB_OK); } else MessageBox(hw, "No te gusta el deporte", "Es curioso:", MB_OK); } return TRUE; } return FALSE; } ///////////////////////////////////////////////////////////////// INT_PTR CALLBACK DialogProcedure (HWND hw, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_INITDIALOG: return OnInitDialog(hw, wp, lp); case WM_COMMAND: return OnCommand(hw, wp, lp); case WM_CLOSE: EndDialog(hw, 0); return TRUE; default: return FALSE; } } ////////////////////////////////////////////////////////////////// int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) { DialogBox(hThisInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProcedure); return 0; }
|
El fichero rc de hoy es:
| Código: | // Generated by ResEdit 1.5.11 // Copyright (C) 2006-2012 // http://www.resedit.net
#include <windows.h> #include <commctrl.h> #include <richedit.h> #include "resource.h"
// // Dialog resources // LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL IDD_DIALOG1 DIALOG 0, 0, 186, 114 STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU CAPTION "Deporte" FONT 8, "Ms Shell Dlg" { DEFPUSHBUTTON "Resumir", IDC_BUTTON1, 73, 94, 30, 14 GROUPBOX "Cual", IDC_STATIC, 13, 33, 118, 51 AUTOCHECKBOX "Me gusta el deporte", IDC_CHECKBOX1, 15, 12, 79, 8 AUTORADIOBUTTON "Fútbol", IDC_RADIO1, 27, 44, 35, 8, WS_GROUP AUTORADIOBUTTON "Basket", IDC_RADIO2, 27, 66, 38, 8 }
|
Y el fichero de cabecera es:
| Código: | #ifndef IDC_STATIC #define IDC_STATIC (-1) #endif
#define IDD_DIALOG1 100 #define IDC_BUTTON1 1002 #define IDC_CHECKBOX1 1003 #define IDC_RADIO1 1004 #define IDC_RADIO2 1005
|
Aunque parezca curioso, los checkbox y los radiobuton son botones también. Por eso generan mensajes command cuando son pulsados.
La función GetDlgItem obtiene el manejador (HWND) de un elemento del cuadro de diálogo. Los parámetros son el manejador del cuadro de diálogo y el ID del elemento.
EnableWindow habilita o deshabilita la ventana. Los parámetros son el manejador de la ventana y los valores TRUE ó FALSE, uno para habilitar y el otro para deshabilitar.
Como veis, el trabajo con los controles y demás ventanas se hace enviándoles mensajes y respondiendo a los mensajes que producen. Esto se puede hacer, cuando tienes el manejador, con SendMessage y con SendDlgItemMessage cuando tienes el manejador del cuadro de diálogo y el ID del control. No obstante puedes hacerlo a través de SendMessage si obtienes el manejador del control.
En fin, no me enrollo más por hoy.
Saludos. _________________ Hago algo muy raro: primero leo las instrucciones. |
| | Volver arriba | |  | untio

Registrado: 17 Sep 2008 Mensajes: 360 Ubicación: MICA S.A.
| Publicado: 28/12/2012 7:18 am | | | Título: |
| Hola de nuevo con unos cuantos quilos de más,
El código de hoy está dividido en 3 ficheros.
El primero:
| Código: | #include <windows.h> #include "resource.h"
/////////////////////////////////////////////////// INT_PTR OnCommand(HWND hw, WPARAM wp, LPARAM lp) { int longitud; char * texto; switch(LOWORD(wp)) { case IDC_EDIT1: { if(HIWORD(wp) == EN_UPDATE) { longitud = SendDlgItemMessage(hw, IDC_EDIT1, WM_GETTEXTLENGTH, 0, 0) + 1; texto = (char *) malloc(sizeof(char) * longitud); SendDlgItemMessage(hw, IDC_EDIT1, WM_GETTEXT, longitud, (LPARAM) texto); SendDlgItemMessage(hw, IDC_EDIT2, WM_SETTEXT, 0, (LPARAM) texto); free(texto); return TRUE; } } } return FALSE; } ///////////////////////////////////////////////////////////////// INT_PTR CALLBACK DialogProcedure (HWND hw, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_COMMAND: return OnCommand(hw, wp, lp); case WM_CLOSE: EndDialog(hw, 0); return TRUE; default: return FALSE; } } ////////////////////////////////////////////////////////////////// int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) { DialogBox(hThisInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProcedure); return 0; }
|
El segundo:
| Código: | // Generated by ResEdit 1.5.11 // Copyright (C) 2006-2012 // http://www.resedit.net
#include <windows.h> #include <commctrl.h> #include <richedit.h> #include "resource.h" // // Dialog resources // LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL IDD_DIALOG1 DIALOG 0, 0, 186, 74 STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU CAPTION "Texto" FONT 8, "Ms Shell Dlg" { EDITTEXT IDC_EDIT1, 14, 16, 164, 12, ES_AUTOHSCROLL EDITTEXT IDC_EDIT2, 14, 49, 164, 12, ES_AUTOHSCROLL }
|
Y el tercero:
| Código: | ifndef IDC_STATIC #define IDC_STATIC (-1) #endif
#define IDD_DIALOG1 100 #define IDC_EDIT1 1000 #define IDC_EDIT2 1001
|
La clave de este programa está en los mensajes WM_COMMAND. Este tipo de mensaje incorpora un código de notificiación en la palabra alta de wparam.
Para un botón no suele ser necesario consultar el código, pero para otros controles sí puede hacer falta.
El código de notificación EN_UPDATE es enviado cuando cambia el contenido de un control EDIT.
Al responder al mensaje, primero obtengo la longitud del texto en el control enviándole el mensaje WM_GETTEXTLENGTH. Después reservo la memoria que necesito para guardar el texto (y el nulo al final -de ahí el +1). Obtengo el texto con el mensaje WM_GETTEXT y después establezco el texto en el otro control EDIT con WM_SETTEXT.
Bueno, mejor poquito a poquito.
Feliz año. _________________ Hago algo muy raro: primero leo las instrucciones. |
| | Volver arriba | |  | | untio

Registrado: 17 Sep 2008 Mensajes: 360 Ubicación: MICA S.A.
| Publicado: 07/01/2013 9:19 am | | | Título: |
| Hola de nuevo,
La segunda entrega de los controles edit:
El fichero cpp:
| Código: | #include <windows.h> #include "resource.h"
/////////////////////////////////////////////////// INT_PTR OnInitDialog(HWND hw, WPARAM wp, LPARAM lp) { SendDlgItemMessage(hw, IDC_EDIT1, EM_SETLIMITTEXT, 8, 0); SendDlgItemMessage(hw, IDC_EDIT2, EM_SETLIMITTEXT, 4, 0); return FALSE; } ///////////////////////////////////////////////////////////////// INT_PTR CALLBACK DialogProcedure (HWND hw, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_INITDIALOG: return OnInitDialog(hw, wp, lp); case WM_CLOSE: EndDialog(hw, 0); return TRUE; default: return FALSE; } } ////////////////////////////////////////////////////////////////// int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) { DialogBox(hThisInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProcedure); return 0; }
|
El fichero rc:
| Código: | // Generated by ResEdit 1.5.11 // Copyright (C) 2006-2012 // http://www.resedit.net
#include <windows.h> #include <commctrl.h> #include <richedit.h> #include "resource.h"
// Dialog resources // LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL IDD_DIALOG1 DIALOG 0, 0, 186, 77 STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU CAPTION "Texto" FONT 8, "Ms Shell Dlg" { EDITTEXT IDC_EDIT1, 14, 16, 164, 12, ES_AUTOHSCROLL | ES_PASSWORD EDITTEXT IDC_EDIT2, 14, 49, 164, 12, ES_AUTOHSCROLL | ES_NUMBER }
|
Y el fichero h:
| Código: | #ifndef IDC_STATIC #define IDC_STATIC (-1) #endif
#define IDD_DIALOG1 100 #define IDC_EDIT1 1000 #define IDC_EDIT2 1001
|
Un control edit tiene cambiado el estilo para simular la entrada de una contraseña y el otro sólo admite números.
Con el mensaje EM_SETLIMITTEXT fijamos el número de caracteres que admitirá el control. En wparam se indica la cantidad de caracteres y en lparam se pone un cero.
Bueno, en el próximo mensaje seguiremos explorando controles.
Saludos. _________________ Hago algo muy raro: primero leo las instrucciones. |
| | Volver arriba | |  | untio

Registrado: 17 Sep 2008 Mensajes: 360 Ubicación: MICA S.A.
| Publicado: 20/01/2013 5:37 am | | | Título: |
| Hola de nuevo,
Aquí están los ficheros de hoy.
Primero el cpp:
| Código: | #include <windows.h> #include "resource.h"
/////////////////////////////////////////////////// INT_PTR OnCommand(HWND hw, WPARAM wp, LPARAM lp) { INT longi; char * ptexto; char *preser; if ((LOWORD(wp) == IDC_EDIT1) && (HIWORD(wp) == EN_UPDATE)) { longi = SendDlgItemMessage(hw, IDC_EDIT1, WM_GETTEXTLENGTH, 0, 0); ptexto = (char *) malloc(sizeof(char) * (longi + 1)); preser = (char *) malloc(sizeof(char) * (longi + 1)); SendDlgItemMessage(hw, IDC_EDIT1, WM_GETTEXT, longi + 1, (LPARAM) ptexto); strcpy(preser, ptexto); strupr(ptexto); if(strcmp(preser, ptexto) == 0) { free(ptexto); free(preser); return 0; } SendDlgItemMessage(hw, IDC_EDIT1, WM_SETTEXT, 0, (LPARAM) ptexto); free(ptexto); free(preser); return TRUE; } return FALSE; } ///////////////////////////////////////////////////////////////// INT_PTR CALLBACK DialogProcedure (HWND hw, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_COMMAND: return OnCommand(hw, wp, lp); case WM_CLOSE: EndDialog(hw, 0); return TRUE; default: return FALSE; } } ////////////////////////////////////////////////////////////////// int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) { DialogBox(hThisInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProcedure); return 0; }
|
Ahora los recursos:
| Código: |
#include <windows.h> #include <commctrl.h> #include <richedit.h> #include "resource.h" // // Dialog resources // LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL IDD_DIALOG1 DIALOG 0, 0, 186, 47 STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU CAPTION "Texto" FONT 8, "Ms Shell Dlg" { EDITTEXT IDC_EDIT1, 14, 16, 164, 12, ES_AUTOHSCROLL }
|
Y ahora el de cabecera:
| Código: | #ifndef IDC_STATIC #define IDC_STATIC (-1) #endif
#define IDD_DIALOG1 100 #define IDC_EDIT1 1000
|
Este post lo he puesto porque hace algún tiempo alguien preguntó en este foro cómo podía hacer para que en un cuadro de texto no se mostrase cierto carácter. No recuerdo si era la barra de separación de directorios u otro.
Pues bien, cuando queremos asegurarnos de que en un control de edición aparece sólo lo que nosotros queremos hemos de procesar el código de notificación EN_UPDATE, que viene a través de un mensaje WM_COMMAND.
Este mensaje se produce después de que el texto esté en memoria, pero antes de que se escriba en el control edit.
Lo más importante al procesarlo es tener en cuenta que cualquier cambio que hagamos en el texto al ser envíado de nuevo al control a través de un mensaje WM_SETTEXT nos generará una nueva notificación EN_UPDATE. Por eso se pone alguna comprobación.
Bien, mi código cambia la cadena entrada a mayúsculas. Sin embargo, no funciona con caracteres acentuados ni con caracteres que no sean ascii. Para ello habría que escribir más código que no viene al caso.
En fin. Creo que ya está bien por ahora.
Saludos. _________________ Hago algo muy raro: primero leo las instrucciones. |
| | Volver arriba | |  | untio

Registrado: 17 Sep 2008 Mensajes: 360 Ubicación: MICA S.A.
| Publicado: 28/01/2013 7:59 am | | | Título: |
| Hola nuevamente,
En este post voy a mostrar que los controles static sirven para algo más que mostrar texto. Por ejemplo, se puede mostrar en ellos un icono o un bitmap.
Voy a poner el código para poner un icono ya que voy a usar uno de los del propio sistema. Para poner un bitmap habría que incluirlo en un fichero de recursos y no veo módo de subir el bitmap aquí, pero viene a ser el mismo método que para el icono.
Ahí va el código simplificado todo lo posible:
El fichero cpp:
| Código: | #include <windows.h> #include "resource.h"
/////////////////////////////////////////////////// INT_PTR OnInitDialog(HWND hw, WPARAM wp, LPARAM lp) { HICON hic; hic = LoadIcon(NULL, IDI_ERROR); SendDlgItemMessage(hw, IDC_STATIC, STM_SETICON, (WPARAM) hic, 0); return TRUE; } ///////////////////////////////////////////////////////////////// INT_PTR CALLBACK DialogProcedure (HWND hw, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_INITDIALOG: return OnInitDialog(hw, wp, lp); case WM_CLOSE: EndDialog(hw, 0); return TRUE; default: return FALSE; } } ////////////////////////////////////////////////////////////////// int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) { DialogBox(hThisInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProcedure); return 0; }
|
Ahora el fichero rc:
| Código: | #include <windows.h> #include <commctrl.h> #include <richedit.h> #include "resource.h"
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL IDD_DIALOG1 DIALOG 0, 0, 186, 47 STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU CAPTION "" FONT 8, "Ms Shell Dlg" { ICON "", IDC_STATIC, 33, 14, 40, 27, SS_ICON }
|
Y el h:
| Código: | #define IDC_STATIC 1000 #define IDD_DIALOG1 100
|
Como ya os he dicho, este post es para que veáis que podéis poner un icono fácilmente en un cuadro de diálogo, haciéndolo más vistoso.
Saludos. _________________ Hago algo muy raro: primero leo las instrucciones. |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |