Buenas:
Teniendo el código del C++ CLR o .net, quiero adaptarlo a C++ Win32. Su código del C++ CLR es este.
Código:
#include "pch.h"
using namespace System;
void MenuPrincipal(array<String^ >^);
int itemSeñalado;
int itemSeleccionado;
int main(array<System::String^>^ args)
{
array<String^ >^ TEXTO = gcnew array<String^>
{
"( ) Opción A ",
"( ) Opción B ",
"( ) Opción C ",
" SALIR"
};
// Título de la ventana.
Console::Title = "RadioButton C++ CLR";
// Tamaño de la ventana.
Console::SetWindowSize(20, 5);
// Fondo verde.
Console::BackgroundColor = ConsoleColor::Blue;
// Letras negras.
Console::ForegroundColor = ConsoleColor::White;
// Oculto el cursor.
Console::CursorVisible = false;
// Almacena la tecla pulsada en la variable.
ConsoleKey teclaInicial;
do
{
// Limpiar pantalla.
Console::Clear();
// Posición del cursor del título del MENÚ PRINCIPAL.
Console::SetCursorPosition(0, 0);
// Título.
Console::Write(" MENÚ PRINCIPAL ");
// Pocisión de la hora.
Console::SetCursorPosition(4, 2);
// Formato numérico dd/MM/yyyy.
Console::Write(DateTime::Now.ToString("ddd dd MMM"));
// Almacena en la variable una tecla pulsada.
teclaInicial = Console::ReadKey(true).Key;
// ¿Haz pulsado la tecla Enter?
if (teclaInicial == ConsoleKey::Enter)
{
// Sí. Se ejecuta esta función.
MenuPrincipal(TEXTO);
}
} while (teclaInicial != ConsoleKey::Escape);
return 0;
}
void MenuPrincipal(array<String^ >^ TEXTO)
{
bool salir = false;
// En itemSelecionado:
// -1 = Sin seleccionar con * ninguna opción.
// 0 = Seleccionar con * la Opción A.
// 1 = Seleccionar con * la Opción B.
// 2 = Seleccionar con * la opción C.
// Capturar tecla para luego validar.
ConsoleKey tecla;
// Cada vez que se vuelva al menú, está señalizado con el *.
itemSeñalado = 0;
do
{
//******************************************************************
// Dibujo el menú principal.
// Limpiar pantalla.
Console::Clear();
for (int k = 0; k < TEXTO->Length; k++)
{
Console::SetCursorPosition(0, k);
Console::Write(itemSeñalado == k ? "> " : " ");
Console::Write(TEXTO[k]);
Console::SetCursorPosition(3, k);
Console::Write(itemSeleccionado == k ? "*" : " ");
}
// Fin de pintar el menú principal.
//******************************************************************
// Leer tecla ingresada por el usuario.
tecla = Console::ReadKey(true).Key;
switch (tecla)
{
case ConsoleKey::Enter:
if (itemSeñalado < 3)
{
itemSeleccionado = itemSeñalado;
}
salir = (itemSeñalado == TEXTO->Length - 1);
break;
case ConsoleKey::DownArrow:
if (++itemSeñalado >= TEXTO->Length)
{
itemSeñalado = 0;
}
break;
case ConsoleKey::UpArrow:
if (--itemSeñalado < 0)
{
itemSeñalado = TEXTO->Length - 1;
}
break;
}
// Uso la tecla escape como salida.
} while (!salir);
}
El C++ Win32 por ahora solo he hecho esto, título de la ventana, mostrar tildes correctamente en pantalla, ocultar cursor y poco más. El programa completo de arriba no me sale.
Código:
#include <iostream>
#include <windows.h> // Para mostrar texto en el título de la ventana.
using namespace std;
//int itemSeñalado;
//int itemSeleccionado;
int main(void)
{
string TEXTO[] =
{
"( ) Opción A ",
"( ) Opción B ",
"( ) Opción C ",
" SALIR"
};
// Mostrar caracteres correctamente en pantalla.
SetConsoleOutputCP(65001);
wchar_t titulo[128];
MultiByteToWideChar(CP_UTF8, 0, "Título de la ventana. Win32 C++ 2019.", -1, titulo, 128);
SetConsoleTitle(titulo);
// Tamaño de la pantalla. Se cambia en los dos últimos dígitos.
SMALL_RECT r = { 0, 0, 49, 9 }; // X = 49, Y = 9.
SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &r);
// Ocultar cursor.
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
cci.bVisible = 0; // 0 oculta. 1 muestra cursor.
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
// Mostrar textos en pantalla.
cout << "Terminarías. Conocerías. Título. Analógico. \n";
cout << "Muchas gracias mi muy distinguido amigo.";
// Esperando pulsar Enter para salir.
cin.get();
return 0;
}
¿Alguna idea?
Saludos.