Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kaxperday en 2 Noviembre 2015, 11:29 am



Título: Mostrar mensaje en ventana C++
Publicado por: Kaxperday en 2 Noviembre 2015, 11:29 am
Código
  1. void enseñar_mensaje(string ventana, string mensaje, u_int icono)
  2. {
  3. wchar_t *caca = L"iaifhidhifhdi";
  4. MessageBox(NULL, caca,(LPCWSTR)ventana.c_str(), icono | MB_OK);
  5. }

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
  1. void enseñar_mensaje(string ventana, string mensaje, u_int icono)
  2. {
  3. int len;
  4. int slength = (int)ventana.length() + 1;
  5. len = MultiByteToWideChar(CP_ACP, 0, ventana.c_str(), slength, 0, 0);
  6. wstring ven(len, L'\0');
  7. MultiByteToWideChar(CP_ACP, 0, ventana.c_str(), slength, &ven[0], len);
  8. slength = (int)mensaje.length() + 1;
  9. len = MultiByteToWideChar(CP_ACP, 0, mensaje.c_str(), slength, 0, 0);
  10. wstring men(len, L'\0');
  11. MultiByteToWideChar(CP_ACP, 0, mensaje.c_str(), slength, &men[0], len);
  12. MessageBox(NULL, men.c_str(), ven.c_str(), icono | MB_OK);
  13. }


Título: Re: Mostrar mensaje en ventana C++
Publicado por: class_OpenGL en 2 Noviembre 2015, 12:49 pm
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
  1. const char lpszMessage[] = "Esto es una cadena de caracteres";
  2.    wchar_t *lpszWideMessage;
  3.    size_t uMessageSize = 0;
  4.  
  5.    uMessageSize = strlen(lpszMessage);
  6.    lpszWideMessage = new wchar_t[uMessageSize * sizeof(wchar_t)];
  7.  
  8.    for(size_t i = 0; i < uMessageSize; i++)
  9.        lpszWideMessage[i] = (wchar_t)lpszMessage[i];
  10.  
  11.    std::wcout << lpszWideMessage;

Y si quieres pasar la cadena wchar_t * a std::wstring, puedes hacer lo siguiente:
Código
  1. 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
  1. #ifdef UNICODE
  2. #define MessageBox MessageBoxW
  3. #else
  4. #define MessageBox MessageBoxA
  5. #endif

Espero haber ayudado


Título: Re: Mostrar mensaje en ventana C++
Publicado por: ivancea96 en 2 Noviembre 2015, 13:35 pm
Cuidado con:

Código
  1. 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
  1. lpszWideMessage = new wchar_t[uMessageSize + 1];
  2. for(size_t i = 0; i < uMessageSize; i++)
  3.    lpszWideMessage[i] = (wchar_t)lpszMessage[i];
  4. lpszWideMessage[uMessageSize] = '\0';


Título: Re: Mostrar mensaje en ventana C++
Publicado por: Kaxperday en 2 Noviembre 2015, 14:07 pm
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
  1. void enseñar_mensaje(string ventana, string mensaje, u_int icono)
  2. {
  3. MessageBoxA(NULL, mensaje.c_str(), ventana.c_str(), icono | MB_OK);
  4. }

Saludos.


Título: Re: Mostrar mensaje en ventana C++
Publicado por: class_OpenGL en 3 Noviembre 2015, 10:04 am
Cuidado con:

Código
  1. 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
  1. lpszWideMessage = new wchar_t[uMessageSize + 1];
  2. for(size_t i = 0; i < uMessageSize; i++)
  3.    lpszWideMessage[i] = (wchar_t)lpszMessage[i];
  4. 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