닫기 버튼이나 시스템 메뉴를 제거하지 않고 Windows 제목 표시줄에서 아이콘을 제거하시겠습니까?

StackOverflow https://stackoverflow.com/questions/10059

문제

저는 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로 설정하면 됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top