설비 환경 류: CDC 류, CPaintDC 류, CClientDC 류, CWindowDC 류 총괄

6629 단어
  • DC    :   장치 환경 (장치 컨 텍스트)
  •                      1.  장치 환경 은 Window 내부 의 데이터 구조 로 특정한 장치 와 관련 된 그리 기 속성 정 보 를 저장 합 니 다.
                         2.  모든 그리 기 호출 은 장치 환경 dc 를 통 해 이 루어 져 야 합 니 다.이 대상 들 은 선, 도형, 텍스트 를 그 리 는 Window API 를 패키지 합 니 다.
                         3. 설비 환경 허용 Window 는 장치 에서 장치 와 무관 하 게 그립 니 다.
                         4. 장치 환경 은 화면, 프린터 에 메타 파일 을 그 릴 수 있 습 니 다.
  • HDC :   장치 환경 핸들
  •                      dc 대상 이 Window 내부 에 있 는 위 치 를 가리 키 는 포인터 형식 입 니 다.
  • CDC, CClientDC, CPaintDC, CWindowDC 의 파생 관계
  •          
    ------------------------------------------------------------------------------------------------------------------
    1. CDC 류
            Window 는 장치 와 무관 한 장치 환경 dc 를 사용 하여 표시 합 니 다.MFC 기초 라 이브 러 리 는 설비 환경 대상 클래스 를 정의 합 니 다.  CDC
           :
    CDC::CDC()
    {
        m_hDC        = NULL;
        m_hAttribDC  = NULL;
        m_bPrinting  = FALSE;
    }
    
           :
    CDC::~CDC()
    {
        if (m_hDC != NULL)
            ::DeleteDC(Detach());
    }
    

        
    주의해 야 할 것 은 CDC 대상 을 생 성 할 때 파생 클래스 처럼 구조 함수 에서 해당 하 는 Windows 장치 컨 텍스트 핸들 을 가 져 오 는 것 이 아 닙 니 다.
    따라서: GetDC 등 함 수 를 사용 하여 장치 설명 표를 가 져 오지 않 고 BOOL Create CompatibleDC (CDC * pDC) 를 사용 하여 장치 설명 표를 만 드 는 것 이 좋 습 니 다.
    ... 에 있다 CDC 분석 함수 에서 장치 설명 표 핸들 이 비어 있 지 않 으 면 DeleteDC 를 사용 하여 삭제 합 니 다.이것 은 CDC 를 직접 사용 할 때 윈도 장치 설명 표를 만 드 는 것 이 가장 좋 은 이유 다.
    장치 설명 표 가 생 성 되 지 않 았 다 면 분석 함수 가 호출 되 기 전에 장치 설명 표 핸들 을 분리 하고 사용 해 야 합 니 다.: RealeaseDC 방출, 방출 후 mhDC 가 비어 있 으 면 석조 함수 호출 시 실행 되 지 않 습 니 다: deleteDC.
    물론 CDC 의 파생 클래스 인 석조 함수 가 CDC 의 석조 함 수 를 호출 하 는 것 은 걱정 할 필요 가 없다. 왜냐하면 CDC:: ~ CDC () 는 가상 석조 함수 가 아니 기 때문이다.
     
    CDC 를 사용 하 는 방법 은 두 가지 가 있 습 니 다.
     
    //  1.  CWnd::GetDC()    CDC  
    CDC		*pDC = GetDC();
    pDC->MoveTo(m_ptOrigin); 
    pDC->LineTo(point); 
    ReleaseDC(pDC);
    
    //  2.CreateCompatibleDC(CDC* pDC )     CDC   
    //        dc          DC。        
    CDC		dcMem; 
    dcMem.CreateCompatibleDC(&dc);			//       
    pbmOld = dcMem.SelectObject(&m_bmBall);	//         
    
    …//       
    
    dcMem.SelectObject(pbmOld);				//          
    dcMem.DeleteDC();						//     ,              

     
     
     
    2, CClientDC 클래스
           CClientDC 클래스 는 구조 함수 에서 Window API 함수 GetDC () 를 호출 하고, 분석 함수 에서 ReleaseDC () 를 호출 합 니 다.
           CClientDC 클래스 는 클 라 이언 트 구역 에서 만 그림 을 그 릴 수 있 습 니 다.면 이른바 클 라 이언 트 구역 이란 창 영역 에서 테두리, 제목 표시 줄, 메뉴 표시 줄, 도구 모음, 상태 표시 줄 등 이외 의 부분 을 제거 하 는 것 을 말한다.
           그것 은 사용자 가 조작 할 수 있 는 구역 이다.
           CClientDC 클래스 의 창 핸들 은 구성원 변수 m 에 저 장 됩 니 다.hwnd 는 CClientDC 를 구성 하기 위해 CWnd 를 매개 변수 로 구조 함수 에 전달 해 야 합 니 다. 
        CClientDC 를 사용 하여 그림 을 그 릴 때, 일반적으로 GetClient Rect () 함 수 를 호출 하여 클 라 이언 트 영역의 크기 를 가 져 옵 니 다.
    //CClientDC : public CDC    :      GetDC()          ReleaseDC 
    // CClientDC dc(GetParent());	GetParent view        frame          
    CClientDC dc(this);  		//    DC 
    dc.MoveTo(m_ptOrigin); 
    dc.LineTo(point);

     
    3. CPaintDC 클래스
            CPaintDC 창 다시 그리 기 메시지 (WM PAINT) 에 응답 하 는 그래 픽 출력 입 니 다.
            CPaintDC 는 구조 함수 에서 BeginPaint () 를 호출 하여 장치 컨 텍스트 를 가 져 오고 분석 함수 에서 호출 합 니 다. EndPaint () 장치 컨 텍스트 를 방출 합 니 다.
            EndPaint () 는 장치 컨 텍스트 를 방출 하 는 것 외 에 메시지 큐 에서 WM 를 제거 하 는 것 도 책임 집 니 다.PAINT 소식.
            따라서 창 을 다시 그 릴 때 CPaintDC 를 사용 해 야 합 니 다. 그렇지 않 으 면 WMPAINT 메 시 지 는 메시지 큐 에서 지 울 수 없 으 며 끊 임 없 는 창 을 다시 그립 니 다.
            CPaintDC 도 WM 에 만 사용 할 수 있 습 니 다.PAINT 메시지 처리 중 입 니 다.
    // MFC  CView   WM_PAINT          :
    void CView::OnPaint()
    {
    	// standard paint routine
    	CPaintDC dc(this);
    	OnPrepareDC(&dc);
    	OnDraw(&dc);
    }
    
    //       CPaintDC     dc,                 ;
    //          ,              ,         ,            。
    
    //          ,  
    
    CPaintDC *pDC;
    pDC = new CPaintDC(this)
    
    //        , delete  pDC:
    delete pDC;

     
     
    4, CWindowDC 클래스
           CWindowDC 대상 구조 시 윈도 호출 API 함수 GetWindowDC, 분석 시 해당 API 함수 ReleaseDC 를 호출 합 니 다.
           이 는 CWindowDC 대상 이 CWnd 가 가리 키 는 전체 화면 영역 에 접근 할 수 있 음 을 의미 합 니 다. 
           CWindowDC 는 모니터 의 임의의 위치 에 그림 을 그 릴 수 있 습 니 다.좌표 원점 은 전체 창의 왼쪽 상단 에 있다. 
           CWindowDC 를 사용 하여 그림 을 그 릴 때, 일반적으로 GetWindowRect 함 수 를 호출 하여 전체 프로그램의 창 영역 크기 를 가 져 옵 니 다. 
           CWindowDC 클래스 의 창 핸들 은 구성원 변수 m 에 저 장 됩 니 다.hwnd 는 CClientDC 를 구성 하기 위해 CWnd 를 매개 변수 로 구조 함수 에 전달 해 야 합 니 다. 
    // CWindowDC      CDC   、      ClientDC 。                      
    // CWindowDC dc(GetParent());			                             
    // CWindowDC dc(GetDesktopWindow());	                
    CWindowDC dc(this);  //       
    dc.MoveTo(m_ptOrigin); 
    dc.LineTo(point);

     
    =================================================
     
    첨부: 윈도 프로그램 설계 가 도형 기초 에 대한 설명: 
    1. 장치 컨 텍스트 핸들 가 져 오기
           윈도 는 장치 상하 문 핸들 을 얻 는 몇 가지 방법 을 제공 했다.메 시 지 를 처리 할 때 장치 컨 텍스트 핸들 을 얻 었 다 면 창 함 수 를 종료 하기 전에 풀 어야 합 니 다 (또는 삭제).
           일단 핸들 을 풀 면 그것 은 더 이상 효과 가 없다.프린터 장치 컨 텍스트 핸들 에 대해 서 는 규칙 이 이렇게 엄격 하지 않 습 니 다.
           장치 컨 텍스트 핸들 을 가 져 오고 방출 하 는 데 가장 많이 사용 되 는 방법 은 WM 를 처리 하 는 것 입 니 다.PAINT 메시지 의 경우 BeginPaint 와 EndPaint 호출 을 사용 합 니 다.
           hdc = BeginPaint(hwnd, &ps);   
           // 기타 조작
           EndPaint(hwnd, &ps); 
          그 중에서 ps 는 PAINT STRUCT 구조 대상 이 고 이 구조의 hdc 필드 는 BeginPaint 가 전달 하 는 장치 컨 텍스트 핸들 이 며 PAINT STRUCT 구 조 는 rcPaint 라 는 RECT (사각형) 구 조 를 포함한다.
         rcPaint 는 창 을 둘 러 싼 영역 이 잘못된 사각형 을 정의 합 니 다.BeginPaint 에서 얻 은 장치 컨 텍스트 핸들 을 사용 하여 이 영역 에서 만 그림 을 그 릴 수 있 습 니 다.BeginPaint 호출 은 이 영역 을 유효 하 게 합 니 다.
     
         윈도 프로그램 은 비 WM 도 처리 할 수 있 습 니 다.PAINT 메시지 에서 장치 컨 텍스트 핸들 가 져 오기
         hdc = GetDC(hwnd);
         // 기타 조작
         ReleaseDC(hwnd, hdc);
     
         이 장치 의 컨 텍스트 는 창 핸들 이 hwnd 인 디 스 플레이 영역 에 적 용 됩 니 다.
         이 호출 과 BeginPaint 와 EndPaint 의 조합 간 의 차 이 는 GetDC 에서 전 송 된 핸들 을 이용 하여 전체 디 스 플레이 영역 에 그림 을 그 릴 수 있다 는 것 이다.
         물론 GetDC 와 ReleaseDC 는 디 스 플레이 영역 에서 가능 한 모든 잘못된 영역 을 유효 하 게 만 들 지 않 습 니 다.
     
         Windows 프로그램 은 전체 창 에 적용 되 는 장치 컨 텍스트 핸들 도 얻 을 수 있 습 니 다.
         hdc = GetWindowDC(hwnd);
         // 기타 조작
         ReleaseDC(hwnd, hdc);
       
         이 장치 의 컨 텍스트 는 디 스 플레이 영역 외 에 창의 제목 표시 줄, 메뉴, 스크롤 바, 프레임 도 포함 되 어 있 습 니 다.
         GetWindowDC 함 수 는 거의 사용 되 지 않 습 니 다. 사용 하려 면 WM 를 차단 해 야 합 니 다.NCPAINT 소식,
         윈도 는 이 메 시 지 를 사용 하여 창의 비 디 스 플레이 영역 에 그림 을 그립 니 다.
         BeginPaint, GetDC, GetWindowDC 에서 얻 은 장치 의 상하 문장 손 잡 이 는 모두 모니터 의 특정한 창 과 관련 이 있다.
         장치 컨 텍스트 핸들 을 가 져 오 는 또 다른 일반적인 함 수 는 CreateDC 입 니 다.
         hdc = CreateDC(pszDreiver, pszDevice, pszOutput, pData);
         // 기타 조작
         DeleteDC(hdc);
         .......
     
     

    좋은 웹페이지 즐겨찾기