2016-06-09 7 views
1

아무도 CDialog에서 파생 된 대화 상자 클래스에 대해 OnPaint()을 재정의하는 방법을 이해할 수 있도록 도와주십시오. 여기 대화 상자 클래스에 OnPaint() 함수를 추가했지만 dlg.DoModal() 이후에 호출되지 않음

코드입니다 :

ColorImageDlg *pDlg = NULL; 
pDlg = new ColorImageDlg; 
pDlg->DoModal(); 
delete pDlg; 

내가 OnInitDialog()를 재정의하고 있는데 그것을 호출 얻고있다. 그러나 OnPaint()을 덮어 쓰는 동안 호출되지 않습니다.

고칠 수 있습니까?

+0

아래와 같이 ON_WM_PAINT()에 대한 답변이 추가되었습니다. 이제 실행중인 onpaint(); BEGIN_MESSAGE_MAP (ColorImageDlg, CDialog) \t ON_WM_PAINT() END_MESSAGE_MAP(). 감사합니다. – user3587879

+0

힙에 대화 상자의 인스턴스를 만드는 점은 무엇입니까? 다음과 같이하면됩니다 :'ColorImageDlg dlg; dlg.DoModal(); ' –

+0

클래스 마법사를 통해 핸들러를 생성하십시오. 필요한 모든 코드를 생성합니다. –

답변

2

우선 힙에 대화 상자의 인스턴스를 만드는 것이 무엇입니까? 당신은 간단하게 수행 할 수 있습니다

ColorImageDlg dlg; 
dlg.DoModal(); 

는이 같은 메시지 맵을 수정해야합니다 사용 VS 클래스 마법사

BEGIN_MESSAGE_MAP(ColorImageDlg, CDialog) 
    ON_WM_PAINT() 
END_MESSAGE_MAP() 

그런 문제를 방지 할 수 있습니다.

+1

Visual Studio 2008에는 클래스 마법사가 없습니다. Visual Studio 2010만큼 늦게 다시 등장했으며 이후 Visual Studio에 포함되었습니다 (현재 VS 2015까지). – IInspectable

+0

클래스 마법사가 VC6 이후 존재했습니다 (전에도 존재). 그들은 "ClassWizard"용어를 숨겼지만 메시지 처리가 계속되었습니다. VS2010이 그것을 개편했습니다. – Ajay

+1

@Ajay : Visual Studio 2002에서 클래스 마법사가 제거되었으며 Visual Studio 2010에서 다시 도입되었습니다. 숨겨진 것이 아니므로 완전히 제거되었습니다. 나는 클래스 마법사와 메시지 처리가 어떻게 관련되어 있는지 전혀 모른다. 그것들은 완전히 별개의 실체입니다. – IInspectable

2

ClassWizard을 사용할 수없는 경우 다른 방법이 있습니다. 여기에 대한 리소스는 다음과 같습니다

(VS2015 버전) https://msdn.microsoft.com/en-us/library/dey7ke4c.aspx

(VS2008 버전) https://msdn.microsoft.com/en-us/library/dey7ke4c(v=vs.90).aspx)

그러나 당신이 대화 상자 리소스를 정의하면 기본적으로를 부착 새 클래스으로 변경하려면 클래스보기 탭이 선택되어 있는지 확인하십시오.

Class View

다음 있는지 확인 대화 상자 클래스입니다 클래스 뷰에서를 선택 :

Class 그런

속성의 메시지 아이콘 패널을 클릭 :

Messages

메시지 목록을 아래로 스크롤하고 WM_PAINT을 찾습니다. 그런 다음 드롭 다운 화살표를 클릭하고 추가 할 수있는 옵션을 선택합니다

WM_PAINT

을 당신이 볼 수 있듯이, 모든 필요한 코드를 삽입했습니다이 도움이

New Code

희망을.