F.R.I.D.A.Y.

Direct2D에서 MessageBox가 나오지 않는 문제 본문

DEV/Direct2D

Direct2D에서 MessageBox가 나오지 않는 문제

F.R.I.D.A.Y. 2021. 4. 8. 11:20
반응형

 Win32를 시작하면서 그래픽 엔진으로 Direct2D를 이용하고 있다. 그러던 와중에 예제로 만든 프로그램에선 잘 실행되던MessageBox 함수가 직접 배운 걸 기반으로 작성한 프로그램에서는 화면에 노출되질 않아서 문제가 생겼었다.


그래픽 엔진

 Windows의 기본 그래픽 엔진으로는 두 종류가 있다고 본다. 예전부터 내려온 GDI/GDI+와 Windows7가 출시하면 공개된 DirectX 시리즈

 GDI/GDI+

 Windows ME였나 암튼 굉장히 오래된 그래픽 API다. 이 엔진의 가장 큰 특징이라 하면, CPU 렌더링을 한다. 즉, 아무리 좋은 그래픽카드를 가지고 있어봐야 GDI/GDI+를 사용하고 있으면 말짱 도루묵이라는 소리다. 그럼에도 불구하고 여태 Windows의 그래픽을 담당했던 엔진임과 동시에 그래픽카드에서 실패한 경우 CPU로 돌려서 소프트웨어 렌더링을 진행하기 때문에 그래픽 성능이 좋지 않은 상황에도 그래픽 작업이 가능하더라나?

 

Direct2D

 그래픽카드 성능이 사기적인 수준으로 올라가면서 그래픽카드의 제 성능을 사용하기 위해 Windows7이 출시되며 함께 공개된 그래픽 엔진이다. GDI/GDI+와 논할 수준을 아득히 뛰어넘는다. 애니메이션, 안티앨리어싱 등.[# 심지어 투명도까지 지원한다!]

 

 

메시지 출력

 Direct2D를 이용하면서 BeginPaint 함수와 EndPaint 함수, PAINTSTRUCT는 사용할 일이 없어 보였는데, 아니었다.

MessageBox 함수를 이용하는 경우, 이 함수를 함께 작성해야한다.

 WM_LBUTTONDOWN이 전달되었을 때, 메시지 박스가 나타나도록 구성했던 코드다.

LRESULT MainWindow::OnLButtonDown(D2D1_POINT_2F pos)
{
	MessageBoxA(hWnd, "저장 실패", "오류", MB_OK );
	return 0;

 이렇게 했을 때, 메시지가 나와야 했는데도 불구하고 메시지 박스가 표시되지 않았다. 첫 번째 인자로 윈도우 핸들을 줬던 만큼, 마우스 클릭할 때 잡혀있는 모습을 보인 만큼, 메시지는 생성되었으나 화면에 표시가 되지 않던 문제다.

 

 검색을 통해 문제를 해결했다.

 

Win32 MessageBox doesn't appear

I'm stuck with a strange problem. I'm making a Win32 application in VC++ 2008, making a class to encapsulate most of the work for easy repetition when calling a MessageBox. The message box` is crea...

stackoverflow.com

 무슨 이유에서인지는 더 찾아봐야겠지만, Direct2D를 사용한다고 Direct2D의 HwndRenderTarget 엔진의 BeginDraw()와 EndDraw()만 작성했었는데, 윈도우 MessageBox는 GDI/GDI+의 BeginPaint, EndPaint를 써주어야 했다. 그래서 아래처럼 변경했다.

LRESULT MainWindow::OnPaint()
{
	PAINTSTRUCT ps;
	pRT->BeginDraw();
	BeginPaint(hWnd, &ps);
    
	EndPaint(hWnd, &ps);
	return pRT->EndDraw();
}

 기존 코드에서는 BeginPaint와 EndPaint가 없었다. 해당 함수를 작성해주니 정상적으로 동작했다.

 

 원인 분석을 해보면 아마도 MessageBox 함수로 구현되는 Window가 GDI/GDI+로 처리가 되어서가 아닌가 싶다.

 

 

# index

728x90
반응형

'DEV > Direct2D' 카테고리의 다른 글

DirectWrite - 텍스트 출력하기 1  (0) 2021.04.10
Direct2D - 텍스트 출력하기 Intro.  (0) 2021.04.10
Direct2D - ID2D1SolidColorBrush  (0) 2021.04.05
Direct2D - DrawRectangle()  (0) 2021.04.05
Direct2D - Resize()  (0) 2021.04.04
Comments