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
팝업 윈도우 클래스를 정의하였기 때문에 이제 버튼을 클릭하면 위에서 정의한 윈도우가 화면에 출력되도록 하면 된다
1. MyPopupWnd 를 멤버 변수로 선언한다 (사용하고자 하는 클래스의 멤버변수로 선언)
2. 메시지 핸들러에서 팝업윈도우를 생성하고 화면에 출력한다.
여기서는 버튼이 눌렸을 때 팝업 윈도우가 출력되도록 하였다.
void MyButton::OnBnClicked()
{
// TODO: Add your control notification handler code here
popup = new MyPopupWnd(); // popup은 멤버변수로 선언됨
popup->ShowWindow(SW_SHOWNORMAL);
}
프로젝트를 빌드하고 실행하여 버튼을 누르면 다음과 같이 팝업 윈도우을 확인할 수 있다. 여기서 생성된 팝업 윈도우는 마우스로 드래그하여 이동할 수 있고 크기를 마음대로 조작할 수 있고 닫을 수도 있다.