Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-04-2018
REHome REHome is offline
Miembro
 
Registrado: jul 2003
Ubicación: España
Posts: 472
Poder: 22
REHome Va por buen camino
¿Cómo redimensionar el formulario e incluir dos botones en él?

Hola:

Antes que nada, si no puedes ver las capturas, actualiza el navegador.

He creado un formulario con Windows Form (Win32). Quiero añadir en él dos botones. Por ahora he hecho esto.

Paso 1:


Paso 2:


Pado 3:


Se me genera códigos pero no se ve el formulario. Lo que demuestra se un engorro programar así hoy en día, pero hay empresas que si programan así y enseñan en algunas universidades les gusten a los alumnos o no.

Paso 4:


Aquí lo dejo el formulario como si fuese por defeto 300x300 pero en realidad es muy grande para mi gusto.

Quiero hacer dos cosas. Poner el tamaño del formulario a 300 x 300 y introducir 2 botones. Quiero hacer.

Un botón se llama: Abrir y el otro Cerrar.

Encontré dos enlaces para hacer un botón.
https://msdn.microsoft.com/es-es/lib...or=-2147217396

https://msdn.microsoft.com/es-es/library/a1yzfz6d.aspx

¿Cómo se hace?

No tengo ni la grandísima idea de hacerlo, ya que al compilar, a pesar de no haber errores, ni redimensiona o pone el tamaño que quiero al formulario, ni hay ni un solo botón en dicho formumalario.

El trozo de código a incluir es este.
Código:
   hInst = hInstance; // Almacenar identificador de instancia en una variable global
 
   HWND hWnd = CreateWindowW(
	   szWindowClass, 
	   szTitle, 
	   WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
	   0, 
	   CW_USEDEFAULT, 
	   0, 
	   nullptr, 
	   nullptr, 
	   hInstance, 
	   nullptr);
 
   if (!hWnd)
   {
      return FALSE;
   }
 
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
 
   return TRUE; // me estas vacilando o algo asi?
 
   // ######################################################################
   hInst = hInstance; // Almacenar identificador de instancia en una variable global
 
   HWND hWnd2 = CreateWindowW(
	   szWindowClass,
	   szTitle,
	   WS_OVERLAPPEDWINDOW,
	   CW_USEDEFAULT,
	   0,
	   CW_USEDEFAULT,
	   0,
	   nullptr,
	   nullptr,
	   hInstance,
	   nullptr);
 
   if (!hWnd2)
   {
	   return FALSE;
   }
 
   ShowWindow(hWnd2, nCmdShow);
   UpdateWindow(hWnd2);
   // AQUI POR EJEMPLO!!! posición(100,100), tamaño(600,400)
   SetWindowPos(hWnd2, 0, 100, 100, 600, 400, NULL);
 
   return TRUE;
   // ######################################################################
Código completo es este pero no funciona a pesar de compilar bien.
Código:
#include "stdafx.h"
#include "aaaa.h"

#define MAX_LOADSTRING 100

// Variables globales:
HINSTANCE hInst;                                // Instancia actual
WCHAR szTitle[MAX_LOADSTRING];                  // Texto de la barra de título
WCHAR szWindowClass[MAX_LOADSTRING];            // nombre de clase de la ventana principal

// Declaraciones de funciones adelantadas incluidas en este módulo de código:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: colocar código aquí.

    // Inicializar cadenas globales
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_AAAA, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // Realizar la inicialización de la aplicación:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_AAAA));

    MSG msg;

    // Bucle principal de mensajes:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}



//
//  FUNCIÓN: MyRegisterClass()
//
//  PROPÓSITO: registrar la clase de ventana.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_AAAA));
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_AAAA);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);
}

//
//   FUNCIÓN: InitInstance(HINSTANCE, int)
//
//   PROPÓSITO: guardar el identificador de instancia y crear la ventana principal
//
//   COMENTARIOS:
//
//        En esta función, se guarda el identificador de instancia en una variable común y
//        se crea y muestra la ventana principal del programa.
//


   // ######################################################################
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{ // de verdad esto es serio?
	hInst = hInstance; // Almacenar identificador de instancia en una variable global

	HWND hWnd = CreateWindowW(
		szWindowClass,
		szTitle,
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		0,
		CW_USEDEFAULT,
		0,
		nullptr,
		nullptr,
		hInstance,
		nullptr);

	if (!hWnd)
	{
		return FALSE;
	}

	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);

	return TRUE; // me estas vacilando o algo asi?

				 // ######################################################################
	hInst = hInstance; // Almacenar identificador de instancia en una variable global

	HWND hWnd2 = CreateWindowW(
		szWindowClass,
		szTitle,
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		0,
		CW_USEDEFAULT,
		0,
		nullptr,
		nullptr,
		hInstance,
		nullptr);

	if (!hWnd2)
	{
		return FALSE;
	}

	ShowWindow(hWnd2, nCmdShow);
	UpdateWindow(hWnd2);
	// AQUI POR EJEMPLO!!! posición(100,100), tamaño(600,400)
	SetWindowPos(hWnd2, 0, 50, 50, 100, 100, NULL);

	return TRUE;
	// ######################################################################
}
   // ######################################################################


//
//  FUNCIÓN: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PROPÓSITO:  procesar mensajes de la ventana principal.
//
//  WM_COMMAND  - procesar el menú de aplicaciones
//  WM_PAINT    - Pintar la ventana principal
//  WM_DESTROY  - publicar un mensaje de salida y volver
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // Analizar las selecciones de menú:
            switch (wmId)
            {
            case IDM_about:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: Agregar cualquier código de dibujo que use hDC aquí...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// Controlador de mensajes del cuadro Acerca de.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

Saludos.

PD: La verdad, no sabía que fuera tan coñazo, pesado, complicado en hacer lo que estoy pidiendo.
__________________
http://electronica-pic.blogspot.com....n-arduino.html Manuales de electrónica general, PIC y Arduino.
Responder Con Cita
  #2  
Antiguo 09-04-2018
Avatar de _Leo
_Leo _Leo is offline
Miembro
 
Registrado: ene 2017
Ubicación: Lanzarote (Islas Canarias)
Posts: 38
Poder: 0
_Leo Va camino a la fama
Cita:
Empezado por REHome Ver Mensaje
Se me genera códigos pero no se ve el formulario. Lo que demuestra se un engorro programar así hoy en día, pero hay empresas que si programan así y enseñan en algunas universidades les gusten a los alumnos o no.
Suerte tienen a los que les enseñen esto (o se tomen el tiempo de aprenderlo), ya que es precisamente lo que le cuesta más a los programadores actuales, que con tanta abstracción/frameworks al final no saben qué es esto lo que está por debajo, y es bueno conocerlo creo yo.

Tienes más formas de hacerlo en VC++ (ya que las capturas que pones son de ese compilador), pero te pongo la que intentas.. para no complicarlo solo he modificado el archivo "aaaa.cpp" que veo que en tus capturas es el archivo principal del proyecto, es el código que genera el asistente que has usado, y las líneas que yo he añadido o modificado comienzan por /*>*/

Te pongo una captura del resultado para que veas si es lo que necesitas:



Código PHP:
// aaaa.cpp: define el punto de entrada de la aplicación.
//

#include "stdafx.h"
#include "aaaa.h"

#define MAX_LOADSTRING 100

/*>*/ #define IDC_BUTTON_1 201
/*>*/ #define IDC_BUTTON_2 202

// Variables globales:
HINSTANCE hInst;                                // Instancia actual
WCHAR szTitle[MAX_LOADSTRING];                  // Texto de la barra de título
WCHAR szWindowClass[MAX_LOADSTRING];            // nombre de clase de la ventana principal

// Declaraciones de funciones adelantadas incluidas en este módulo de código:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCEint);
LRESULT CALLBACK    WndProc(HWNDUINTWPARAMLPARAM);
INT_PTR CALLBACK    About(HWNDUINTWPARAMLPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     
_In_opt_ HINSTANCE hPrevInstance,
                     
_In_ LPWSTR    lpCmdLine,
                     
_In_ int       nCmdShow)
{
    
UNREFERENCED_PARAMETER(hPrevInstance);
    
UNREFERENCED_PARAMETER(lpCmdLine);

    
// TODO: colocar código aquí.

    // Inicializar cadenas globales
    
LoadStringW(hInstanceIDS_APP_TITLEszTitleMAX_LOADSTRING);
    
LoadStringW(hInstanceIDC_AAAAszWindowClassMAX_LOADSTRING);
    
MyRegisterClass(hInstance);

    
// Realizar la inicialización de la aplicación:
    
if (!InitInstance (hInstancenCmdShow))
    {
        return 
FALSE;
    }

    
HACCEL hAccelTable LoadAccelerators(hInstanceMAKEINTRESOURCE(IDC_AAAA));

    
MSG msg;

    
// Bucle principal de mensajes:
    
while (GetMessage(&msgnullptr00))
    {
        if (!
TranslateAccelerator(msg.hwndhAccelTable, &msg))
        {
            
TranslateMessage(&msg);
            
DispatchMessage(&msg);
        }
    }

    return (int) 
msg.wParam;
}


//
//  FUNCIÓN: MyRegisterClass()
//
//  PROPÓSITO: registrar la clase de ventana.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    
WNDCLASSEXW wcex;

    
wcex.cbSize sizeof(WNDCLASSEX);

    
wcex.style          CS_HREDRAW CS_VREDRAW;
    
wcex.lpfnWndProc    WndProc;
    
wcex.cbClsExtra     0;
    
wcex.cbWndExtra     0;
    
wcex.hInstance      hInstance;
    
wcex.hIcon          LoadIcon(hInstanceMAKEINTRESOURCE(IDI_AAAA));
    
wcex.hCursor        LoadCursor(nullptrIDC_ARROW);
    
wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    
wcex.lpszMenuName   MAKEINTRESOURCEW(IDC_AAAA);
    
wcex.lpszClassName  szWindowClass;
    
wcex.hIconSm        LoadIcon(wcex.hInstanceMAKEINTRESOURCE(IDI_SMALL));

    return 
RegisterClassExW(&wcex);
}

//
//   FUNCIÓN: InitInstance(HINSTANCE, int)
//
//   PROPÓSITO: guardar el identificador de instancia y crear la ventana principal
//
//   COMENTARIOS:
//
//        En esta función, se guarda el identificador de instancia en una variable común y
//        se crea y muestra la ventana principal del programa.
//
BOOL InitInstance(HINSTANCE hInstanceint nCmdShow)
{
   
hInst hInstance// Almacenar identificador de instancia en una variable global

/*>*/ 
HWND hWnd CreateWindowW(szWindowClassszTitleWS_OVERLAPPED WS_SYSMENU WS_MINIMIZEBOX,
/*>*/                             CW_USEDEFAULT0300300nullptrnullptrhInstancenullptr);

   if (!
hWnd)
   {
      return 
FALSE;
   }

   
ShowWindow(hWndnCmdShow);
   
UpdateWindow(hWnd);

   return 
TRUE;
}

//
//  FUNCIÓN: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PROPÓSITO:  procesar mensajes de la ventana principal.
//
//  WM_COMMAND  - procesar el menú de aplicaciones
//  WM_PAINT    - Pintar la ventana principal
//  WM_DESTROY  - publicar un mensaje de salida y volver
//
//
LRESULT CALLBACK WndProc(HWND hWndUINT messageWPARAM wParamLPARAM lParam)
{
    switch (
message)
    {
/*>*/ case WM_CREATE:
/*>*/    CreateWindowEx(0L"BUTTON"L"Botón 1"WS_CHILD WS_VISIBLE,
/*>*/        1050130130hWnd, (HMENU)IDC_BUTTON_1hInstnullptr);
/*>*/    CreateWindowEx(0L"BUTTON"L"Botón 2"WS_CHILD WS_VISIBLE,
/*>*/        14550130130hWnd, (HMENU)IDC_BUTTON_2hInstnullptr);
/*>*/    break;
    case 
WM_COMMAND:
        {
            
int wmId LOWORD(wParam);
            
// Analizar las selecciones de menú:
            
switch (wmId)
            {
/*>*/        case IDC_BUTTON_1:
/*>*/            MessageBox(hWndL"Botón 1 pulsado"L"Ejemplo"MB_OK MB_ICONINFORMATION);
/*>*/            break;
/*>*/        case IDC_BUTTON_2:
/*>*/            MessageBox(hWndL"Botón 2 pulsado"L"Ejemplo"MB_OK MB_ICONINFORMATION);
/*>*/            break;
            case 
IDM_ABOUT:
                
DialogBox(hInstMAKEINTRESOURCE(IDD_ABOUTBOX), hWndAbout);
                break;
            case 
IDM_EXIT:
                
DestroyWindow(hWnd);
                break;
            default:
                return 
DefWindowProc(hWndmessagewParamlParam);
            }
        }
        break;
    case 
WM_PAINT:
        {
            
PAINTSTRUCT ps;
            
HDC hdc BeginPaint(hWnd, &ps);
            
// TODO: Agregar cualquier código de dibujo que use hDC aquí...
            
EndPaint(hWnd, &ps);
        }
        break;
    case 
WM_DESTROY:
        
PostQuitMessage(0);
        break;
    default:
        return 
DefWindowProc(hWndmessagewParamlParam);
    }
    return 
0;
}

// Controlador de mensajes del cuadro Acerca de.
INT_PTR CALLBACK About(HWND hDlgUINT messageWPARAM wParamLPARAM lParam)
{
    
UNREFERENCED_PARAMETER(lParam);
    switch (
message)
    {
    case 
WM_INITDIALOG:
        return (
INT_PTR)TRUE;

    case 
WM_COMMAND:
        if (
LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            
EndDialog(hDlgLOWORD(wParam));
            return (
INT_PTR)TRUE;
        }
        break;
    }
    return (
INT_PTR)FALSE;

Cita:
Empezado por REHome Ver Mensaje
La verdad, no sabía que fuera tan coñazo, pesado, complicado en hacer lo que estoy pidiendo.
No es que sea complicado, es que lo estas preguntando en un foro sobre C++Builder, y precisamente la gracia de este es evitar estas "complicaciones" ;-)

Tienes una versión de C++Builder gratuita llamada "Starter", trae menos cosas que la de pago, pero es totalmente funcional (no es una demo):

https://www.embarcadero.com/es/produ...uilder/starter

Última edición por _Leo fecha: 09-04-2018 a las 20:19:37.
Responder Con Cita
  #3  
Antiguo 10-04-2018
REHome REHome is offline
Miembro
 
Registrado: jul 2003
Ubicación: España
Posts: 472
Poder: 22
REHome Va por buen camino
Buenas:

He hecho partes siguiendo tus consejos más lo que he encontrado por internet. Al menos ya me crea los botones y un label. He empezado todo otra vez.


Lo que me falta es añadir comandos, tanto como escribir mensajes en dicho label que es un STATIC, no EDIT que también funciona.

Cita:
Si pulso un botón Abrir, lo que hace es esto.
Mensaje = Abriendo...
// Está abriendo la bandeja del lector.
mciSendString("set CDAudio door open", rt, 127, IntPtr::Zero);
Mensaje = Abierto.
// Cuando ya abrió del todo la bandeja.
Antes que nada hay que configurar.




Código completo hasta ahora es este. Muestra los botones pero no se mostrar los mensajes que dije arriba ni abrir ni cerrar l abandeja del lector.
Código:
#include "stdafx.h"
#include "Bandeja_Form_Win32_cpp.h"
#include "mmsystem.h" // No olvidar.

#define MAX_LOADSTRING 100
#define IDC_BUTTON_1 201 // No olvidar.
#define IDC_BUTTON_2 202 // No olvidar.
#define IDC_STATIC_1 303 // No olvidar.

// Variables globales:
HINSTANCE hInst;                                // Instancia actual
WCHAR szTitle[MAX_LOADSTRING];                  // Texto de la barra de título
WCHAR szWindowClass[MAX_LOADSTRING];            // nombre de clase de la ventana principal

// Declaraciones de funciones adelantadas incluidas en este módulo de código:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: colocar código aquí.

    // Inicializar cadenas globales
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_BANDEJAFORMWIN32CPP, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // Realizar la inicialización de la aplicación:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_BANDEJAFORMWIN32CPP));

    MSG msg;

    // Bucle principal de mensajes:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}



//
//  FUNCIÓN: MyRegisterClass()
//
//  PROPÓSITO: registrar la clase de ventana.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_BANDEJAFORMWIN32CPP));
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_BANDEJAFORMWIN32CPP);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);
}

//
//   FUNCIÓN: InitInstance(HINSTANCE, int)
//
//   PROPÓSITO: guardar el identificador de instancia y crear la ventana principal
//
//   COMENTARIOS:
//
//        En esta función, se guarda el identificador de instancia en una variable común y
//        se crea y muestra la ventana principal del programa.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // Almacenar identificador de instancia en una variable global

   // ################################################################### Begin.
   // Redimensionar formulario a 300 x 300.
   HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, CW_USEDEFAULT, 300, 300, nullptr, nullptr, hInstance, nullptr);
   // #################################################################### End.

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  FUNCIÓN: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PROPÓSITO:  procesar mensajes de la ventana principal.
//
//  WM_COMMAND  - procesar el menú de aplicaciones
//  WM_PAINT    - Pintar la ventana principal
//  WM_DESTROY  - publicar un mensaje de salida y volver
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
		// ################################################################### Begin.
		// Crear botones Abrir y Cerrar.
	case WM_CREATE:
	{
		HWND btnOK = CreateWindowW(
			L"BUTTON",		// Clase del control.
			L"Abrir",		// Etiqueta del botón.
			WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE, // Estilo del control. La clase button puede ser checkbox, radio, etc.
			45, 135,		// Posición respecto del client area del parent.
			75, 23,			// Dimensiones del control.
			hWnd,			// --> Este es el handle de la ventana principal.
			(HMENU)201,		// Este es el identificador del control. De modo predefinido 1 = IDOK, 2 = IDCANCEL
			hInst,
			nullptr);

		HWND btnOK2 = CreateWindowW(
			L"BUTTON",		// Clase del control.
			L"Cerrar",		// Etiqueta del botón.
			WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE, // Estilo del control. La clase button puede ser checkbox, radio, etc.
			165, 135,		// Posición respecto del client area del parent.
			75, 23,			// Dimensiones del control.
			hWnd,			// --> Este es el handle de la ventana principal.
			(HMENU)202,		// Este es el identificador del control. De modo predefinido 1 = IDOK, 2 = IDCANCEL
			hInst,
			nullptr);

		// Label o etiqueta.
		HWND edit = CreateWindowW(
			L"STATIC",		// Clase del control.
			L"Hola.",		// Etiqueta del botón.
			WS_CHILD | SS_SIMPLE | WS_VISIBLE, // Estilo del control. La clase button puede ser checkbox, radio, etc.
			125, 55,		// Posición respecto del client area del parent.
			75, 23,			// Dimensiones del control.
			hWnd,			// --> Este es el handle de la ventana principal.
			(HMENU)303,		// Este es el identificador del control. De modo predefinido 1 = IDOK, 2 = IDCANCEL
			hInst,
			nullptr);
	}

	break;
	// #################################################################### End.

    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // Analizar las selecciones de menú:
            switch (wmId)
            {
			// #################################################################### Begin.
			case IDC_BUTTON_1:
				// MessageBox(hWnd, L"Botón 1 pulsado", L"Ejemplo", MB_OK | MB_ICONINFORMATION);

				// He añadido una etiqueta IDC_STATIC_1 con el id 303.
				// Mostrar mensaje Abriendo... al IDC_STATIC_1. Que es un label que está en
				// el formulario. Se muestra en el momento cuando está abriendo la bandeja.

				// Aquí quiero añadir este comando para que abra la bandeja del lector.
				// mciSendString("set CDAudio door open", rt, 127, IntPtr::Zero);

				// Mostrar mensaje Abierto. Que es cuando ya finalizó.
				break;
			case IDC_BUTTON_2:
				// Aquí quiero añadir este comando para que abra la bandeja del lector.
				// mciSendString("set CDAudio door closed", rt, 127, IntPtr::Zero);

				// Lo mismo que arriba.
				break;
			// #################################################################### End.
            case IDM_about:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: Agregar cualquier código de dibujo que use hDC aquí...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// Controlador de mensajes del cuadro Acerca de.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}
Tengo instalado el CBuilder Started C++ con Delphi 10.2. Por supuesto que le hecharé un ojo.

Nadie quiere programar con Win32 o siempre tirando de la API de Windows, ajjajajajajajja.

Saludos.
__________________
http://electronica-pic.blogspot.com....n-arduino.html Manuales de electrónica general, PIC y Arduino.
Responder Con Cita
  #4  
Antiguo 10-04-2018
Avatar de _Leo
_Leo _Leo is offline
Miembro
 
Registrado: ene 2017
Ubicación: Lanzarote (Islas Canarias)
Posts: 38
Poder: 0
_Leo Va camino a la fama
Para escribir en el STATIC:
Código PHP:
SetWindowText(GetDlgItem(hWndIDC_STATIC_1), L"Esto es una prueba"); 
Responder Con Cita
  #5  
Antiguo 10-04-2018
REHome REHome is offline
Miembro
 
Registrado: jul 2003
Ubicación: España
Posts: 472
Poder: 22
REHome Va por buen camino
Gracias.

He puesto este código. Lee los mensajes si o si de forma muy correcta. Probé este código de abajo para abrir la bandeja y da error al compilar.
Código:
				// #################################################################### Begin.
			case IDC_BUTTON_1:
				// MessageBox(hWnd, L"Botón 1 pulsado", L"Ejemplo", MB_OK | MB_ICONINFORMATION);
				// Mostrar mensaje.
				SetWindowText(GetDlgItem(hWnd, IDC_STATIC_1), L"Abriendo...  ");

				// Abrir bandeja del lector.
				mciSendString("set CDAudio door open", nullptr, 0, nullptr);

				// Mostrar mensaje Abierto. Que es cuando ya finalizó.
				SetWindowText(GetDlgItem(hWnd, IDC_STATIC_1), L"Abierto.     ");
				break;
			case IDC_BUTTON_2:
				// Mostrar mensaje.
				SetWindowText(GetDlgItem(hWnd, IDC_STATIC_1), L"Cerrando...  ");
				// Cerrar bandeja del lector.
				// mciSendString("set CDAudio closed open", nullptr, 0, nullptr);
				// Mostrar mensaje.
				SetWindowText(GetDlgItem(hWnd, IDC_STATIC_1), L"Cerrado.     ");
				break;
			// #################################################################### End.
Errores:
Gravedad Código Descripción Proyecto Archivo Línea Estado suprimido
Error (activo) E0167 un argumento de tipo "const char *" no es compatible con un parámetro de tipo "LPCWSTR" Bandeja_Form_Win32_cpp c:\Users\usuario\Documents\Visual Studio 2017\Projects\Bandeja_Form_Win32_cpp\Bandeja_Form_Win32_cpp\Bandeja_Form_Win32_cpp.cpp 201


Gravedad Código Descripción Proyecto Archivo Línea Estado suprimido
Error C2664 'MCIERROR mciSendStringW(LPCWSTR,LPWSTR,UINT,HWND)': el argumento 1 no puede convertirse de 'const char [22]' a 'LPCWSTR' Bandeja_Form_Win32_cpp c:\users\usuario\documents\visual studio 2017\projects\bandeja_form_win32_cpp\bandeja_form_win32_cpp\bandeja_form_win32_cpp.cpp 201
__________________
http://electronica-pic.blogspot.com....n-arduino.html Manuales de electrónica general, PIC y Arduino.
Responder Con Cita
  #6  
Antiguo 10-04-2018
Avatar de _Leo
_Leo _Leo is offline
Miembro
 
Registrado: ene 2017
Ubicación: Lanzarote (Islas Canarias)
Posts: 38
Poder: 0
_Leo Va camino a la fama
Te ha faltado añadir la L:
Código PHP:
mciSendString(L"set CDAudio door open"nullptr0nullptr);
              ^
              | 
Responder Con Cita
  #7  
Antiguo 10-04-2018
REHome REHome is offline
Miembro
 
Registrado: jul 2003
Ubicación: España
Posts: 472
Poder: 22
REHome Va por buen camino
Hola:

Ya se puede abrir y cerrar la bandeja del lector. Solo falta pulir dos detalles. Cambiar el tamaño de letras del texto y poner el formulario que al iniciarlo, se quede en el centro de la pantalla.

Cuando acabe todo esto, lo paso al CBuilder C++ Tokyo 10.2 que es que tengo instalado, ya en Delphi si funciona al 100 %.

Mirando el CBuilder C++ para probar el mismo ejemplo, pues estoy peor que con Visual Studio. Ni se com empezar.


Saludos.
__________________
http://electronica-pic.blogspot.com....n-arduino.html Manuales de electrónica general, PIC y Arduino.

Última edición por REHome fecha: 10-04-2018 a las 22:17:48.
Responder Con Cita
  #8  
Antiguo 10-04-2018
Avatar de _Leo
_Leo _Leo is offline
Miembro
 
Registrado: ene 2017
Ubicación: Lanzarote (Islas Canarias)
Posts: 38
Poder: 0
_Leo Va camino a la fama
Cita:
Empezado por REHome Ver Mensaje
...ya en Delphi si funciona al 100 %.

Mirando el CBuilder C++ para probar el mismo ejemplo, pues estoy peor que con Visual Studio. Ni se com empezar
En C++Builder es prácticamente idéntico que en Delphi, solo que en vez de Pascal con C++.. o sea, crear un proyecto, arrastrar un par de botones sobre el Form etc...
Responder Con Cita
  #9  
Antiguo 12-04-2018
REHome REHome is offline
Miembro
 
Registrado: jul 2003
Ubicación: España
Posts: 472
Poder: 22
REHome Va por buen camino
Eso lo se.
¿Dónde se pone el Winmm.lib en CBuilder C++?
Arriba está dicho y con capturas en Visual Studio.
__________________
http://electronica-pic.blogspot.com....n-arduino.html Manuales de electrónica general, PIC y Arduino.
Responder Con Cita
  #10  
Antiguo 12-04-2018
Avatar de _Leo
_Leo _Leo is offline
Miembro
 
Registrado: ene 2017
Ubicación: Lanzarote (Islas Canarias)
Posts: 38
Poder: 0
_Leo Va camino a la fama
Una forma sencilla que funciona tanto en VC++ como en C++Builder:

Código PHP:
#pragma comment(lib, "Winmm.lib") 
Responder Con Cita
  #11  
Antiguo 12-04-2018
REHome REHome is offline
Miembro
 
Registrado: jul 2003
Ubicación: España
Posts: 472
Poder: 22
REHome Va por buen camino
Funciona el truco, auqnue me da que más lento pero funciona.

En cuanto al CBuilder C++. No me aparece nunca el RUN para ejeutarlo, al menos ver la ventana.




¿Me equivoco?

Saludos.
__________________
http://electronica-pic.blogspot.com....n-arduino.html Manuales de electrónica general, PIC y Arduino.
Responder Con Cita
  #12  
Antiguo 12-04-2018
Avatar de _Leo
_Leo _Leo is offline
Miembro
 
Registrado: ene 2017
Ubicación: Lanzarote (Islas Canarias)
Posts: 38
Poder: 0
_Leo Va camino a la fama
¿Más lento el "pragma" te refieres? No, es otra manera de indicarle las dependencias. Se ha usado más comúnmente en VC++ durante años.

No entiendo a que te refieres con que no te aparece el RUN.
Responder Con Cita
  #13  
Antiguo 12-04-2018
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 17
TOPX Va camino a la fama
Cita:
Empezado por _Leo Ver Mensaje
No entiendo a que te refieres con que no te aparece el RUN.
Él creó una Form, y espera ejecutarla. Debió haber creado una Application.
-
__________________
"constructive mind, destructive thoughts"
Responder Con Cita
  #14  
Antiguo 12-04-2018
Avatar de _Leo
_Leo _Leo is offline
Miembro
 
Registrado: ene 2017
Ubicación: Lanzarote (Islas Canarias)
Posts: 38
Poder: 0
_Leo Va camino a la fama
Ah OK, tiene casi de 400 mensajes y el foro es principalmente de Delphi y el IDE de C++Builder es el mismo, no entiendo al menos para crear la aplicación con un Form y añadir un par de botones como puede ser tan diferente ;-)

Creo que es más eficiente contar todo el objetivo completo en vez de ir preguntando todos los pasos a plazos..
Responder Con Cita
  #15  
Antiguo 14-04-2018
REHome REHome is offline
Miembro
 
Registrado: jul 2003
Ubicación: España
Posts: 472
Poder: 22
REHome Va por buen camino
Hola:

Me refería que no podía ejecutar la aplicación como indica arriba, si lo hago así si.



Creo el formulario con gran entusiasmo.


Ejecuto con RUN, con el segundo botón. Ni el primero tampoco funciona.


Aparec este error.


Como dice el mensaje, voy a reinstalarlo, espero que no me de la tabarra ni por ahí.

Saludos.

PD: Por cierto, saludos desde Tenerife.
__________________
http://electronica-pic.blogspot.com....n-arduino.html Manuales de electrónica general, PIC y Arduino.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Reposicionar componentes al redimensionar formulario mcs Varios 7 13-09-2016 00:35:32
Botones de Accion Formulario MDI jilc1111 Varios 2 31-05-2014 01:03:14
3 botones para acceder a un mismo formulario. VRO Varios 9 05-09-2007 03:08:32
Desea continuar? SI NO CANCELAR (3 Botones en el formulario) dmassive PHP 3 26-08-2005 20:22:08
Redimensionar Imagen a tamaño del formulario! kye_z Varios 2 09-11-2004 10:44:16


La franja horaria es GMT +2. Ahora son las 01:06:34.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi