RicH and FamouS

       Home         Glosar IT                                                                                                                                                                                                              SUBSCRIBE NOW!
        

19.04.2009

MFC Tips - Common Controls

Cum inlocuim o line intr-un edit multiline?
Cine cauta in (editii mai vechi) de MSDN s-ar putea sa gaseasca aceasta:

Exemplu:

Cod:
// The pointer to my edit.
extern CEdit* pmyEdit;
// The string for replacing.
extern LPCTSTR lpszmyString;

int nBegin, nEnd;

// Replace the second line, if it exists, of the edit control
// with the text lpszmyString.
if ((nBegin=pmyEdit->LineIndex(1)) != -1)
{
nEnd = nBegin + pmyEdit->LineLength(1);
pmyEdit->SetSel(nBegin, nEnd);
pmyEdit->ReplaceSel(lpszmyString);
}

Iata o forma mai usor de citit de programatorii MFC:

Cod:
CString strText = _T("Replaced text");
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
int nBegin = pEdit->LineIndex(1);
if(-1 != nBegin)
{
int nEnd = nBegin + pEdit->LineLength(1); // gresit!
pEdit->SetSel(nBegin, nEnd);
pEdit->ReplaceSel(strText);
}

Problema:
Exemplul de mai sus nu functioneaza pentru ca functia CEdit::LineLength trebuie sa primeasca un "character index" (cel intors de functia CEdit::LineIndex), adica indexul primului caracter din linie numarat de la inceputul textului si nu indexul liniei.

Rezolvare:
(vezi spre comparatie linia in care se apeleaza LineLength)

Cod:
CString strText = _T("Replaced text");
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
int nBegin = pEdit->LineIndex(1);
if(-1 != nBegin)
{
int nEnd = nBegin + pEdit->LineLength(nBegin); // OK.
pEdit->SetSel(nBegin, nEnd);
pEdit->ReplaceSel(strText);
}

NOTA: in editiile mai noi de MSDN aceasta greseala a fost corectata.

Cum adaug text la un edit control?
Problema:
O metoda des utilizata este de a scoate textul initial cu GetWindowText pentru a adauga textul, apoi a-l pune inapoi cu SetWindowText.

Exemplu:

Cod:
CString strText;
edit.GetWindowText(strText);
strText += pszNewText;
edit.SetWindowText(strText);

Totusi, mai ales in cazul edit-urilor multiline, daca textul din edit este foarte lung iar adaugarile se fac des, metoda nu este chiar asagrozava.

Rezolvare:
Pentru controlul edit setam selectia la sfarsitul textului existent apoi o inlocuim cu textul de adaugat. E mai rapid si nici nu e nevoie de un string intermediar.

Exemplu:

Cod:
// get the text length
const int nLength = edit.GetWindowTextLength();
// set the selection at the end of text
edit.SetSel(nLength, nLength);
// replace selection (append the text).
edit.ReplaceSel(pszNewText);

Rich Edit control - rule #0

Problema:
Tocmai am pus intr-un dialog un contor tip rich edit. Aplicatia se compileaza bine-mersi, dar cand rulez programul, dialogul "refuza" sa mai apara.

Rezolvare:
S-a uitat sau n-am stiut regula #0: controlul trebuie initializat cu AfxInitRichEdit.

Exemplu:

Cod:
BOOL CMyApp::InitInstance()
{
AfxInitRichEdit();
// ...
}

    Blog din Moldova    FastCounter 

 
Copyright © 2008-2010 Foster1. All rights reserved.