테두리와 초점 점선이 보이도록 CBUTTON으로 설정하는 방법은 무엇입니까?
문제
간단한 대화 기반 애플리케이션을 만들었고 Default Cdialog에서 Visual Studio 편집기를 사용하여 3 개의 버튼을 추가했습니다 (드래그 앤 드로핑).
기본 확인 및 취소 버튼도 있습니다.
버튼 3을 클릭하면 버튼 1으로 초점을 설정하고 싶습니다.
MUY 버튼의 속성에서 속성을 평평하게 설정했습니다.
나는 이것을 코딩했다 :
void CbuttonfocusDlg::OnBnClickedButton3()
{
// TODO: Add your control notification handler code here
GetDlgItem(IDC_BUTTON1)->SetFocus();
Invalidate();
}
그러나 Button1의 Boder는 결코 그려지지 않습니다. 캐럿 (초점을 나타내는 점선)은 버튼 3을 클릭하기 전에 언제든지 탭을 누르는 경우에만 그려집니다.
클릭 한 후에 보이는 것처럼 버튼이 정확히 보이기를 원합니다. 버튼 내부에 점선이 프로그램적으로 표시되면 플러스가됩니다.
내가 원하는 것 :
내가 얻는 것 :
해결책 3
이것은 버튼 주위에 두꺼운 테두리를 그립니다.
static_cast<CButton*>(GetDlgItem(IDC_BUTTON1))->SetButtonStyle(BS_DEFPUSHBUTTON);
더 우아한 방법은 CButtonFocusDLG에서 CBUTTON 멤버 변수를 정의하고 IDC_BUTTON1 컨트롤에 연결 한 다음
this->m_myButton.SetButtonStyle(BS_DEFPUSHBUTTON);
이렇게하면 초점을 설정하는 버튼이 기본 버튼을 설정하지만 버튼이 아닌 컨트롤 (대화 상자 내부)으로 이동하면 기본 버튼은 한 번 더 원래 기본 버튼이 설정되어 있습니다. 대화 자원,이 경우 "확인"버튼.
다른 팁
사용 WM_NEXTDLGCTL
.
보다 Reymond Chen의 "대화 상자에서 초점을 설정하는 방법":
void SetDialogFocus(HWND hdlg, HWND hwndControl)
{
SendMessage(hdlg, WM_NEXTDLGCTL, (WPARAM)hwndControl, TRUE);
}
UpdateWindow를 호출하면 초점 변경이 적용되기 전에 버튼이 다시 그려집니다. 무효는 그 자체로 충분해야하며, 모든 것이 정착되면 창문이 다시 칠해집니다.
나는 Joel의 제안을 따르고 있습니다. 그러나 해당 링크에 사용 된 API와 약간 다르지만 내 것은 다음과 같습니다.
postmessage (wm_nextdlgctl, (wparam) (pwnd-> getsafehwnd ()), true);