mensaje de la pantalla en el cuadro de diálogo de Windows utilizando “cout” - C ++

StackOverflow https://stackoverflow.com/questions/1730427

  •  20-09-2019
  •  | 
  •  

Pregunta

Puede un cuadro de mensaje ventanas de visualización sea utilizando la sintaxis cout?

También necesito la ventana de símbolo del sistema para ser suprimido / oculto.

Hay formas de llamar a la función de mensaje y mostrar texto a través de su uso, pero la principal limitación es que la sintaxis cout debe ser utilizado.

cout <<  "message";

Yo estaba pensando en invocando el comando VB MsgBox en la salida cout, pero no pude encontrar nada que funcionó.

¿Alguna idea?

¿Fue útil?

Solución

Lo primero que debe tener en cuenta es que el hilo de mensaje se detiene hasta que se cierre la ventana. Si ese es el comportamiento que desee, adelante.

Se puede crear un streambuf costumbre y configurarlo para que std::cout:

#include <windows.h>
#include <sstream>
#include <iostream>

namespace {
    class mb_streambuf : public std::stringbuf {
        virtual ~mb_streambuf() { if (str().size() > 0) sync(); }
        virtual int sync() {
            MessageBoxA(0, str().c_str(), "", MB_OK);
            str("");
            return 0;
        }
    } mb_buf;

    struct static_initializer {
        static_initializer() { 
            std::cout.rdbuf(&mb_buf); 
        }
    } cout_buffer_switch;
}

int main()
{
    std::cout << "Hello \nworld!"; // Will show a popup
}

se mostrará una ventana emergente cada vez que se vacía corriente std :: cout.

Otros consejos

flujos de C ++ trabajan con la consola o archivos corrientes. Ventanas funcionan en un paradigma más o menos completamente diferente, por lo que el contexto cout no es realmente una buena para trabajar con esto. Probablemente se podría triturar completamente algo que podría llegar a más o menos trabajo, y mirando más o menos similar a la sintaxis, pero no es realmente vale la pena cuando se puede hacer:

MessageBox( NULL, message, "", MB_OK );

Vea los documentos completos en de mensaje para obtener más información.

Al incluir sstream, puede utilizar std::ostringstream y construir un mensaje usando la biblioteca iostream. A continuación, puede llamar .str().c_str() y obtener una char * para pasar a cuadro de mensaje.

Cuando nos enfrentamos a esto en el pasado, he utilizado un stringstream junto con un manipulador que muestra el contenido actual de la stringstream utilizando MessageBox:

#include <windows.h>
#include <sstream>
#include <ostream>

std::ostream &MessageBox(std::ostream &s) {
    std::ostringstream *st = dynamic_cast<std::ostringstream *>(&s);
    if (NULL != st)
        ::MessageBox(NULL, st->str().c_str(), "", MB_OK);
    return s;
}

Para usar esto, la sintaxis es una buena cantidad como el uso de cout, pero con la sustitución de MessageBox std::endl. Por ejemplo:

std::ostringstream stm;
stm  << " blah blah blah. Value: " << 1213.1231 << MessageBox;

Editar: todo para fnieto. En este caso, los abatidos realmente es es necesario. La razón es bastante simple: un dispositivo de inserción típica recibe y devuelve una referencia a un ostream:

std::ostream &operator<<(std::ostream &os, T const &t) { 
    // code here to insert t into os, then return os;
}

Esto tiene el objeto stringstream original y en silencio (y segura) arroja hasta un simple ostream. Eso está bien en sí mismo, y funciona bien para la mayoría de dispositivos de inserción y manipuladores, ya que sólo interactúan con el ostream interfaz mismos.

Este manipulador, sin embargo, es un poco diferente - que utiliza el miembro str(), que ostream no define en absoluto. Para nuestro llamado a str() para resolver y compilar, tenemos que convertir el ostream & a un ostringstream &, por lo que el compilador es consciente de que el objeto que estamos trabajando realmente tendrá un miembro str().

Para eliminar los abatidos, nos gustaría realmente sólo tenemos una opción: hacer que su parámetro de un ostringstream &. Eso funcionaría con tal de que no encadenados operadores:

my_stream << x;
my_stream << MessageBox;

pero tratando de cadena de los fracasaría:

// should be equivalent:
my_stream << x << MessageBox;

Peor aún, mensaje de error del compilador probablemente tratará de avisar al usuario algo sobre std::basic_ostream<char>::str(), que no se menciona en el código del usuario en absoluto. Peor aún, la mayoría de las personas son lo suficientemente acostumbrado a encadenar o no ofrezca los mismos resultados que probablemente les tomaría un tiempo para siquiera entender por qué el código a veces funcionaba bien, y otras veces no compilar, con un mensaje de error completamente indescifrable.

No hay manera simple de todos modos.

El C en cout es sinónimo de consola, así que probablemente fuera de suerte.

Si es sólo la sintaxis que está mirando para copiar, entonces usted podría escribir su propia clase de secuencia que crea un cuadro de mensaje bajo el capó y lo muestra.

  

Puede un cuadro de mensaje ventanas de visualización sea utilizando la sintaxis cout?

No se puede hacer con std::cout. std::cout ni siquiera la promesa de manejar caracteres Unicode / ancho (ver std::wcout), aunque cout de Windows no tiene ningún problema con caracteres de ancho.

fácilmente podría hacerlo con el mismo sintaxis ; es decir, fácilmente se podría escribir una biblioteca que sobrecarga operator<< a mostrar cuadros de diálogo. Tratando de pasar toda la información para el cuadro de diálogo de esa manera sería muy difícil, aunque (¿cómo se puede decir qué botones para mostrar, lo que los botones deben hacer cuando se pulsa, donde los botones deben ser, y el tamaño y la posición de la propia ventana?).

Es posible que desee ver en algo así como ncurses . La sintaxis es diferente, pero tengo una sensación de que es lo que su compañero de trabajo está buscando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top