2011-03-13 6 views
1

다음 스 니펫은 "WantReturn"이 설정된 여러 줄 CEdit 컨트롤의 OnChange() 핸들러에서 가져온 것입니다.Visual C++ CEdit 컨트롤 - SetWindowText()에 의해 삽입 지점이 변경되는 이유

void DLG::OnChangeEditPrepareTape() 
{ 
    CString ss; 
    std::vector<char> aTape; 
    m_prepareTape.GetWindowText(ss); 
    m_prepareTape.SetWindowText(ss); 
} 

SetWindowText()가 주석 처리 된 경우 사용자 텍스트가 오른쪽으로 작성되며 모두 정상입니다. 그러나 텍스트 삽입 점이 왼쪽 가장자리로 이동하고 사용자의 문자가 기존 문자의 왼쪽으로 이동합니다.

두 통화 사이에 약간의 텍스트를 넣고 싶습니다. 내가 CEdit 서브 클래 싱하여 원하는. 하지만 Get() & Set()에 의해 그것을 수행하는 방법이 있는지 알고 싶습니다.

서비스 팩 5와 함께 Visual C++ 6을 사용하고 있습니다. 11 세가되었지만 "소프트웨어는 마모되지 않습니다."라는 말처럼 :-).

답변

1

GetSel을 사용하여 텍스트를 바꾸기 전에 커서 위치를 검색하고 나중에 SetSel을 사용하여 동일한 위치에 배치 할 수 있습니다.

void DLG::OnChangeEditPrepareTape() 
{ 
    CString ss; 
    int start, stop; 
    std::vector<char> aTape; 
    m_prepareTape.GetWindowText(ss); 
    m_prepareTape.GetSel(&start, &stop); 
    m_prepareTape.SetWindowText(ss); 
    m_prepareTape.SetSel(start, stop); 
} 

다시 텍스트 상자에 넣어 전에 텍스트를 수정하는 경우가 증가 또는 start (및 end) 따라 감소 할 수 있습니다.

2

컨트롤의 관점에서 볼 때 전체 텍스트 내용이 방금 재설정되었으므로 삽입 지점이 SetWindowText()으로 재설정되고 삽입 지점과 현재 선택이 모두 의미가 충분하지 않을 수 있기 때문에 삽입 지점이 재설정됩니다 그들을 지키기 위해서.

이 동작을 직접 구현하는 GetSel()SetSel()를 사용할 수 있습니다

void DLG::OnChangeEditPrepareTape() 
{ 
    CString ss; 
    std::vector<char> aTape; 

    int start, end; 
    m_prepareTape.GetSel(start, end); 
    m_prepareTape.GetWindowText(ss); 

    // Tinker with the text... 

    m_prepareTape.SetWindowText(ss); 
    m_prepareTape.SetSel(start, end); 
} 
+0

두 우수 및 도움이 답변을. 많은 감사 여러분! –

관련 문제