닫기 버튼이나 시스템 메뉴를 제거하지 않고 Windows 제목 표시줄에서 아이콘을 제거하시겠습니까?
-
08-06-2019 - |
문제
저는 MFC 응용 프로그램을 개발 중이며 최근 Windows 제목 표시줄에서 아이콘을 제거하면서도 닫기 버튼은 유지하는 좋은 방법을 찾고 있습니다.두 가지 확실한 후보 솔루션은 시스템 메뉴 스타일을 끄거나 도구 창 스타일을 사용하는 것이지만, 시스템 메뉴를 비활성화하거나 축소된 도구 창 제목 표시줄을 사용하지 않는 것을 선호합니다.많은 MFC 응용 프로그램에는 이 기능이 있으므로 다음 사항이 궁금합니다.이 작업을 수행하는 표준 방법이 누락 되었습니까?
해결책
당신이 사용할 수있는 WM_NCRBUTTONDOWN
사용자가 캡션을 마우스 오른쪽 버튼으로 클릭했는지 감지한 다음 시스템 메뉴를 표시합니다.
다른 팁
세트 WS_EX_DLGMODALFRAME
확장된 스타일.
완전히 투명한 아이콘을 사용할 수 있습니다.
시스템 메뉴를 제거한 다음 다른 위치(예: 닫기 버튼 옆 등)에 다시 놓는 것은 어떻습니까?
아이콘이 없으면 사용자가 시스템 메뉴에 액세스할 수 있는 유일한 방법은 제목 표시줄을 마우스 오른쪽 버튼으로 클릭하는 것입니다.
그것이 당신이 염두에 둔 것이라면 메인 프레임에서 WM_RBUTTONDOWN을 처리한 다음 제목 표시줄에서 마우스 오른쪽 버튼 클릭이 있었는지 계산할 수 있습니다.
int clickX = GET_X_LPARAM(lParam);
int clickY = GET_Y_LPARAM(lParam);
CRect frameRect;
mainFrame.GetWindowRect(&frameRect);
int titleBarHeight = GetSystemMetrics(SM_CYCAPTION);
if (clickX >= frameRect.left &&
clickX <= frameRect.right &&
clickY >= frameRect.top &&
clickY <= frameRect.top + titleBarHeight)
{
TrackPopupMenu(m_systemMenu);
}
아이콘을 제거하는 Delphi의 샘플 코드:
const
WM_ResetIcon = WM_APP - 1;
type
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
protected
procedure WMResetIcon(var Message: TMessage); message WM_ResetIcon;
end;
implementation
procedure TForm1.FormShow(Sender: TObject);
begin
PostMessage(Handle, WM_ResetIcon, 0, 0);
end;
procedure TForm1.WMResetIcon(var Message: TMessage);
const
ICON_SMALL = 0;
ICON_BIG = 1;
begin
DestroyIcon(SendMessage(Handle, WM_SETICON, ICON_BIG, 0));
DestroyIcon(SendMessage(Handle, WM_SETICON, ICON_SMALL, 0));
end;
비슷한 코드가 MFC에서도 작동합니다.기본적으로 올바른 위치에서 WM_SETICON을 NULL로 설정하면 됩니다.
제휴하지 않습니다 StackOverflow