Visual C++/Popup Window

Popup Windows in MFC

Soul-Learner 2013. 6. 25. 17:35

MFC기반으로 팝업 윈도우 출력하기


여기서 윈도우를 생성할 때 사용하는 Create() 함수는 CWnd 클래스의 멤버가 아닌 CFrameWnd 클래스의 멤버함수라는 것에 주의해야 한다.


CFrameWnd::Create() 함수를 사용하면 지정한 부모 윈도우 위에 다른 윈도우를 출력할 수 있다 (MSDN참조)

virtual BOOL Create(  LPCTSTR lpszClassName,  LPCTSTR lpszWindowName,  DWORD dwStyle = WS_OVERLAPPEDWINDOW,  const RECT& rect = rectDefault,  CWnd* pParentWnd = NULL,  LPCTSTR lpszMenuName = NULL,  DWORD dwExStyle = 0,  // 확장 스타일 중에서 WS_EX_TRANSPARENT를 사용하면 배경이 투명한 윈도우도 생성할 수 있다 CCreateContext* pContext = NULL  );

Window Styles 참조

Extended Window Styles 참조

참고: 확장 스타일 중에서 WS_EX_TOOLWINDOW 를 사용하면 윈도우 위에 떠 있는 듯한 툴박스용 윈도우도 생성할 수 있다


버튼이 눌렸을 때 현재의 창위에 팝업 윈도우가 나타나고 드래그하여 이동할 수 있고 닫기 버튼을 눌러 닫을 수도 있는 팝업윈도우의 예를 들어본다


CFrameWnd 를 상속하여 팝업 윈도우로 사용될 윈도우 클래스를 선언한다


MyPopupWnd.h

#pragma once // MyPopupWnd frame class MyPopupWnd : public CFrameWnd { DECLARE_DYNCREATE(MyPopupWnd) public: MyPopupWnd(); // protected constructor used by dynamic creation virtual ~MyPopupWnd(); public: DECLARE_MESSAGE_MAP() };


MyPopupWnd.cpp, 생성자를 아래와 같이 작성한다

// MyPopupWnd.cpp : implementation file


#include "stdafx.h"

#include "WndOpen.h"

#include "MyPopupWnd.h"


// MyPopupWnd


IMPLEMENT_DYNCREATE(MyPopupWnd, CFrameWnd)


MyPopupWnd::MyPopupWnd()

{

        SIZE s;

ZeroMemory(&s, sizeof(SIZE));

s.cx = (LONG) GetSystemMetrics(SM_CXFULLSCREEN);

s.cy = (LONG) GetSystemMetrics(SM_CYFULLSCREEN);


Create(NULL, _T("팝업 윈도우 테스트"),

  WS_OVERLAPPEDWINDOW,

  CRect(0, 0, s.cx, s.cy), AfxGetMainWnd(), NULL, 1);


}


MyPopupWnd::~MyPopupWnd()

{

}


BEGIN_MESSAGE_MAP(MyPopupWnd, CFrameWnd)

END_MESSAGE_MAP()


// MyPopupWnd message handlers


위의 코드에서 윈도우 스타일을 WS_OVERLAPPEDWINDOW 으로 지정한 이유는 시스템 메뉴가 보이고 윈도우 확대/축소가 자유롭게 되는 윈도우를 만들기 위함이다.


팝업 윈도우 클래스를 정의하였기 때문에 이제 버튼을 클릭하면 위에서  정의한 윈도우가 화면에 출력되도록 하면 된다


1. MyPopupWnd 를 멤버 변수로 선언한다 (사용하고자 하는 클래스의 멤버변수로 선언)

2. 메시지 핸들러에서 팝업윈도우를 생성하고 화면에 출력한다. 


여기서는 버튼이 눌렸을 때 팝업 윈도우가 출력되도록 하였다.

void MyButton::OnBnClicked()

{

// TODO: Add your control notification handler code here


popup = new MyPopupWnd(); // popup은 멤버변수로 선언됨

popup->ShowWindow(SW_SHOWNORMAL);

}



프로젝트를 빌드하고 실행하여 버튼을 누르면 다음과 같이 팝업 윈도우을 확인할 수 있다. 여기서 생성된 팝업 윈도우는 마우스로 드래그하여 이동할 수 있고 크기를 마음대로 조작할 수 있고 닫을 수도 있다.