Dev - C++ - ¿Como dibujo y escribo en un proyecto Win32 GUI?

   
Vista:

¿Como dibujo y escribo en un proyecto Win32 GUI?

Publicado por Xajorkith (2 intervenciones) el 12/03/2015 22:14:31
Buenos días. Tengo un problema a la hora de empezar a programar para windows.
He creado un proyecto con DEVC++ V7.4.2.569 portable para ir aprendiendo, del tipo Win32 GUI, que muestra una ventana al ejecutarlo y la deja activa. Su listado es el que crea DevC++ como base para la aplicación:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <windows.h>
 
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
 
/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";
 
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 */
 
    /* The Window structure */
    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);
 
    /* Use default icon and mouse-pointer */
    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 */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
 
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;
 
    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "Windows App",       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
 
    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);
 
{
 
                       ----------------------------------------AQUÍ VA MI PROGRAMA -----------------------------------------------
 
}
 
 
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
 
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}
 
 
/*  This function is called by the Windows function DispatchMessage()  */
 
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}


Cuando uso printf() para sacar algo por pantalla, no sale nada. He probado a crear un fichero de texto con las letras del abecedario, y lo crea sin problemas, el programa corre bien. Pero todas las funciones que pruebo del tipo printf(), scanf(), etc. dan error de compilación o no producen ningún cambio en la pantalla. Lo que no se es como mostrar nada por pantalla, ni leer la posición del ratón, ni el teclado...
El programa es un simple cronómetro. Para escribir voy a usar una rutina que tengo para caracteres 8x8 y solo usa la de función de pixel. Pero....
¿Donde se encuentran las funciones para hacer lo siguiente?

- Mostrar un pixel. (La clásica función llamada con X, Y, ColorRGB24)
- Leer el teclado (sin esperar ENTER, que de el código de la tecla pulsada o NULL si no hay tecla pulsada)
- Obtener la posición actual del ratón. (típica que devuelve X e Y en una estructura, o actualiza las variables globales)
Comprobar si está pulsado el botón derecho. (típica que devuelve bool)
Comprobar si está pulsado el botón izquierdo. (típica que devuelve bool)

No se que #includes se necesitan, ni que funciones hay, ni donde se pueden descargar, ni donde ver sus definiciones. Ni naa, Estoy perdido con el inglés.

Gracias por la ayuda. Toda será bienvenida.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de vangodp

¿Como dibujo y escribo en un proyecto Win32 GUI?

Publicado por vangodp (287 intervenciones) el 12/03/2015 23:07:55
No entiendo mucho de win32, pero lo que si se es que printf no es una función para imprimir cosas en la ventana de windows.

Algo parecido pasa cuando uso una ventana de WindowsRender utilizando SFML, en ese caso tengo 2 ventanas, la windows render que me permite mostrar imágenes etc etc, y aparte me abre la consola de toda la vida, donde puedo obtener información extra de cuantos fps va el juego, o alguna información que me guste tener en vista en todo momento, pero realmente ni printf ni cout están echas para imprimir en esas ventanas 'especiales'.

Para que te hagas una idea cout quiere decir "console out" y printf quiere decir "print format", cout es la versión de printf para C++, en teoría ambas hacen lo mismo aun que tienen algunas diferencias.

Seguramente haya alguna función especial que es la que se usa para imprimir en esa ventana.

Te aconsejo que te cambies a codeblocks. ¿La razón? Es que en codeblocks tienes la posibilidad de hacer aparecer o no ambas ventanas. Y también tienes la posibilidad de configurar tu proyecto de mejor forma que devc++.

Codeblocks es infinitamente mejor que dev, no quería aceptarlo yo tampoco pero es así, el programa ofrece un mínimo indispensable para un programador poder trabajar.

Si quieres probar codeblocks pero no te atreves porque te parece algo lioso/complicado, yo te puedo ayudar a que te hagas el traspaso.

Me puedes agregar en skype para que te explique como configurarlo a tu medida.

Por cierto en skype me llamo igual.

Suerte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

¿Como dibujo y escribo en un proyecto Win32 GUI?

Publicado por Xajorkith (2 intervenciones) el 12/03/2015 23:59:29
Suponía que el motivo era que printf() no es para windows, el cout<< ni lo recordaba ya. Yo lo único que necesito es esto:

#include...... Los que hagan falta....

y las funciones, definiciones, estructuras, etc., para implementarlas en mi aplicación.

para poder:
- Abrir la ventana de la aplicación, la genérica de cualquier aplicación de windows.
- Imprimir un pixel, con el color que yo quiera.
- Leer la posición del ratón, botones pulsados s/n.
- Leer el código de la última tecla pulsada o NULL si no se ha pulsado ninguna tecla.

Para el resto ya me apaño. No hace falta sustituir printf() por el equivalente para Win32 por que ya tengo yo una rutina que imprime caracteres. Pero me hace falta el equivalente al putpuixel() del C de MSDOS, creo que era putpixel(). Y para saber si se pincha en algún cuadrito que enmarca una opción necesito la función del ratón. Y para saber si se elige una opción que pueda ir de la 'A' a la 'J', necesito la función para comprobar si se ha pulsado el teclado.

Yo pensaba que sería lo básico implementado en un programa genérico para windows. ¿De que sirve un ejemplo que solo muestra una ventana en el escritorio? En fin... Yo habría puesto algo más colorido. :)

Echaré un vistazo al codeblocks a ver que tiene.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

¿Como dibujo y escribo en un proyecto Win32 GUI?

Publicado por vangodp (287 intervenciones) el 13/03/2015 18:03:09
Lo siento amigo, como te dije no se nada de win32, todo lo gráfico lo hago con SFML, es prácticamente lo mismo pero creo que algo mas portable y esta orientado a crear juegos que es lo mio.

Debes buscar una buena guía para eso. Aquí te dejo una que aun que un poco antigua quizás te sirva: http://winapi.conclase.net/curso/index.php?cap=000#inicio
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar