Mostrar mensaje en ventana C++

Iniciado por Kaxperday, 2 Noviembre 2015, 11:29 AM

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

Kaxperday

Código (cpp) [Seleccionar]
void enseñar_mensaje(string ventana, string mensaje, u_int icono)
{
wchar_t *caca = L"iaifhidhifhdi";
MessageBox(NULL, caca,(LPCWSTR)ventana.c_str(), icono | MB_OK);
}


El problema es que no hay manera de pasar de string wchar_t* o a wstring, ¿alguna idea?.

Saludos y gracias.

Bueno parece que hay muchos codes por stackoverflow cuando lo solucione pasaré la respuesta, de todas formas estaría bien meterle una scrollbar, un saludo.

Edito: solucionado, que aproveche:

Código (cpp) [Seleccionar]
void enseñar_mensaje(string ventana, string mensaje, u_int icono)
{
int len;
int slength = (int)ventana.length() + 1;
len = MultiByteToWideChar(CP_ACP, 0, ventana.c_str(), slength, 0, 0);
wstring ven(len, L'\0');
MultiByteToWideChar(CP_ACP, 0, ventana.c_str(), slength, &ven[0], len);
slength = (int)mensaje.length() + 1;
len = MultiByteToWideChar(CP_ACP, 0, mensaje.c_str(), slength, 0, 0);
wstring men(len, L'\0');
MultiByteToWideChar(CP_ACP, 0, mensaje.c_str(), slength, &men[0], len);
MessageBox(NULL, men.c_str(), ven.c_str(), icono | MB_OK);
}
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

class_OpenGL

No entendí mucho el problema (aunque ya esté solucionado). ¿Querías convertir una cadena de caracteres (const char *) a una cadena de caracteres ancha (wchar_t *)?

Si es así, hay maneras más sencillas :P

Código (cpp) [Seleccionar]
const char lpszMessage[] = "Esto es una cadena de caracteres";
    wchar_t *lpszWideMessage;
    size_t uMessageSize = 0;

    uMessageSize = strlen(lpszMessage);
    lpszWideMessage = new wchar_t[uMessageSize * sizeof(wchar_t)];

    for(size_t i = 0; i < uMessageSize; i++)
        lpszWideMessage[i] = (wchar_t)lpszMessage[i];

    std::wcout << lpszWideMessage;


Y si quieres pasar la cadena wchar_t * a std::wstring, puedes hacer lo siguiente:
Código (cpp) [Seleccionar]
std::wstring cWideMessage = lpszWideMessage;

Si todo esto es porque lo necesitabas para la función MessageBox, que sepas que puedes usar MessageBoxA para cadenas de texto de un byte por carácter (const char * o LPCSTR).

Fíjate en el código extraído de la librería de Windows:

Código (cpp) [Seleccionar]
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif


Espero haber ayudado

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

ivancea96

Cuidado con:

Código (cpp) [Seleccionar]
lpszWideMessage = new wchar_t[uMessageSize * sizeof(wchar_t)];

El sizeof no se necesita para ese caso. Ahí estás creando una cadena del doble de tamaño.
Y hay que poner caracter nulo.

Código (cpp) [Seleccionar]
lpszWideMessage = new wchar_t[uMessageSize + 1];
for(size_t i = 0; i < uMessageSize; i++)
    lpszWideMessage[i] = (wchar_t)lpszMessage[i];
lpszWideMessage[uMessageSize] = '\0';

Kaxperday

Pues todo esto venía por la función de mostrar un mensaje MessageBox(), en mi caso al estar mi proyecto en UNICODE, por defecto necesitaba pasar de argumentos wchar_t*, y no sabía como obtenerlos hasta que encontre como hacerlo en el stackoverflow, pero como bien has indicado con MessageBoxA no es necesario ya que puedes pasar como parámetros const char*, luego la solución para mostrar un mensaje de la manera más sencilla queda de la forma:

Código (cpp) [Seleccionar]
void enseñar_mensaje(string ventana, string mensaje, u_int icono)
{
MessageBoxA(NULL, mensaje.c_str(), ventana.c_str(), icono | MB_OK);
}


Saludos.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

class_OpenGL

Cita de: ivancea96 en  2 Noviembre 2015, 13:35 PM
Cuidado con:

Código (cpp) [Seleccionar]
lpszWideMessage = new wchar_t[uMessageSize * sizeof(wchar_t)];

El sizeof no se necesita para ese caso. Ahí estás creando una cadena del doble de tamaño.
Y hay que poner caracter nulo.

Código (cpp) [Seleccionar]
lpszWideMessage = new wchar_t[uMessageSize + 1];
for(size_t i = 0; i < uMessageSize; i++)
    lpszWideMessage[i] = (wchar_t)lpszMessage[i];
lpszWideMessage[uMessageSize] = '\0';


Es cierto lo del sizeof... Que despiste tengo encima XD. También tengo que reafirmar lo del carácter nulo :S Siento los errores

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL