VC 원각 다이어로그를 만드는 방법

2674 단어
본고의 실례는 VC가 원각 다이어로그를 만드는 실현 방법을 설명했다.여러분에게 참고하도록 공유하겠습니다. 구체적으로는 다음과 같습니다.
우리는 때때로 원각의 대화상자가 필요하다. 이러한 효과를 실현하려면 일반적으로 두 가지 작업을 포함한다. 첫 번째 단계는 원래 대화상자의 직각을 잘라내는 것이다. 두 번째 단계는 대화상자에 원각을 그리거나 대화상자에 원각을 붙이는 그림이다.
첫 번째 단계: Oncreate 함수에서 구현되며 코드 양도 많지 않습니다.

int CTestDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDialog::OnCreate(lpCreateStruct) == -1)
      return -1;
    HRGN hRgn;
    RECT rect;
    ::GetWindowRect(hwnd, &rect);
    hRgn = CreateRoundRectRgn(0, 0, rect.right - rect.left + 1, rect.bottom - rect.top + 1, 5,5);
    ::SetWindowRgn(hwnd, hRgn, TRUE);
}


대화 상자가 Resize 를 지원한다면 OnSize 함수에서 위의 코드를 복사해야 합니다.
2단계: 필렛 부분의 다시 그리기는 대화상자의 비클라이언트 영역에 속하기 때문에 WM 에 응답해야 합니다.NCPAINT 메시지, 메시지 응답 함수에서 원각 그림을 붙이거나 원각선을 그립니다.

Void CTestDialog::OnNcPaint()
{
  CWindowDC dc(this);
  CRect rcWindow;
  CRect rcClient;
  this->GetClientRect(rcClient);
  this->ClientToScreen(rcClient);
  this->GetWindowRect(rcWindow);
  CPoint point = rcWindow.TopLeft();
  rcClient.OffsetRect(-point);
  rcWindow.OffsetRect(-point);
  int windowWidth = rcWindow.Width();
  int windowHeight = rcWindow.Height();
  HDC hMemDC = ::CreateCompatibleDC(dc.m_hDC);
  HBITMAP hBmp = ::CreateCompatibleBitmap(dc.m_hDC, windowWidth, windowHeight);
  ::SelectObject(hMemDC, hBmp);
  Graphics graphics(hMemDC);
  graphics.Clear(Color(255, 255, 255, 255));
  graphics.SetSmoothingMode(SmoothingModeHighQuality);
  //TODO: GDI+ DrawImage , RoundRect 
  #if 0 /* DrawImage */
  ImageAttributes ia;
  ia.SetWrapMode( WrapModeTileFlipXY );
  graphic.DrawImage(pImg_LTFrame,……….);
  #endif
  #if 0 /* RoundRect */
  RoundRect(hMemDC, rcWindow.left, rcWindow.top, rcWindow.right,rc.bottom, 5, 5 );
  #endif
  dc.IntersectClipRect(rcWindow);
  dc.ExcludeClipRect(rcClient);
  ::BitBlt(dc.m_hDC, 0, 0, windowWidth, windowHeight, hMemDC, 0, 0, SRCCOPY);
  ::DeleteDC(hMemDC);
  ::DeleteObject(hBmp);
}


원하는 효과를 얻기 위해 WM에 응답해야 할 수도 있습니다NCACTIVE 및 WMNOTIFY 두 메시지 응답 함수에서 OnNCPaint 함수와 같은 기능을 수행합니다.
그리고 중요한 소식이 하나 더 있습니다. WM.NCCALCSIZE, 이 메시지 응답 함수에서 주로 대화상자의 비 클라이언트 구역의 크기를 다시 계산합니다. 이 함수의 LPNCCALCSIZEPARAMS 유형 매개 변수인 lpncsp의 lpncsp->rgrc[0]는 클라이언트 구역의 크기를 설정하고 클라이언트 구역의 높이가 시간을 줄이면 비클라이언트 구역의 높이가 증가한다. 왜냐하면 대화상자의 전체 높이가 고정되어 있기 때문이다.원각 사각형을 만든 후에 클라이언트 구역이 크거나 작을 수 있습니다. 이 때 이 메시지 응답 함수에서 비 클라이언트 구역의 크기를 조정해야 합니다.
본고에서 서술한 것이 여러분의 VC 프로그램 설계에 도움이 되었으면 합니다.

좋은 웹페이지 즐겨찾기