2016-05-31 8 views
0

사용자가 입력을 놓친 경우 일부 정보를 수신하는 MainFrame의 왼쪽 구석에 오버레이 고정 위치 지정 윈도우 ("PopUp")를 표시해야하는 Windows 응용 프로그램에서 작업하고 있습니다. 또는 특정 작업이 성공적으로 수행 된 경우.C++ MFC 윈도우 (프레임) 조작

"PopUp"제목 표시 줄에는 제목 옆에 아이콘 (예 : -> 아이콘 < - "오류")과 표준 X- 닫기 버튼이 있어야합니다. ClientArea에는 발생한 Message에 대한 설명 텍스트가 있습니다.

이 또한 팝업의 표준 국경이

은 "팝업"하여 CWnd에서 파생 WS_VISLBE 만들어집니다 (기본 창 경계보다 작은) x 1 픽셀로 설정해야한다 | WS_CLIPSIBLINGS | WS_CHILD | 응용 프로그램 MainFrame 창의 OnCreate- 메서드에서 WS_CAPTION

이제 내 팝업의 기본 테두리를 설정/축소하고 아이콘을 PopUp의 제목 표시 줄에 추가해야합니다.

누군가 내 문제를 해결할 수있는 몇 가지 예제 코드를 제공 할 수 있습니까? 저는 C++과 MFC에 대한 새로운 연구를 통해 지금까지 제 연구가 나를 https://msdn.microsoft.com/en-us/library/windows/desktop/bb688195(v=vs.85).aspx 으로 데려왔지만 어디서 어떻게 DwmExtendFrameIntoClientArea()를 사용하는지 알지 못했습니다. 그러나 지금까지 Dwm이 할 수있는 방법이라고 생각했습니다. 두 문제를 해결하거나 또 다른/전혀 다른 방식으로 있습니까? 나는 올바른 길을 가고 있는가?

+0

'WS_CHILD' 윈도우 스타일을 가진 윈도우는 자식 윈도우입니다. 하위 창은 팝업 창의 반대입니다 ([창 유형] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms632599.aspx#types) 참조). 그것은 당신이 정말로 원하는 것이 확실하지 않습니다. – IInspectable

+0

그 WS_CHILD! = WS_POPUP thats 왜 항상 인용 부호로 그냥 이름이 아닌 스타일을 나타 내기 위해 넣어 ... 그 WS_CHILD 원인 ("팝업") 항상 안에 있어야합니다. MainFrame 창. 상태 표시 줄의 ButtonClick을 사용하여 열 수 있으며 기본 프레임 클라이언트 영역의 왼쪽 하단 영역을 오버레이합니다. 메인 프레임에 있지만 오버레이 된 부분은 모두 클릭 할 수 있습니다. 해당 창 ("팝업")의 경우 제목 표시 줄에 Icon이 있어야하고 기본 창 테두리가 왼쪽 하단에 있고 오른쪽이 1px –

+0

으로 설정되어 있는지 확인하십시오. http://stackoverflow.com/questions/410720/can-i-change-the-thickness -of-the-border-of-a-window-with-mfc?rq = 1 OP는 내가하는 것과 같은 목적을 가지고 있지만 유감스럽게도 제공된 답은 힌트를 제공 할뿐 코드 샘플은 어디에서 시작해야하는지 알 수 있습니다. (내 목표를 보관하려면 WM_NCPAINT에서 어떤 멤버를 조작해야하는지 모르겠다.) –

답변

1

마지막으로 WM_NCCALCSIZE 처리를 무시하여 기본 Windows Border를 축소 할 수있었습니다.

제목 표시 줄에 아이콘을 넣는 방법을 해결하자마자이 답변을 업데이트하겠습니다.

원하는 윈도우의 사용자 MessageMap에 ON_WM_NCCALCSIZE()를 추가하고 다음과 같이 OnNcCalcSize는() (클래스 마법사가이를 설정하는 데 도움이 될 것입니다) 구현 :

지금부터 나는 창문 경계를 축소하는 방법을 설명 할 것이다
void YourCWndClass::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp) 
{ 

    if (bCalcValidRects){ 
     CRect rcClient, rcWind; 
     GetClientRect(&rcClient); 
     GetWindowRect(&rcWind); 


     int border = (rcWind.right - rcWind.left - rcClient.right)/2 - 1; 
     //-1: leaves 1px of the Windows Default Border Width erase to have no border 

     lpncsp->rgrc->left -= border; 
     lpncsp->rgrc->right += border; 
     lpncsp->rgrc->bottom += border; 
    } 

    CWnd::OnNcCalcSize(bCalcValidRects, lpncsp); 
} 

WM_NCCALCSIZE 메시지는 Create()/CreateEx()를 호출 할 때 창 생성시 보내지 만이 시점에서 GetClientRect() 및 GetWindowRect()는 적절한 값을 반환하지 않으므로 Bool 매개 변수를 확인하십시오!

rounded windowframe illustration

:

바로

if (!m_MessagePopOver->Create(NULL, NULL, WS_CHILD | WS_CLIPSIBLINGS | WS_CAPTION, rect, this, NULL, NULL)){ 
     TRACE0("failed to create MessagePopOver"); 
    } 

m_MessagePopOver->SetWindowPos(&wndTop, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); 

이이 같은 윈도우가 발생합니다 윈도우 생성 후) (적절한 창 사각형 호출을 SetWindowPos와 함께 작동 할 수 있도록 다른 WM_NCCALCSIZE를 트리거하려면