2009-11-13 3 views
4

cout 구문을 사용하여 Windows 메시지 상자를 표시 할 수 있습니까?"cout"을 사용하여 Windows 대화 상자에 메시지 표시 - C++

또한 명령 프롬프트 창을 표시하거나 숨길 필요가 있습니다.

messagebox 함수를 호출하고 텍스트를 사용하는 방법이 있지만 주요 제약 조건은 cout 구문을 사용해야한다는 것입니다.

cout << "message"; 

나는 cout 출력에서 ​​VB msgbox 명령을 호출하려고했지만 작동했던 것을 찾을 수 없었다.

아이디어가 있으십니까?

+3

C++ 콘솔 앱이 있고 이것을 Windows 앱으로 바꾸려는 경우 걱정할 필요가 없습니다. –

+1

'cout << ""Hello "<< user_name;"이라는 대화 상자는 몇 개나됩니까? –

+0

@ 단 - 그것은 C++을 가르치는 사람에게 일하는 학교의 강사의 요청 이었지만 학생들이 promopt 명령에 액세스 할 수 없게하려는 것입니다. @Eric - just 1 – CheeseConQueso

답변

9

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

사용자 지정 streambuf의를 생성하고 std::cout으로 설정할 수 있습니다 : 표준 : : 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 
} 

팝업이 표시됩니다.

+0

이 오류를 얻었습니다. Visual Studio 08을 사용하여 차이가 생기는 경우 – CheeseConQueso

+0

stdafx.h를 포함하는 것이 가장 먼저 들었습니다. 그 사람이 나에게 새로운 것을 시험하기 위해 다시 돌아올 때까지 접근 할 수없는 많은 오류를 가지고있다. – CheeseConQueso

+0

이 문제는이 코드와 관련이 없지만 프로젝트의 "미리 컴파일 된 헤더"옵션이있다. –

10

C++ 스트림은 콘솔 또는 파일 스트림에서 작동합니다. Windows는 다소 다른 완전히 다른 패러다임에서 작동합니다. 따라서 Cout 컨텍스트는 이와 관련하여 실제로 좋은 컨텍스트가 아닙니다. 당신은 아마 완전히 다소 작업 끝낼 것이 뭔가,이 구문에 더 많거나 적은 유사한보고를 매쉬 수 있지만, 그것은 당신이 다만 때를 정말 가치가 없어 :

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

전체 문서를 참조하십시오 자세한 내용은 MessageBox을 참조하십시오.

+0

예,이 사람에게 내가 제안한 것이지. 그러나 그들은 어떤 애매한 이유로 시련의 일부가 될 것을 원한다. – CheeseConQueso

+0

그들이 원한다. cout 특별히? 또는 cout과 비슷한 스트림을 원하십니까? – Bill

+0

메신저 90 % 그들이 확실하게 cout을 원한다고 확신합니다. 그것은 강사이고 그는 아마도 책을 보러 갈 것입니다. 학생들이 명령 프롬프트에 액세스 할 수 없도록하려는 것입니다. – CheeseConQueso

3

어쨌든 간단한 방법이 아닙니다.

cout의 cout은 콘솔을 의미하므로 운이 좋지 않을 것입니다.

복사하려는 구문 일 경우 자체적 인 스트림 클래스를 작성하여 해당 메시지 상자 아래에 메시지 상자를 만들고 표시 할 수 있습니다. 당신이 체크 아웃 할 수 있습니다

+0

thats 내가 그에게 말한 것은 .... cout = console out – CheeseConQueso

+3

그는 단지 cout과 같은 문법을 원하며 cout 자체는 원하지 않습니다. std :: ostringstream을 사용하여 windows 객체에 전달할 문자열을 작성할 수 있습니다. 스티븐 뉴웰의 대답대로. – Clifford

+0

@Clifford, 네, 그는 스트림 구문을 원할 수도 있다는 것을 이해합니다. 그래서 후드 아래에서 메시지 상자 기능을 호출하는 자체 스트림 클래스를 사용하여 언급했습니다. 어쩌면 나는 충분히 명확하지 않았다. – Glen

6

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

1

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

std::cout으로는 수행 할 수 없습니다. std::cout은 유니 코드/와이드 문자 (std::wcout 참조)를 처리 할 것을 약속하지 않지만, 윈도우의 cout은 와이드 문자에 문제가 없습니다.

과 같은 형식으로 쉽게 할 수 있습니다. 즉, 대화 상자를 표시하기 위해 operator<<을 오버로드하는 라이브러리를 쉽게 작성할 수 있습니다. 대화 상자에 모든 정보를 전달하는 것은 매우 어려울 것입니다. (어떤 버튼을 보여줄 것인지, 눌렀을 때 버튼을 눌렀을 때, 버튼이 어디에 있어야하는지, 그리고 버튼의 위치와 위치는 어떻게 표시해야합니까? 창 자체?).

ncurses과 같은 것을 볼 수 있습니다. 구문은 다르지만 동료가 찾고있는 느낌이 입니다.

과거에이 직면하는 경우
6

, 나는이 stringstreamMessageBox를 사용하여 stringstream의 내용을 표시하는 조작기와 함께 사용했습니다 :

#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을 사용하는 것과 같지만 MessageBoxstd::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 &을 으로 변환해야하므로 컴파일러는 우리가 실제로 작업하고있는 객체가 str() 멤버를 갖게된다는 것을 알고 있습니다.

다운 캐스트를 없애려면 실제로는 매개 변수를 으로 만드십시오. ,

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

더 나쁜, 컴파일러의 오류 메시지가 아마도 사용자에 대해 뭔가 std::basic_ostream<char>::str() 말하려고합니다 :

my_stream << x; 
my_stream << MessageBox; 

하지만 체인에 시도하는 사람들은 실패 : 그건 우리가 사업자를 체인 않을만큼 작동합니다 이는 사용자의 코드에 전혀 언급되지 않았습니다. 더 나쁜 것은 대부분의 사람들은 체인을 연결하거나 동일한 결과를 내지 못하는 것에 익숙하기 때문에 코드가 때때로 제대로 작동하는 이유와 완전히 컴파일 할 수없는 오류 메시지와 함께 컴파일에 실패한 이유를 파악하는 데 시간이 걸릴 것입니다.

+1

조작원 aproach에 대해 +1 –