Hilo
Controles de Windows API 32 (Daniel de Dios) 2020-02-01 17:41:04
Hola:
Me he bajado todo el curso de WinApi23, los primeros ejemplos han funcionado correctamente, pero yo a lo mio, así que he ido directamente al ejemplo 49 que me interesaba. Compila bien, pero a la hora del Link, todas las funciones de fuentes y colores, dan problemas y no se genera el ejecutable.
He quitado todo lo referente a ellas, y funciona. Luego he añadido otro EDIT, y al ejecutarse el programa entra en el primer EDIT, y ya no sale de allí a no ser que uses el ratón. Ni el ENTER ni el TAB pasan de un control a otro. Llevo 3 días pegándome con este problema. He intentado añadir el WM_KEYDOWN<http://winapi.conclase.net/curso/?winmsg=WM_KEYDOWN#inicio> pero por mucho que teclees en el control, no pasa por él. ¿Qué me podéis decir al respecto?
/* Esta función es invocada por la función DispatchMessage() */
LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static HINSTANCE hInstance;
/* Variables para diálogo */
static DATOS Datos;
HWND hctrl;
HWND hctr2;
switch (msg) /* manipulador del mensaje */
{
case WM_CREATE:
hInstance = ((LPCREATESTRUCT)lParam)-> hInstance;
/* Insertar control Edit */
hctrl = CreateWindowEx(
0,
"EDIT", /* Nombre de la clase */
"", /* Texto del título, no tiene */
ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, /* Estilo */
36, 20, /* Posición */
120, 25, /* Tamaño */
hwnd, /* Ventana padre */
(HMENU)ID_TEXTO, /* Identificador del control */
hInstance, /* Instancia */
NULL); /* Sin datos de creación de ventana */
/* Inicialización de los datos de la aplicación */
SendMessage(hctrl, EM_SETLIMITTEXT, 10, 0L);
strcpy(Datos.Texto, "Inicial");
SendMessage(hctrl, WM_SETTEXT, 0, (LPARAM)Datos.Texto);
/* Insertar control Edit */
hctr2 = CreateWindowEx(
0,
"EDIT", /* Nombre de la clase */
"", /* Texto del título, no tiene */
ES_LEFT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, /* Estilo */
200, 20, /* Posición */
120, 25, /* Tamaño */
hwnd, /* Ventana padre */
(HMENU)ID_TEXTO2, /* Identificador del control */
hInstance, /* Instancia */
NULL); /* Sin datos de creación de ventana */
/* Inicialización de los datos de la aplicación */
SendMessage(hctr2, EM_SETLIMITTEXT, 10, 0L);
SendMessage(hctr2, WM_SETTEXT, 0, (LPARAM) "Gutierrez" );
SetFocus(hctrl);
return 0;
case WM_COMMAND:
switch(LOWORD(wParam)) {
case CM_SALIR:
DestroyWindow(hwnd);
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0); /* envía un mensaje WM_QUIT a la cola de mensajes */
break;
default: /* para los mensajes de los que no nos ocupamos */
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
Saludos
Daniel de Dios "El Ignorado"
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Re: Controles de Windows API 32 (Salvador Pozo) 2020-02-01 20:31:05
Hola:
Prueba a cambiar el bucle de procesado de mensajes en la función main por este:
----8<------
while(TRUE == GetMessage(&mensaje, NULL, 0, 0))
{
if (!IsDialogMessage(hwnd, &mensaje))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&mensaje);
/* Send message to WindowProcedure */
DispatchMessage(&mensaje);
}
}
----8<------
Los procedimientos de diálogo procesan los mensajes de un modo diferente al de las ventanas normales, por lo que hay que invocar a la función IsDialogMessage para que procese cosas como la tecla TAB.
Suerte.
Hasta pronto.
--
Salvador Pozo (Administrador)
mailto:salvador@conclase.net
Blog con Clase: http://blogconclase.wordpress.com
Con Clase: http://conclase.net
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Re: Controles de Windows API 32 (Daniel de Dios) 2020-02-02 20:11:56
Muchas gracias Salvador.
Ha sido una pronta y acertada solución, ya pasa de control en control como es debido. Pero sigo sin tener acceso al KEYDOWN. Para poder hacer programas complejos, o bien he de conseguir que la función de eventos del dialogbox sea la misma que la de la pantalla principal, o bien habré de crear una clase derivada de la de EDIT, para conseguir que cada objeto de dicha clase, registre su propio tipo de clase con su nombre y su propia función de eventos. (Por cierto, si que tengo acceso al KEYDOWN, pero solo cuando el EDIT, no sabe que hacer con esa tecla, por ejemplo una tecla de función)
Saludos
Daniel de Dios "El Ignorado"
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Re: Controles de Windows API 32 (Salvador Pozo) 2020-02-03 20:18:54
Hola:
Para capturar el teclado intenta usar un "hook", puedes consultar la documentación de ms:
https://docs.microsoft.com/en-us/windows/win32/winmsg/about-hooks
Con respecto al problema de usar colores en los edits, prueba a iniciar los controles comunes usando la función, creo que el mensaje WM_CTLCOLOREDIT requiere que se haga esto:
InitCommonControls o InitCommonControlsEx:
https://docs.microsoft.com/en-us/windows/win32/api/commctrl/nf-commctrl-initcommoncontrolsex
Hay ejemplos a partir del capítulo 47.
Suerte.
Hasta pronto.
--
Salvador Pozo (Administrador)
mailto:salvador@conclase.net
Blog con Clase: http://blogconclase.wordpress.com
Con Clase: http://conclase.net
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Re: Controles de Windows API 32 (Daniel de Dios) 2020-02-09 21:54:48
Hola Salvador:
Gracias por la información. Seguro que me será de ayuda en alguna ocasión el "hook", pero para los controles me da que no podré usarlo pues no me dice en que control se produce esa pulsación de tecla. Buscando por Internet he encontrado esto, que tiene visas de servirme.
https://riptutorial.com/es/winapi/example/29347/umgang-mit-benachrichtigungsnachrichten-fur-allgemeine-steuerungen-innerhalb-der-c-plusplus---klasse
class MyToolbarControl {
public:
MyToolbarControl(HWND hWndToolbar, HWND hWndNotifyParent = nullptr) : _Handle(hWndToolbar) {
if (hWndNotifyParent == nullptr) {
hWndNotifyParent = GetAncestor(hWndToolbar, GA_ROOTOWNER);
}
SetWindowSubclass(
hWndNotifyParent , SubclassWindowProc, reinterpret_cast<UINT_PTR> (this), reinterpret_cast<DWORD_PTR>(this)
);
}
~MyToolbarControl() {
RemoveWindowSubclass(
hWndNotifyParent , SubclassWindowProc, reinterpret_cast<UINT_PTR> (this), reinterpret_cast<DWORD_PTR>(this)
);
}
protected:
HWND _Handle;
static LRESULT CALLBACK SubclassWindowProc(
HWND hWnd, UINT Msg, WPARAM w, LPARAM l, UINT_PTR SubclassId, DWORD_PTR RefData) {
MyToolbarControl * w = reinterpret_cast<MyToolbarControl *>(RefData);
if (Msg == WM_NOTIFY) {
NMHDR* h = reinterpret_cast<NMHDR*>(l);
if (h->hwndFrom == w-> _Handle) {
// Handle notification message here...
}
}
return DefSubclassProc(hWnd, Msg, w, l);
}
};
Que si no he entendido mal, haría que un control, cambiara la función de respuestas de los eventos, por la función que definiera yo en mi programa. Me falta probarlo.
En cuanto a los problemas con los fuentes y colores, ha de ser algún problema con los includes, pues parece que no reconoce las funciones como parte de una DLL, y parece que el link, espera resolver los problemas con una biblioteca estática. (Por cierto, ¿como se indica que funciones ha de buscar en una DLL en concreto?)
¿Hay que indicar algo en los includes, o se ha de añadir la DLL, en cuestión en el Link como se con las bibliotecas estáticas?
Saludos
Daniel de Dios "El Ignorado"
________________________________
De: Cconclase <cconclase-bounces@listas.conclase.net> en nombre de Salvador Pozo <salvador@conclase.net>
Enviado: lunes, 3 de febrero de 2020 21:18
Para: cconclase@listas.conclase.net <cconclase@listas.conclase.net>
Asunto: Re: [C con Clase] Controles de Windows API 32
Hola:
Para capturar el teclado intenta usar un "hook", puedes consultar la documentación de ms:
https://docs.microsoft.com/en-us/windows/win32/winmsg/about-hooks
Con respecto al problema de usar colores en los edits, prueba a iniciar los controles comunes usando la función, creo que el mensaje WM_CTLCOLOREDIT requiere que se haga esto:
InitCommonControls o InitCommonControlsEx:
https://docs.microsoft.com/en-us/windows/win32/api/commctrl/nf-commctrl-initcommoncontrolsex
Hay ejemplos a partir del capítulo 47.
Suerte.
Hasta pronto.
--
Salvador Pozo (Administrador)
mailto:salvador@conclase.net
Blog con Clase: http://blogconclase.wordpress.com
Con Clase: http://conclase.net
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Re: Controles de Windows API 32 (Salvador Pozo) 2020-02-11 16:12:56
Hola:
Esto es un tema "avanzado" del API de Windows.
Lo que necesitas para personalizar más un control es crear una subclase. La documentación de microsoft explica cómo hacerlo:
https://docs.microsoft.com/en-us/windows/win32/winmsg/about-window-procedures
Básicamente consiste en crear tu propio procedimiento de ventana para el control que quieres modificar, y usar la función: SetWindowLong
http://winapi.conclase.net/curso/?winfun=SetWindowLong
Para que los mensajes se envíen a ese procedimiento. Una vez que hayas procesado los mensajes que te interese, el resto se envían al procedimiento de ventana original usando CallWindowProc y la dirección del procedimiento que has debido conservar previamente, y que te devuelve SetWindowLong.
DdD> En cuanto a los problemas con los fuentes y colores, ha de ser algún problema con los includes, pues parece que no reconoce las funciones como parte de una DLL, y parece que el link, espera resolver los problemas con una biblioteca estática. (Por cierto, ¿como se indica que funciones ha de buscar en una DLL en concreto?)
DdD> ¿Hay que indicar algo en los includes, o se ha de añadir la DLL, en cuestión en el Link como se con las bibliotecas estáticas?
La función SetBkColor requiere la DLL Comctl32.dll, deberías añadirla en la configuración del proyecto para que se enlace.
No sé qué compilador estás usando, y la forma de añadir librerías en la fase
de enlazado es diferente en cada uno. En el caso de Code::Blocks es en "opciones de proyecto", "Linker settings", "Link libraries". Basta con añadir el nombre de la librería, sin el "DLL", en este caso "comctl32".
Aunque usando este IDE aparentemente no es necesario, ya que el propio IDE carga esa DLL para su uso, y enmascara los errores en el proyecto. Esto puede ser un problema cuando se ejecute la aplicación y ninguna otra haya cargado esa librería. :(
Hasta pronto.
--
Salvador Pozo (Administrador)
mailto:salvador@conclase.net
Blog con Clase: http://blogconclase.wordpress.com
Con Clase: http://conclase.net
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Re: Controles de Windows API 32 (Daniel de Dios) 2020-02-14 12:14:35
Gracias Salvador. Nuevamente te doy las gracias por la información, que me será muy útil, ahora tengo mucho que leer, comprender y experimentar, pues veo que hay varias formas de conseguir lo que quiero. El tener el control sobre los controles era imprescindible para programar en serio, pero se puede conseguir añadir más cosas con la superclase. Ya veremos, es cosa de probarlo.
Saludos
Daniel de Dios "El Ignorado"
________________________________
De: Cconclase <cconclase-bounces@listas.conclase.net> en nombre de Salvador Pozo <salvador@conclase.net>
Enviado: martes, 11 de febrero de 2020 17:12
Para: cconclase@listas.conclase.net <cconclase@listas.conclase.net>
Asunto: Re: [C con Clase] Controles de Windows API 32
Hola:
Esto es un tema "avanzado" del API de Windows.
Lo que necesitas para personalizar más un control es crear una subclase. La documentación de microsoft explica cómo hacerlo:
https://docs.microsoft.com/en-us/windows/win32/winmsg/about-window-procedures
Básicamente consiste en crear tu propio procedimiento de ventana para el control que quieres modificar, y usar la función: SetWindowLong
http://winapi.conclase.net/curso/?winfun=SetWindowLong
Para que los mensajes se envíen a ese procedimiento. Una vez que hayas procesado los mensajes que te interese, el resto se envían al procedimiento de ventana original usando CallWindowProc y la dirección del procedimiento que has debido conservar previamente, y que te devuelve SetWindowLong.
DdD> En cuanto a los problemas con los fuentes y colores, ha de ser algún problema con los includes, pues parece que no reconoce las funciones como parte de una DLL, y parece que el link, espera resolver los problemas con una biblioteca estática. (Por cierto, ¿como se indica que funciones ha de buscar en una DLL en concreto?)
DdD> ¿Hay que indicar algo en los includes, o se ha de añadir la DLL, en cuestión en el Link como se con las bibliotecas estáticas?
La función SetBkColor requiere la DLL Comctl32.dll, deberías añadirla en la configuración del proyecto para que se enlace.
No sé qué compilador estás usando, y la forma de añadir librerías en la fase
de enlazado es diferente en cada uno. En el caso de Code::Blocks es en "opciones de proyecto", "Linker settings", "Link libraries". Basta con añadir el nombre de la librería, sin el "DLL", en este caso "comctl32".
Aunque usando este IDE aparentemente no es necesario, ya que el propio IDE carga esa DLL para su uso, y enmascara los errores en el proyecto. Esto puede ser un problema cuando se ejecute la aplicación y ninguna otra haya cargado esa librería. :(
Hasta pronto.
--
Salvador Pozo (Administrador)
mailto:salvador@conclase.net
Blog con Clase: http://blogconclase.wordpress.com
Con Clase: http://conclase.net
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ