2011-03-13 151 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()的方法。

我正在使用Visual C++ 6,帶有Service Pack 5.現在已有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

兩個優秀的和有用的答案。非常感謝先生們! – 2011-03-15 09:24:40

相關問題