Ir a contenido

PURCHASE MEMBERSHIP AT A 25% DISCOUNT Apply here

GET 1 MONTH OF MEMBERSHIP BY CHOOSING THE NEW NAME OF OUR COMPANY! Apply here


Photo

[c++] Form con la Win32 API


      
[c++] Form con la Win32 API TvOToho[c++] Form con la Win32 API TvOToho
[c++] Form con la Win32 API

CrazyFrog98
#1

CrazyFrog98
  • CrazyFrog98
  • member
  • Mensajes :
    27
  • Reputación :
    2
  • Points :
    0
  • Registrado :
    2012-08-10
//Antes que nada avisar de que este tutorial está hecho exclusivamente para la creación de formularios mediante la Win32 API
//Existen más métodos mucho más sencillos como el uso de las librerías QT


Buenas, este es el primero de una futura y probable serie de tutoriales :roll:  para crear formularios en c++
En este primer ejemplo crearemos solo el formulario y le añadiremos una Label.

@Para empezar debemos crear nuestro "Empty Project" en c++ con Visual Studio y añadir un archivo cpp
//Aclarar que es necesario el compilador de VS porque es muy probable que use en el futuro comandos que solo este compilador lea
Creación:

@Una vez este creado, toca incluir la header de Windows
//Cuidado con el orden de inclusión, ponerla antes o después de otros includes puede causar errores innecesarios
---->[You must be registered and logged in to see this image.]
!Como supongo que añadireis funciones de vuestro código, para los que no sepais donde ponerlas una vez tengais creado el formulario decirles que pueden añadirlo después de incluir todos los headers y antes del paso que viene ahora

@Ahora añadimos una sección de código muy importante y que va relacionado con los parámetros del formulario
//No lo detallo mucho porque realmente no importa mucho
---->[You must be registered and logged in to see this image.]
!Como podéis ver, añado un static char al que llamo title y donde pongo el título del formulario, este después es añadido a la form al crearla así que si queréis podéis borrar esa constante o usarla.

@En esta parte añadimos la creación de la ventana en si, con sus dimensiones, título y localización
//He añadido un pedazo de código un poco grande porque realmente no se ha de modificar mucho del mismo para lo que haremos
---->[You must be registered and logged in to see this image.]
!Las variables pueden ser editadas(las de debajo de los includes) y pueden ser añadidos directamente en el código

@Por último, añadimos lo que va dentro de la ventana
//Cualquier duda podéis dejarlo en un mensaje debajo en los comentarios
---->[You must be registered and logged in to see this image.]
!Las variables pueden ser editadas y pueden ser añadidos directamente en el código

Aquí teneis una muestra en GIF:
[You must be registered and logged in to see this image.]

Por último os adjunto el código para que lo podáis añadir más rápidamente.

Code:
#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

//Title
static char *title = TEXT("Form by CrazyFrog98 visit hs4l.foroes.org for more");
//Donde se crea la ventana
static int xlocstart = 700;
static int ylocstart = 200;
//Tamaño de esta
static int sizeofx = 470;
static int sizeofy = 458;


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG  msg;
WNDCLASS wc = { 0 };
wc.lpszClassName = title; //title = Título del formulario \\ Usar TEXT("Titutlo") en vez de title si se decea
wc.hInstance = hInstance;
wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
wc.lpfnWndProc = WndProc;
wc.hCursor = LoadCursor(0, IDC_ARROW);


RegisterClass(&wc);
CreateWindow(wc.lpszClassName, title,
WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPEDWINDOW,
xlocstart, ylocstart, sizeofx, sizeofy, 0, 0, hInstance, 0); //Cada elemento identificado arriba, pueden ponerse en el propio código si se desea

while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

switch (msg)
{
case WM_CREATE:
{

//Start Action -- Aquí podemos añadir una acción al iniciar el programa
//Ejemplo:
MessageBox(0, "Mensaje de Bienvenida", "Título del mensaje", MB_OK); //También se puede en vez de MB_OK colocar MB_ABORTRETRYIGNORE MB_CANCELTRYCONTINUE

//Aquí añadimos los elementos dentro del formulario
//En este caso un Label

//Empezamos con su localización:
static int xloclabel = 100;
static int yloclabel = 100;
static int xsizelabel = 150;
static int ysizelabel = 25;

//Load Label1
CreateWindowW(L"Static", L"Esto es un mensaje", // L"Static" no debe ser tocado, pero lo de la derecha es el texto
WS_CHILD | WS_VISIBLE, //Siempre tiene que ser CHILD(hijo del formulario) y visible(si queremos que se vea xD)
xloclabel, yloclabel, xsizelabel, ysizelabel, //Aquí van dimensiones de el label y loc. del label(Recomiendo modificar hasta que se vea todo) XD
hwnd, (HMENU)1, NULL, NULL); //Lo que hay despues de HMENU es la ID del elemento, importante para "trabajar" con el elemento más adelante.

break;
}

case WM_COMMAND:
{
//Por ahora no hay que tocar aquí
break;
}

case WM_DESTROY:
{
//Aquí se destruye el form
PostQuitMessage(0);
break;
}
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}



Un saludo y gracias por vuestra atención  :super:
Espero poder continuar con el tutorial pronto y mostraros todas las posibilidades de la win32 api.
Bye y espero no haber podido estar recientemente, he tenido problemas escolares  :lol!:

CrazyFrog98
#2

CrazyFrog98
  • CrazyFrog98
  • member
  • Mensajes :
    27
  • Reputación :
    2
  • Points :
    0
  • Registrado :
    2012-08-10
Ya vimos como crear un label dentro de el form, recordemos que esté tenía por ID 1
Ahora crearemos debajo de este un botón con ID 2 y lo vamos a hacer funcionar smid_4

Primero retomemos el código del form:

Code:
#include <windows.h>


LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

//Title
static char *title = TEXT("Form by CrazyFrog98 visit hs4l.foroes.org for more");
//Donde se crea la ventana
static int xlocstart = 700;
static int ylocstart = 200;
//Tamaño de esta
static int sizeofx = 470;
static int sizeofy = 458;


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG  msg;
WNDCLASS wc = { 0 };
wc.lpszClassName = title; //title = Título del formulario \\ Usar TEXT("Titutlo") en vez de title si se decea
wc.hInstance = hInstance;
wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
wc.lpfnWndProc = WndProc;
wc.hCursor = LoadCursor(0, IDC_ARROW);


RegisterClass(&wc);
CreateWindow(wc.lpszClassName, title,
WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPEDWINDOW,
xlocstart, ylocstart, sizeofx, sizeofy, 0, 0, hInstance, 0); //Cada elemento identificado arriba, pueden ponerse en el propio código si se desea

while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

switch (msg)
{
case WM_CREATE:
{

//Start Action -- Aquí podemos añadir una acción al iniciar el programa
//Ejemplo:
MessageBox(0, "Mensaje de Bienvenida", "Título del mensaje", MB_OK); //También se puede en vez de MB_OK colocar MB_ABORTRETRYIGNORE MB_CANCELTRYCONTINUE

//Aquí añadimos los elementos dentro del formulario
//En este caso un Label

//Empezamos con su localización:
static int xloclabel = 100;
static int yloclabel = 100;
static int xsizelabel = 150;
static int ysizelabel = 25;

//Load Label1
CreateWindowW(L"Static", L"Esto es un mensaje", // L"Static" no debe ser tocado, pero lo de la derecha es el texto
WS_CHILD | WS_VISIBLE, //Siempre tiene que ser CHILD(hijo del formulario) y visible(si queremos que se vea xD)
xloclabel, yloclabel, xsizelabel, ysizelabel, //Aquí van dimensiones de el label y loc. del label(Recomiendo modificar hasta que se vea todo) XD
hwnd, (HMENU)1, NULL, NULL); //Lo que hay despues de HMENU es la ID del elemento, importante para "trabajar" con el elemento más adelante.

break;
}

case WM_COMMAND:
{
//Por ahora no hay que tocar aquí
break;
}

case WM_DESTROY:
{
//Aquí se destruye el form
PostQuitMessage(0);
break;
}
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}


Nos centraremos en este punto:

[You must be registered and logged in to see this image.]

Fijaros que CreateWindowW es una forma de crear un elemento dentro del formulario que sea Child del anterior, y que "Static" es la forma de decirle a el compilador que es un Label.

Ahora pasaré a daros el código del Botón con ID 2 y el resultado es este:

[You must be registered and logged in to see this image.]

Y en el Formulario se vería así:

[You must be registered and logged in to see this image.]

Ahora que ya tenemos el botón creado, queda asignarle los eventos y para ello vamos a esta sección de código:

[You must be registered and logged in to see this image.]

Y lo sustituimos:

[You must be registered and logged in to see this image.]

Y este sería el resultado en ejecución:

[You must be registered and logged in to see this image.]

Y finalmente os dejo el código:


Code:
#include <windows.h>


LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

//Title
static char *title = TEXT("Form by CrazyFrog98 visit hs4l.foroes.org for more");
//Donde se crea la ventana
static int xlocstart = 700;
static int ylocstart = 200;
//Tamaño de esta
static int sizeofx = 470;
static int sizeofy = 458;


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
 LPSTR lpCmdLine, int nCmdShow)
{
 MSG  msg;
 WNDCLASS wc = { 0 };
 wc.lpszClassName = title; //title = Título del formulario \\ Usar TEXT("Titutlo") en vez de title si se decea
 wc.hInstance = hInstance;
 wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
 wc.lpfnWndProc = WndProc;
 wc.hCursor = LoadCursor(0, IDC_ARROW);


 RegisterClass(&wc);
 CreateWindow(wc.lpszClassName, title,
 WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPEDWINDOW,
 xlocstart, ylocstart, sizeofx, sizeofy, 0, 0, hInstance, 0); //Cada elemento identificado arriba, pueden ponerse en el propio código si se desea

 while (GetMessage(&msg, NULL, 0, 0)) {
 TranslateMessage(&msg);
 DispatchMessage(&msg);
 }
 return (int)msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

 switch (msg)
 {
 case WM_CREATE:
 {

 //Start Action -- Aquí podemos añadir una acción al iniciar el programa
 //Ejemplo:
 MessageBox(0, "Mensaje de Bienvenida", "Título del mensaje", MB_OK); //También se puede en vez de MB_OK colocar MB_ABORTRETRYIGNORE MB_CANCELTRYCONTINUE

 //Aquí añadimos los elementos dentro del formulario
 //En este caso un Label

 //Empezamos con su localización:
 static int xloclabel = 100;
 static int yloclabel = 100;
 static int xsizelabel = 150;
 static int ysizelabel = 25;

 //Load Label1
 CreateWindowW(L"Static", L"Esto es un mensaje", // L"Static" no debe ser tocado, pero lo de la derecha es el texto
 WS_CHILD | WS_VISIBLE, //Siempre tiene que ser CHILD(hijo del formulario) y visible(si queremos que se vea xD)
 xloclabel, yloclabel, xsizelabel, ysizelabel, //Aquí van dimensiones de el label y loc. del label(Recomiendo modificar hasta que se vea todo) XD
 hwnd, (HMENU)1, NULL, NULL); //Lo que hay despues de HMENU es la ID del elemento, importante para "trabajar" con el elemento más adelante.

 //Load Buttom1
 CreateWindowEx(WS_EX_APPWINDOW, TEXT("button"), TEXT("Un Botón"), //Como veis el código cambia un poco, aquí solo hemos de editar el "Un Botón" que será lo visible
 WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
 xloclabel, yloclabel + 50, 110, 25, //La localización x no la cambiaremos con respecto a la Label, pero si la Y para que se vean ambos
 hwnd, (HMENU)2, ((LPCREATESTRUCT)lParam)->hInstance, NULL); //ID 2

 break;
 }

 case WM_COMMAND: //Detecta evento en ejecución
 {
 
 switch (wParam) //Usamos el parámetro ID para detectar su procedencia
 {

 case 2: //En caso de que la ID de el elemento en ejecución sea 2
 {
 //Acción a realizar
 //DoSomething();
 MessageBox(0, "OK", "OK", MB_OK);
 return true; //<<---Necesario cada vez
 }

 case 3: //Otro ejemplo sin uso porque no hay ningún elemento con ID 3
 {
 //No pasará nada
 return true; //<<---Necesario cada vez
 }

 }

 break;
 }

 case WM_DESTROY:
 {
 //Aquí se destruye el form
 PostQuitMessage(0);
 break;
 }
 }
 return DefWindowProc(hwnd, msg, wParam, lParam);
}



Bye y hasta otra!

CrazyFrog98
#3

CrazyFrog98
  • CrazyFrog98
  • member
  • Mensajes :
    27
  • Reputación :
    2
  • Points :
    0
  • Registrado :
    2012-08-10
Dejo espacio para un tuto mas

ZzcarloszZ
#4

ZzcarloszZ
  • ZzcarloszZ
  • administrator
  • Mensajes :
    625
  • Reputación :
    220
  • Points :
    6
  • Registrado :
    2012-08-08
Buen post, Win32 es muy interesante lastima que algunos no les agrade simplemente porque tienen que hacer la gui manualmente y/o no prefieren usar los dialogos propios del vs. smid_1

CrazyFrog98
#5

CrazyFrog98
  • CrazyFrog98
  • member
  • Mensajes :
    27
  • Reputación :
    2
  • Points :
    0
  • Registrado :
    2012-08-10
Raon wrote:Buen post, Win32 es muy interesante lastima que algunos no les agrade simplemente porque tienen que hacer la gui manualmente y/o no prefieren usar los dialogos propios del vs. smid_1


Mucha razón, y gracias por to apoyo :joker:

alexmen10
#6

alexmen10
  • alexmen10
  • administrator
  • Status :
    HS4L Team
  • Mensajes :
    418
  • Reputación :
    257
  • Points :
    23
  • Registrado :
    2012-09-08
Estaba muy desocupado, muy buen hilo con tu explicación ya que este tema es interesante y tienes todos mis respetos.
Recomiendo usar "MFC" que tiene su propio editor algo parecido a .NET y es sencillo y lo mejor de todo es que trabajas con C++.
también creo que si trabajas con MFC trabajaras muchísimo mejor, ahorra tiempo y su editor acomoda muy bien a las funciones xD

CrazyFrog98
#7

CrazyFrog98
  • CrazyFrog98
  • member
  • Mensajes :
    27
  • Reputación :
    2
  • Points :
    0
  • Registrado :
    2012-08-10
alexmen10 wrote:Estaba muy desocupado, muy buen hilo con tu explicación ya que este tema es interesante y tienes todos mis respetos.
Recomiendo usar "MFC" que tiene su propio editor algo parecido a .NET y es sencillo y lo mejor de todo es que trabajas con C++.
también creo que si trabajas con MFC trabajaras muchísimo mejor, ahorra tiempo y su editor acomoda muy bien a las funciones xD



Mmm.. Parece interesante, pero a que te refieres con MFC? Me interesa bastante la idea xD

Seyer
#8

Seyer
  • Seyer
  • administrator
  • Status :
    HS4L Team
  • Mensajes :
    692
  • Reputación :
    64
  • Points :
    2
  • Registrado :
    2012-08-09
[You must be registered and logged in to see this link.]: inactividad del post.

Sponsored content
#9

Sponsored content

      

Create an account or log in to leave a reply

You need to be a member in order to leave a reply.

Create an account

Join our community by creating a new account. It's easy!


Create a new account

Log in

Already have an account? No problem, log in here.


Log in
You cannot reply to topics in this forum
Staff online
Sponsors
  •  TOTAL POSTS
  •  TOTAL MEMBERS
  •  NEWEST MEMBER