태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

[MFC] MFC에서 콘솔창 띄우기

Posted on 2008.05.08 00:37
Filed Under Development

  • 이 글은 Jake에 의해 www.jakeworld.net 에서 작성되었습니다.

  • 퍼가실 때는 이 박스와 함께 복사해주세요.

간만에 포스팅 하는군요. :)

MFC 나 API 에서는 유저에게 숨겨진 실제 엔트리포인트가  CRTWinMain 으로 콘솔과는 전혀 다르게 사전에 초기화가 됩니다.

하지만 MFC 나 API 환경에서 간단한 수치를 디버깅 하기 위해선 익숙해지더라도 참 번거롭기 마련입니다.

이런 답답한 부분때문에 네이버에서 콘솔을 띄우는 방법에 대해 검색해보았는데 의외로 많더군요.

그중에 가장 좋다 싶은 방법을 선택하여 클래스로 만들어보았습니다만... 민망할 정도로 사용상 편의점이 아니고서는 썰렁하네요.


사용자 삽입 이미지

일단 기본적인 방법에 대해서 살펴보겠습니다.

AllocConsole();   //콘솔을 할당
FreeConsole();   //콘솔을 해제



/* stdout 에 대한 설정 */
hCrt = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE),_O_TEXT); hf = _fdopen(hCrt,"w");setvbuf( stdout, NULL, _IONBF, 0 );


기본적으로 위의 두가지 블럭안에 있는 코드만으로 콘솔을 띄우고 난 후 printf 나 cout 을 이용하여 출력, 콘솔을 닫는 작업들이 가능합니다.


그럼 완성된 클래스를 보지요.

//[MFCConsole.h]
#pragma once
#include 
#include 
#include 
#include 
using namespace std;
#define DEBUG_PRINT(x) printf("%s - Value : %ld[0x%lx], Address : 0x%lx\n",#x,x,x,&x)

class CMFCConsole
{
public:
    CMFCConsole(void);
    ~CMFCConsole(void);
    void OpenConsole(void);
    void CloseConsole(void);
};

//[MFCConsole.cpp]
#include "StdAfx.h"
#include "MFCConsole.h"

CMFCConsole::CMFCConsole(void)
{
    //초기화 콘솔을 열고 stdout, stdin 설정후 콘솔을 닫음
    AllocConsole();
    int hCrtout = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE),_O_TEXT);
    FILE *hout = _fdopen(hCrtout,"w");
    *stdout = *hout;
    int hCrtin = _open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE),_O_TEXT);
    FILE *hin = _fdopen(hCrtin,"r");
    *stdin = *hin;
    setvbuf( stdin, NULL, _IONBF, 0 );
    FreeConsole();
}

CMFCConsole::~CMFCConsole(void)
{
    //해제
    _fcloseall();
}

void CMFCConsole::OpenConsole(void)
{
    //콘솔을 열고 타이틀을 셋팅, 열린 콘솔이 있을경우 무시됨
    if(AllocConsole()){
    SetConsoleTitle(_T("Furyheimdall's Console"));
    printf("-----------------------------------------------\n");
    printf("             Console Class for MFC             \n");
    printf("              Made by Furyheimdall             \n");
    printf("-----------------------------------------------\n\n");
    }
}

void CMFCConsole::CloseConsole(void)
{
    //콘솔을 닫음. 열린 콘솔이 없을경우 무시
    FreeConsole();
}


CMFCConsole 클래스의 인스턴스를 항상 유지될 수 있는 곳에 선언해두고 멤버인 OpenConsole과 CloseConsole 을 호출하면 콘솔을 열고 닫고 할 수 있습니다.그리고 헤더에서 stdio.h 와 iostream 둘다 포함하고 있기 때문에 OpenConsole 후에 바로 printf 나 cout 을 사용하여 콘솔에 뿌려줄 수 있겠습니다.


그리고 디버그시 변수 값 수정을 할 수 있도록 scanf, cin 을 위한 stdin 에 대한 처리도 추가하였습니다.


한가지 문제점이라면 콘솔을 사용자가 직접 마우스로 창을 닫으면 프로그램 전체가 종료되는 점입니다.


그리고 콘솔창을 수시로 열고 닫고 하는 작업이 필요없거나 귀찮다 라는 분들은 OpenConsole 과 ColoseConsole 멤버를 삭제하시고 생성자에서 FreeConsole 함수를 소멸자 _fcloseall(); 이후에 넣어주시면 되겠습니다.


위 소스를 파일로 첨부합니다.

MFConsole.zip


신고

댓글을 달아 주세요

About



모바일 페이지 QR 코드

Counter

· Total
: 468,974
· Today
: 82
· Yesterday
: 130


DNS server, DNS service