2012-03-04 2 views
2

MFC없이 일반 C++을 사용하여 응용 프로그램을 구현하고 있습니다. 맞춤 최소/최대/닫기 버튼을 추가하고 싶습니다.사용자 정의 최소 최대 닫기 버튼 구현

아래 코드는 제가 사용했던 코드입니다. HTCAPTION 및 기타 테두리 관련 정의에 대해서는 과 같이 작동하지만 HTMINBUTTON, HTMINBUTTON, HTCLOSE는 같은 방식으로 작동하지 않습니다. NCHITTEST를 적용하려면 구현해야 할 것이 있습니까?

// Defining min/max/close 
if ((p.x > rt.right - 130) && (p.x < rt.right - 104) && 
    (p.y > 41) && (p.y < 67)) 
    return HTMINBUTTON; 
else if ((p.x > rt.right - 100) && (p.x < rt.right - 74) && 
    (p.y > 41) && (p.y < 67)) 
    return HTMAXBUTTON; 
else if ((p.x > rt.right - 70) && (p.x < rt.right - 44) && 
    (p.y > 41) && (p.y < 67)) 
    return HTCLOSE; 

// Defining window border and caption 
else if ((p.x > EDGE) && (p.x < rt.right-EDGE) && 
    (p.y > EDGE) && (p.y < rt.bottom-EDGE)) 
    return HTCAPTION; 
else if (p.x <= EDGE && p.y <= EDGE) 
    return HTTOPLEFT; 
else if (p.x <= EDGE && p.y >= rt.bottom - EDGE) 
    return HTBOTTOMLEFT; 
else if (p.x >= rt.right - EDGE && p.y <= EDGE) 
    return HTTOPRIGHT; 
else if (p.x >= rt.right - EDGE && p.y >= rt.bottom - EDGE) 
    return HTBOTTOMRIGHT; 
else if (p.x <= EDGE) 
    return HTLEFT; 
else if (p.x >= rt.right - EDGE) 
    return HTRIGHT; 
else if (p.y <= EDGE) 
    return HTTOP; 
else if (p.y >= rt.top - EDGE) 
    return HTBOTTOM; 
else 
    return DefWindowProc(hWnd, message, wParam, lParam); 
+0

나는이 기사가 당신이하고있는 것과 비슷한 것을하고 있다고 생각한다 : http://www.codeproject.com/Articles/3728/C-does-Shell-Part-3 – gideon

+0

그것은 그렇게 본다. 그러나 그렇지 않다. C++ 소스. 여전히 적용 가능합니까? 나는 C#에 익숙하지 않다. –

답변

1

를 사용하여 프로그램의 전체 비 클라이언트 영역 그리기하는 경우, 당신의 최선의 선택은 기본 제목 표시 줄과 테두리를 제거하는 것 (즉. 사용자 정의 창 제목 표시 줄과 테두리가) 및 전체 클라이언트 영역을 창으로 사용하십시오. 이렇게하면 최소/최대/종료 버튼에 필요한 그래픽이있는 사용자 정의 버튼 (또는 소유자가 그린 버튼)을 만들고 버튼 컨트롤로 제목 막대 영역에 배치 할 수 있습니다. WM_NCHITTEST 메시지를 처리하기 때문에 제목 표시 줄과 테두리가있는 것처럼 프로그램이 계속 작동합니다. 난 그냥 내 사용자 지정 창을 가진이 정확한 일을 오늘 아주 잘 작동합니다.

편집 : HTMAX/HTMIN/HTCLOSE을 반환하면 창을 반응시키지 않는다는 내용을 추가하는 것을 잊어 버렸습니다. WM_NCHITTEST에서 반환 한 값은 다른 메시지, 특히 WM_NCLBUTTONDOWN 및 WM_NCLBUTTONUP의 WPARAM에서 전송됩니다. 제목 표시 줄을 클릭하면 마우스가 캡처되므로 WM_NCLBUTTONUP 메시지가 올바르게 전송되지 않습니다.

+0

그게 내가하고있는 일이지만, 당신이 말했듯이, HTMAX/HTMIN/HTCLOSE는 창을 반응시키지 않을 것이다. 나는 이것에 대한 해결책이 필요하다. –

0

저는 저에게 적합한 해결책을 가지고 있습니다. 여기

1. WM_NCHITTEST

가 WM_NCHITTEST 구독 재현하는 내 단계입니다. 이제 메시지를 처리하고 히트 테스트의 결과를 반환해야합니다.

이 당신을 도울 수 있습니다 나를 위해 http://msdn.microsoft.com/en-us/library/windows/desktop/ms645618(v=vs.85).aspx

내가 내 양식에 여러 영역을 만들었습니다. 은 좌상, 탑, TopRight, 캡션, 왼쪽, 오른쪽, BottomLeft, 아래쪽은 BottomRight, MinButton, MaxButton, closeButton으로

그들 각각은 사각형 내 형태의 영역을 정의한다. 간단히 마우스 커서가이 영역 중 하나에 있는지 확인하고 올바른 HT-CODE를 반환합니다.

2 WM_NCLBUTTONDOWN

지금 WM_NCLBUTTONDOWN에 가입. 처리 할 NCHITTEST 값을 WPARAM에서 확인하십시오. HTMINBUTTON (0x0008)에 대한 버튼 확인을 최소화하기 위해

그러나 여기서 간단히 결과에서 IntPtr.Zero를 반환합니다. 이 메시지를 처리했음을 나타냅니다.

3.

그 WM_NCLBUTTONUP에 가입 한 후 WM_NCLBUTTONUP

. WPARAM에서 목표 NCHITTEST 값을 확인하고 원하는 것을 여기에서 수행하십시오.

나중에 소스를 업로드합니다!