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 프로그램 설계에 도움이 되었으면 합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.