Sugerecia con gui en windows api?

Iniciado por @XSStringManolo, 6 Junio 2019, 18:20 PM

0 Miembros y 1 Visitante están viendo este tema.

@XSStringManolo

Estoy haciendo una calculadora. Abro la ventana con tamaño pequeño y tengo los botones puestos por cordenadas. Encaja bien y tal.
Al darle a maximizar la ventana los botones acompañan hacia la esquina izquierda, pero queda feo porque la ventana es grande y los botonones pequeños. Entonces se ve 7 octavos de la ventana vacios y un octavo con los botones. Quedando una inmensa zona vacia.

Que haríais? Poner la ventana que no se pueda maximizar y ya.
Detectar que se maximiza la ventana para añadir alguna utilidad como un bloc de notas para apuntar cosas.
Un log con la información de todas las operaciones?
Reajustar los botones al tamaño de la ventana? Se vería feísimo no?
Limitar a cierto tamaño el tamaño máximo de la calculadora?

También me gustaría anclarla a la pantalla que se vea en primer plano siempre sin difuminarse cuando se haga click fuera de la calculadora. También que pille el primer click que se haga, y que no se necesite hacer un click previo para reactivarla/ traerla al frente.
Alguna idea de que tengo que utilizar para hacer esto? No sé como buscarlo. No me manejo nada con la api.

A parte de lo mencionado que más debería tener la calculadora que considereis práctico?

RayR

Yo simplemente haría que la ventana no se pueda maximizar ni cambiar de tamaño. Así funcionaba antes la de Windows, aunque ahora ya permite maximizar y se ve horrible.

Para que quede en primer plano, al crearla, debes pasar WS_EX_TOPMOST como primer parámetro a CreateWindowEx(). Esto hará que tu ventana siempre esté al frente, pero sí se difuminará cuando hagas click fuera de ella. Esto no se puede cambiar, a menos que hicieras algo que ya raya en el comportamiento de un malware: apoderarte totalmente del "foco", lo cual en esencia significaría bloquear los clicks y tecleos fuera de tu ventana.

Lo del primer click no lo entiendo muy bien. Si te refieres a que cualquier click incluso fuera de tu ventana la traiga al frente y la active, nos remitimos al punto anterior.

@XSStringManolo

Eso haré, le voy a poner WS_SYSMENU && WS_CAPTION. Queda bastante mejor que con los botones de minimizar etc. Ahora no puedo cerrar el programa asique o le pongo junto a los botones de la calculadora un boton Salir o le pongo una X para cerrar a la ventana(si se puede) porque estuve mirando y solo encontre para añadir los de maximizar y minimizar, pero del de poner la X no. Me gustaría probar ambas opciones a ver cual me queda mejor.

El tipo de comportamiento de la ventana que quiero es como el estilo WS_EX_TOPMOST pero quedando fija en pantalla. Para poder abrir por ejemplo un pdf en pantalla completa y que la calculadora siga activa al frente por comodidad para el usuario. He visto varios reproductores de música que hacen esto. No sé si es posible con la api de windows. Supongo que sí.

Igual haciendo la ventana principal que no sea hija del escritorio y sea independiente, cono si fuese un segundo escritorio de poco tamaño que se superpone al escritorio original. Tengo que mirar en las alternativas disponibles en lugar de HWND_DESKTOP a ver si hay alguna. A menos que alguien conozca otro método.

Con lo del click me refiero a que siempre esté al frente y no se necesite hacer un click en la calculadora para traerla al frente y otro click para darle a un boton. Si no, con hacer un solo click en la calculadora se marque el numero, y un click fuera de la calculadora no robe el imput del resto de la pantalla. Si no que se pueda hacer uso normal de este.
Se que esto se puede hacer y me estraña que sea imposible en la api de windows, pero podría ser.

Otra duda:
Tengo botones creados con estilo BS_PUSHBUTTON no me gusta que sean cuadrados ni grises.
No tengo ni idea de como cambiarlos para hacerlos con las esquinas bordeadas y de otro color.
Se me da bien el disenho de imagenes, podría dibujar un botón y ponerlo de alguna manera en lugar del botón original?

Para la ventana principal me es fácil cambiarlo con el metodo hbrBackground. Debería crear los botontes a partir de esa clase? Los estoy creando como una ventana nueva y colocando encima de la otra mediante las coordenadas de la funcion para crear ventanas.

Disculpa por todas las preguntas, no tengo mucha idea de lo que estoy haciendo xD

Me esta gustando mucho la api, gracias por las recomendaciones en otros hilos.

RayR

Cita de: string Manolo en  6 Junio 2019, 21:43 PM
El tipo de comportamiento de la ventana que quiero es como el estilo WS_EX_TOPMOST pero quedando fija en pantalla. Para poder abrir por ejemplo un pdf en pantalla completa y que la calculadora siga activa al frente por comodidad para el usuario. He visto varios reproductores de música que hacen esto. No sé si es posible con la api de windows. Supongo que sí.

Ah, te había entendido mal. Para eso basta con usar WS_EX_TOPMOST. Con lo de "difuminar" me refería a que cuando haces click en otra ventana, Windows hará que en tu ventana, el título de la misma se difumine un poco, se ponga gris en vez de negra. Pero tu ventana estará siempre al frente. Puedes perfectamente abrir Chrome, Acrobat, etc. maximizados y tu calculadora seguirá encima de ellas.

Para lo del click, ya no necesitarías hacer nada más. Aunque el foco lo tenga otro programa, en cuanto hagas click en un botón de tu calculadora, se activará y presionará el botón a la vez.

Sobre los botones, de forma predeterminada, Windows hace que los controles usen estilo "clásico" (de antes de Windows XP) que se ve bastante feo. Para hacer que tengan apariencia actual: https://docs.microsoft.com/en-us/windows/desktop/controls/cookbook-overview . Lo más fácil es copiar el contenido del archivo manifest ejemplo que ahí se muestra, en un archivo llamado nombredetuejecutable.exe.manifest y colocarlo en el mismo directorio que el .exe.

Pero si realmente quieres dibujarlos tú, lo que debes hacer es, crearlos normalmente, pero encargarte de pintarlos manualmente. Para esto, primero debes crear un manifest file, como te puse arriba. Luego, en tu procedimiento de ventana, debes manejar el evento WM_NOTIFY, verificar si recibiste el código NM_CUSTOMDRAW y si fue alguno de los botones quien recibe el evento. De ser así, dibujas lo que quieras: rectángulo con esquinas redondas, elipses, etc., usando las funciones de dibujo de Windows. Buscando NM_CUSTOMDRAW deberías encontrar información.

@XSStringManolo

Ohhh, muchas gracias. Me ha quedado todo claro.

Va a quedar genial. Cuando la acabe la compartire open source. En el foro.

Ahora lo importante es el funcionamiento. Tiene solo 4 operaciones distintas. El igual para el resultado y el reset para borrar la pantalla. Le pondré más. No se si desarrollarlas yo o usar directamente las de math.h
A parte tiene algún bug pequeño y las operaciones se me realizan muy lentamente a veces.  Probablemente cambie el funcionamiento de las operaciones, le añada un blog de notas por estética y utilidad y un log pequeño que no moleste con scrollbar para ver las operaciones antiguas. También pondré varios archivos log según la fecha del sistema con absolutamente todas las operaciones que realice el programa, por lo típico que de un día para otro no te acuerdas. Y un menú desplegable para poder abrirlos fácilmente sin necesidad de tener que buscar la carpeta.

De todas formas lo más importante son las operaciones.

Va a ir con calma la cosa que estoy con 20 proyectos a la vez. Casi literal xD
A lo mejor la tengo pasado mañana, a lo mejor pal mes. Según como me de.