최대 화, 최소 화, 닫 기 단추


 개술
최대 화, 최소 화, 닫 기 단 추 는 창 에서 가장 중요 한 요소 입 니 다.먼저, 그들 이 버튼 이 라 고 말 하 는 것 은 사실 정확 하지 않 습 니 다. 단 추 는 창 입 니 다. 이 세 구성 요 소 는 창 이 아니 라 창 에서 흔히 볼 수 있 는 구성 부분 입 니 다.습관 적 인 이유 로 여기 서 는 그들 을 버튼 이 라 고 부른다.
이 세 단 추 를 표시 할 지 여 부 는 창 에서 만 만 만 들 수 있 을 것 같 습 니 다.우선, 이 세 개의 단 추 를 표시 하려 면 창 에 제목 표시 줄 과 시스템 메뉴 가 있어 야 합 니 다. 제목 표시 줄 과 시스템 메뉴 가 없 는 창 은 이 세 개의 단 추 를 표시 할 수 없습니다. 즉, 이 세 개의 단 추 를 가 지 려 면 창 을 만 들 때 WS 가 있어 야 합 니 다.CAPTION 과 WSSYSMENU 스타일.창 을 만 들 때 스타일 WSMAXIMIZEBOX 시 창 에 최대 화 단 추 를 표시 합 니 다. 스타일 이 있 으 면 WSMINIMIZEBOX 는 창 에 최소 화 단 추 를 표시 하고 제목 표시 줄 이 있 고 시스템 메뉴 가 있 으 면 닫 기 단 추 는 반드시 표 시 됩 니 다.
이 세 단추 에 대한 조작 은 흔히 시스템 메뉴 로 이 루어 진다. 이것 은 왜 이 세 단 추 를 표시 하려 면 시스템 메뉴 가 있어 야 하 는 지 설명 한다.일반적으로 창 에 최대 화 버튼 이 있 을 때 시스템 메뉴 에 도 해당 하 는 메뉴 항목 이 있 습 니 다. 이 메뉴 항목 의 동작 은 일반적으로 이 버튼 에 반 환 됩 니 다.시스템 메뉴 에서 최대 화 버튼 의 ID 는 SC 입 니 다.MAXIMIZE, 최소 화 단 추 는 SCMINIMIZE, 닫 기 단 추 는 SCCLOSE.창 이 최대 화 상태 일 때 시스템 메뉴 SCMAXIMIZE 는 변경 되 고 금 지 됩 니 다. 이때 최대 화 단 추 는 복구 단추 로, ID 는 시스템 메뉴 의 SC 로 변 경 됩 니 다.RESTORE.
잿빛 으로 변 하 다
일반적으로 기능 적 으로 볼 때 인터페이스 요 소 는 사용 가능 (Enabled) 과 금지 (Disabled) 두 가지 상태 가 있 습 니 다. 인터페이스 요소 가 사용 가능 한 상태 에 있 을 때 사용 자 는 사용 할 수 있 습 니 다. 그렇지 않 으 면 사용 자 는 사용 할 수 없습니다.한편, 외관 의 색채 측면 에서 볼 때 인터페이스 요 소 는 회색 상태 (Grayed) 와 일반 상태 두 가지 상태 가 있 는데 보통 할 수 있 는 인터페이스 요 소 는 회색 이 아니 라 금 지 된 인터페이스 요 소 는 회색 이 어야 한다.
이 세 개의 단추 도 마찬가지 입 니 다. 이상 하 게 도 이 세 개의 단 추 는 시스템 메뉴 를 통 해 작 동 하지만 일반 메뉴 항목 과 완전히 일치 하지 않 는 것 같 습 니 다. 하나의 메뉴 항목 을 사용 할 수 있 는 동작, 금지, 회색 으로 만 드 는 동작 은 EnableMenu Item 을 통 해 이 루어 집 니 다. 일반적으로 하나의 메뉴 항목 ID MY MENU 를 사용 할 수 있 는 코드 는 다음 과 같 습 니 다.
       EnableMenuItem(hMenu,ID_MY_MENU,MF_BYCOMMAND|MF_ENABLED);
                             CMenu     
       pMenu->EnableMenuItem(ID_MY_MENU,MF_BYCOMMAND|MF_ENABLED);

회색 으로 변 하 는 것 을 금지 하고 동시에 사용 하 는 코드 는:
       EnableMenuItem(hMenu,ID_MY_MENU,MF_BYCOMMAND|MF_GRAYED|MF_DISABLED);
                             CMenu     
       pMenu->EnableMenuItem(ID_MY_MENU,MF_BYCOMMAND|MF_GRAYED|MF_DISABLED);

주의: 일반적인 시각 적 효과 에서 회색 으로 변 하 는 것 과 금 지 는 함께 작용 하지만, 실제로 내부 적 으로 이 두 가 지 는 한데 묶 이지 않 고 MF GRAYED | MF DISABLED 를 동시에 설정 해 야 두 가지 기능 이 동시에 작용 합 니 다. 그렇지 않 으 면 MF GRAYED 만 사용 하면 회색 으로 변 하 는 것 만 금지 되 지 않 으 며, MF DISABLED 만 사용 하면 회색 으로 변 하지 않 습 니 다.
후속 글 은 네티즌 댓 글 에 따라 수정 되 었 습 니 다.
이 코드 는 메뉴 항목 에 항상 효과 가 있 고 닫 기 단추 에 도 효과 가 있 지만 최대 화 와 최소 화 단추 에는 전혀 효과 가 없습니다. 시스템 메뉴 에 상기 코드 를 적용 한 후 시스템 메뉴 의 대응 항목 의 상 태 는 올 바 르 게 바 뀌 었 지만 창 두 단추 의 기능 과 외관 은 변 하지 않 았 습 니 다.
회색 으로 변 하 는 두 단추 중 하 나 를 금지 하고 회색 으로 변 하 는 유일한 방법 은 시스템 메뉴 에서 이 메뉴 항목 을 삭제 하 는 것 입 니 다. 코드 는 다음 과 같 습 니 다.
         CMenu* pSysMenu = GetSystemMenu(FALSE);
         ASSERT_VALID(pSysMenu);
         if(NULL == pSysMenu)
         {
                return;
          }
          pSysMenu->DeleteMenu(SC_MINIMIZE,MF_BYCOMMAND);

단 추 를 누 를 수 있 도록 시스템 메뉴 에 이 단추 에 대응 하 는 항목 을 추가 해 야 합 니 다. 코드 는:
         CMenu* pSysMenu = GetSystemMenu(FALSE);
         ASSERT_VALID(pSysMenu);
         if(NULL == pSysMenu)
         {
                return;
          }
          pSysMenu->AppendMenu(MF_STRING,SC_MINIMIZE,_T("   (&N)"));

메시지 처리
이 세 가지 메시지 에 대한 응답 도 시스템 메뉴 의 경 로 를 통 해 처 리 됩 니 다. 시스템 메뉴 의 모든 항목 은 메시지 WM SYSCOMMAND 를 통 해 처 리 됩 니 다. 이 메시지 의 wParam 은 처리 해 야 할 메시지 형식 을 포함 하고 있 습 니 다. 그 의 미 는 다음 과 같 습 니 다.
값.
속뜻
SC_CLOSE
닫 기 단추
SC_MAXIMIZE
최대 화 단추
SC_MINIMIZE
최소 화 단추
SC_RESTORE
복구 버튼
여기 에는 세 개의 단추 와 관련 된 설명 만 열거 되 어 있 으 며, 기타 값 의 설명 은 독자 가 MSDN 을 읽 어 주 십시오.
이 세 단 추 를 스스로 캡 처 하기 위해 서 는 WM SYSCOMMAND 메 시 지 를 처리 해 야 합 니 다. 다음 코드 예 시 는 SC MINIMIZE 메 시 지 를 처리 하고 작업 표시 줄 에 대화 상 자 를 숨 기 는 일반적인 동작 입 니 다.
void CTdDlg::OnSysCommand(UINT nID, LPARAM lParam)
{

   
   
   
   
if ((nID & 0xFFF0) == IDM_ABOUTBOX) {
CAboutDlg dlgAbout; dlgAbout.DoModal();
} else if(nID == SC_MINIMIZE) {
NOTIFYICONDATA nid; nid.cbSize = sizeof(nid); nid.hIcon = m_hIcon; nid.hWnd = GetSafeHwnd(); GetWindowText(nid.szTip ,sizeof(nid.szTip )); nid.uCallbackMessage = WM_NOTIFY_ICON_MESSAGE; nid.uFlags = NIF_MESSAGE|NIF_TIP|NIF_ICON; nid.uID = 1; ShowWindow(SW_HIDE); Shell_NotifyIcon(NIM_ADD,&nid);
}else{
CDialog::OnSysCommand(nID, lParam);
}
}

대화 상자 의 SC CLOSE 단추 에 대해 서 는 OnCancel 호출 이 부족 합 니 다. 사용 자 는 위의 코드 를 본 떠 서 OnCancel 을 호출 하지 않 습 니 다.

좋은 웹페이지 즐겨찾기