Invalid Region(무효화 영역) 복구

예갈조·2024년 12월 5일

Tumor Track Project

목록 보기
4/25

문제


  • 다이얼로그 사이즈 변경 전

  • 다이얼로그 사이즈 변경 후



Invalid Region


  • 창의 일부가 변경되었거나 다시 그려야 할 필요가 있는 영역
  • 창의 크기를 조정하거나 다른 창이 위로 겹쳤다가 사라질 때 무효화 영역이 생성됨
  • WM_PAINT 메시지를 통해 복구 가능
    • WM_PAINT 메시지 발생 = 무효화 영역 발생



복구


void CTumorTrackDlg::OnPaint()
{
	CPaintDC dc(this);

	if (IsIconic())
	{
		//CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트입니다.

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다.
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 아이콘을 그립니다.
		dc.DrawIcon(x, y, m_hIcon);
	}

	else
	{
		CDialogEx::OnPaint();
		// 여기에서 Picture Contorl 초기 색상 정의할 수 있음

		**// 무효화 영역 복구 코드
		if (!m_matImage.empty())
		{
			// InvalidateRect(&rect, TRUE); // 부분 무효화 영역 처리 -> 성능 최적화
			DrawImage();
		}**
	}
}
  • OnPaint() method에 작성
    • MFC에서 창이나 대화 상자의 그리기 작업을 처리하는 핵심 메서드
    • Windows에서 창의 클라이언드 영역이 무효화되었을 때 WM_PAINT 메시지가 발생 → 이를 처리하기 위해 MFC 프레임워크가 OnPaint 호출
  • 현재 이미지가 없을 때(잘렸을 때) 그냥 이미지를 다시 그려주는 방식으로 해결함
  • DrawImage() code
    void CTumorTrackDlg::DrawImage() {
    	// 디바이스 컨텍스트(CDC) 생성
    	CClientDC dc(GetDlgItem(IDC_STATIC_IMAGE2));
    
    	// 컨트롤 크기 가져오기
    	CRect rect;
    	GetDlgItem(IDC_STATIC_IMAGE2)->GetClientRect(&rect);
    
    	// 이미지 확대/축소 시 픽셀 보간 방식 설정
    	SetStretchBltMode(dc.GetSafeHdc(), COLORONCOLOR);
    	
    	// 이미지 데이터 출력
    	// OpenCv 이미지 데이터를 GDI로 변환하여 Picture Contorl에 출력
    	StretchDIBits(dc.GetSafeHdc(), 0, 0, rect.Width(), rect.Height(),
    		0, 0, m_matImage.cols, m_matImage.rows, m_matImage.data, m_pBitmapInfo,
    		DIB_RGB_COLORS, SRCCOPY);
    }
    • 해당 함수는 단순히 MFC 환경에서 OpenCV 이미지 데이터를 Picture Control에 출력함
    • 위의 코드에서 Picture Contorl ID: IDC_STATIC_IMAGE2
    • 간단 GDI 설명
      • 그래픽 및 텍스트를 출력 장치에 출력하는 데 사용함
      • 하드웨어와 애플리케이션 간의 중간 계층 역할
      • 개발자는 하드웨어의 세부 사항을 알지 않고도 그래픽 작업 수행 가능





참고링크

WM_PAINT 메세지에 대하여...

DC와 무효화 영역

0개의 댓글