입력 / 동적으로 Visual Studio MFC 편집 컨트롤에서 텍스트 변경
Visual Studio 2019에서 사용자가 입력하는 동안 텍스트를 수정하는 MFC C ++ 앱을 설정하려고합니다.
현재 레이아웃은 2 개의 라디오 버튼입니다.
ID = rdbOn
(그룹 =로 설정 True
, 값 int 변수 m_isOn
= 1
)
ID = rdbOff
, m_isOn
값은 =0

및 1 Edit Control, ID = txtInputBox
, 값 CString
변수 포함m_inputString
현재 테스트를 위해 클릭시 버튼이 어떻게 작동하는지 확인할 수 SetDlgItemText
있습니다. 다음과 같은 결과가 필요합니다. 그러나 그것은 그들이 타이핑하는 동안이 아니라 타이핑을 한 후일 것입니다.
void Onsomebtnclick()
{
//convert CString to String of m_inputString
//do some string manipulation
//convert back to CString
//SetDlgItemText(txtInputBox, result)
}
업데이트 : 도착 EN_CHANGE일에는 내가 얻을 수있었습니다 EN_CHANGE
사용자 @GoGoWorx에서 플래그 제안 작업. 그러나 이제 커서가 편집 컨트롤의 시작 부분으로 돌아 간다는 약간의 문제가 txtInput
있습니다.
a 사용에 대해 읽고 CEdit::SetSel
있지만 내 코드에서 직접 사용하는 방법을 모르겠습니다. SetWindowText 뒤에 커서를 문자열 끝에 놓고 CEdit 컨트롤 MFC를 시도했습니다.
someDlg::someFunction()
{
//some logic stuff to get a result string
SetDlgItemText(txtInputBox, result);
//need it to set the cursor to the end
//I tried these, but it didn't recognize (expression must have class type?)
//txtInputBox.SetSel(0, -1);
//txtInputBox.SetSel(-1);
}
답변
ON_EN_CHANGE
메시지 맵 알림 을 사용해야하는 것 같습니다 (예 : 입력 또는 붙여 넣기로 인해 컨트롤이 업데이트 된 후 호출 됨).
BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
ON_EN_CHANGE(IDC_EDIT_CONTROL, &CMyDialog::OnEnChangeEditControl)
END_MESSAGE_MAP()
void CMyDialog::OnEnChangeEditControl()
{
// Copy or call your Onsomebtnclick() here
}
일반적으로 대문자 정의이므로 편집 컨트롤의 숫자 식별자로 무엇을 사용하고 있는지 잘 모르겠습니다. IDC_EDIT_CONTROL
위의 정의를 정의로 바꿉니다 (가능 txtInputBox
하지만 다시 말하지만 일반적으로 대문자 이므로 확실하지 않습니다. ).
또한 CMyDialog
대화 클래스의 이름 도 변경 하십시오.
우리가 사용하고있는 것을 참고 ON_EN_CHANGE대신의 여기에 메시지 맵 핸들러를 ON_EN_UPDATE
때문에, ON_EN_CHANGE
메시지를 보낸 후에 반면, 컨트롤이 업데이트되었습니다 ON_EN_UPDATE
바로 호출 하기 전에 이 업데이트됩니다.
메시지 맵 처리기는 컨트롤 설명서 의 설명 섹션에 설명되어 CEdit
있습니다.https://docs.microsoft.com/en-us/cpp/mfc/reference/cedit-class?view=msvc-160
사용자가 입력 할 때 항목을 수정하는 것에 대한 우려와 관련하여-모든 변경 (키 입력 또는 클립 보드에서 붙여 넣기 등)이이 핸들러를 호출하여 필요한 것을 변경할 수 있기 때문에 괜찮습니다. 컨트롤을 업데이트 할 때 ON_EN_CHANGE
다시 트리거하지 않고 재귀 적 '변경'루프로 끝나도록하십시오.
사용자와 달리 컨트롤을 업데이트하는 사람임을 나타내는 일종의 플래그를 사용하여이 작업을 수행 할 수 있지만 CEdit
원하는 작업을 수행하기 위해 컨트롤을 하위 클래스 로 만드는 것이 좋습니다. 이를 수행하는 방법에 대한 몇 가지 예가 있습니다 (소리만큼 어렵지 않습니다). 예를 들면 다음과 같습니다.https://www.codeproject.com/Articles/27376/Avoiding-EN-CHANGE-notifications