문제

cout 구문을 사용하여 Windows 메시지 상자를 표시할 수 있습니까?

또한 표시하지 않거나 숨기려면 명령 프롬프트 창이 필요합니다.

messagebox 함수를 호출하고 사용법을 통해 텍스트를 표시하는 방법이 있지만 여기서 가장 큰 제약은 cout 구문을 사용해야 한다는 것입니다.

cout <<  "message";

cout 출력에서 ​​VB msgbox 명령을 호출하려고 생각했지만 작동하는 항목을 찾을 수 없습니다.

어떤 아이디어가 있나요?

도움이 되었습니까?

해결책

가장 먼저 고려해야 할 점은 MessageBox가 창을 닫을 때까지 스레드를 중지한다는 것입니다.그것이 당신이 원하는 행동이라면 계속하십시오.

사용자 정의 streambuf를 생성하고 다음과 같이 설정할 수 있습니다. 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
}

std::cout 스트림이 플러시될 때마다 팝업이 표시됩니다.

다른 팁

C++ 스트림은 콘솔 또는 파일 스트림에서 작동합니다.Windows는 다소 완전히 다른 패러다임에서 작동하므로 cout 컨텍스트는 실제로 이 작업에 적합하지 않습니다.어느 정도 작동하고 이 구문과 다소 유사해 보이는 것을 완전히 매시업할 수 있지만 다음과 같이 할 수 있다면 실제로는 가치가 없습니다.

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

전체 문서 보기 메세지 박스 더 많은 정보를 위해서.

포함함으로써 sstream, 당신이 사용할 수있는 std::ostringstream iostream 라이브러리를 사용하여 메시지를 작성합니다.그런 다음 전화할 수 있습니다. .str().c_str() 그리고 char * MessageBox에 전달합니다.

과거에 이 문제에 직면했을 때 나는 다음을 사용했습니다. stringstream 현재 내용을 표시하는 조작기와 함께 stringstream 사용하여 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;
}

이를 사용하기 위해 구문은 다음을 사용하는 것과 상당히 비슷해 보입니다. cout, 하지만 함께 MessageBox 교체 std::endl.예를 들어:

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

편집하다:주로 fnieto를 위해.이 경우 다운캐스트는 실제로 ~이다 필요한.그 이유는 매우 간단합니다.일반적인 삽입기는 ostream에 대한 참조를 수신하고 반환합니다.

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

이는 원래 stringstream 개체를 가져와 자동으로(안전하게) 간단한 ostream으로 캐스팅합니다.그 자체로는 문제가 없으며 대부분의 삽입기와 조작기에 대해서도 잘 작동합니다. ostream 인터페이스 자체.

그러나 이 조작기는 약간 다릅니다. str() 회원, 어느 ostream 전혀 정의하지 않습니다.우리의 전화를 위해 str() 해결하고 컴파일하려면 ostream &ostringstream &, 따라서 컴파일러는 우리가 작업 중인 객체가 실제로 str() 회원.

다운캐스트를 제거하기 위해 실제로 선택할 수 있는 것은 하나뿐입니다.매개변수를 ostringstream &.연산자를 연결하지 않는 한 작동합니다.

my_stream << x;
my_stream << MessageBox;

하지만 이를 연결하려고 하면 실패합니다.

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

더 나쁜 것은 컴파일러의 오류 메시지가 아마도 사용자에게 무엇인가를 말하려고 할 것입니다. std::basic_ostream<char>::str(), 이는 사용자 코드에서 전혀 언급되지 않습니다.더 나쁜 것은 대부분의 사람들이 체인 연결이나 동일한 결과를 제공하지 않는 것에 충분히 익숙해져 있기 때문에 코드가 때로는 제대로 작동하고 때로는 완전히 해독할 수 없는 오류 메시지와 함께 컴파일에 실패하는 이유를 알아내는 데 시간이 걸릴 수도 있다는 것입니다.

어쨌든 간단한 방법은 없습니다.

cout의 c는 콘솔을 의미하므로 아마도 운이 좋지 않을 것입니다.

복사하려는 구문만 있는 경우 내부적으로 메시지 상자를 만들고 표시하는 고유한 스트림 클래스를 작성할 수 있습니다.

cout 구문을 사용하여 Windows 메시지 상자를 표시할 수 있습니까?

당신은 그것을 할 수 없습니다 std::cout. std::cout 유니코드/와이드 문자 처리를 약속하지도 않습니다(참조: std::wcout), 비록 Windows에서는 cout 넓은 문자에는 문제가 없습니다.

같은 방법으로 쉽게 할 수 있어요 통사론;즉, 오버로드되는 라이브러리를 쉽게 작성할 수 있습니다. operator<< 대화 상자를 표시합니다.그런 식으로 모든 정보를 대화 상자에 전달하는 것은 매우 어려울 수 있습니다(어떤 버튼을 표시할지, 해당 버튼을 눌렀을 때 수행해야 하는 작업, 해당 버튼의 위치, 버튼의 크기 및 위치 등을 어떻게 말할 수 있습니까?) 창 자체?).

당신은 다음과 같은 것을보고 싶을 수도 있습니다 저주를 받다.구문은 다르지만 동료가 찾고있는 느낌이 듭니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top