[request] MFC+CEdit+TAB_KEY pressed

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
rilley
Junior
Junior
Posts: 22
Joined: 11 Feb 2010, 01:24
Judet: Harghita

[request] MFC+CEdit+TAB_KEY pressed

Post by rilley » 01 Apr 2012, 16:57

Buna,

Referitor la acest topic: http://www.codexpert.ro/forum/viewtopic.php?f=30&t=1816


Am reusit sa integrez clasa derivata, si am reusit sa primesc apel la apasarea tastei tab

void CDEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags){
CprobDlg *pdlg = (CprobDlg *)theApp.m_pMainWnd; // legatura inapoi
switch(nChar){
case VK_TAB:
//(CDialog *)GetParentOwner()->;
pdlg->mEditList.SetFocus();
pdlg->mEditList.PostMessageA(13,13,13);
//pdlg->mEditList.SetWindowTextA("uu");
break;
default:
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
}


Cum as putea sa reusesc cand apas tasta TAB, sa trimita un TAB spre textul care exista, adica sa fie acel spatiu oferit de TAB


Multumesc



Viorel
Microsoft MVP
Microsoft MVP
Posts: 293
Joined: 13 Jul 2007, 12:26

Re: [request] MFC+CEdit+TAB_KEY pressed

Post by Viorel » 01 Apr 2012, 19:18

Încearcă asta:

Code: Select all


case VK_TAB:
    ReplaceSel(_T("\t"), TRUE);
    break;

Pentru a trata şi tasta <Enter>, e suficientă setarea proprietăţii „Want Return” în editorul de resurse.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: [request] MFC+CEdit+TAB_KEY pressed

Post by Ovidiu Cucu » 01 Apr 2012, 20:28

Tab-urile sunt suportate numai in edit-urile multi-line (si pentru astea nu trebuie sa faci toate acele giumuslucuri pe OnChar).
In cele single-line, daca inserezi un '\t' iti va afisa doar un patratel/carcalac la fel ca pentru alte caractere neprintabile.
Pentru lamurire, vezi CEdit::SetTabStops.

rilley
Junior
Junior
Posts: 22
Joined: 11 Feb 2010, 01:24
Judet: Harghita

Re: [request] MFC+CEdit+TAB_KEY pressed

Post by rilley » 01 Apr 2012, 22:28

Am reusit asa:

void CDEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags){

CprobDlg *pdlg = (CprobDlg *)theApp.m_pMainWnd; // legatura inapoi
char sztext[5] ;



switch(nChar){
case VK_TAB:
pdlg->mEditList.SetFocus();
sztext[0] = '\t';
sztext[1] = '\0';
pdlg->mEditList.SendMessage(EM_SETSEL , -1,-1 ) ;
pdlg->mEditList.SendMessage(EM_REPLACESEL,true,(LPARAM)&sztext);
break;

case VK_RETURN:
pdlg->mEditList.SetFocus();
sztext[0] = '\n';
sztext[1] = '\0';
pdlg->mEditList.SendMessage(EM_SETSEL , -1,-1 ) ;
pdlg->mEditList.SendMessage(EM_REPLACESEL,true,(LPARAM)&sztext);
break;


default:
CEdit::OnChar(nChar, nRepCnt, nFlags);
}


}

dar enter nu functioneaza cum ar trebui!!!

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: [request] MFC+CEdit+TAB_KEY pressed

Post by Ovidiu Cucu » 02 Apr 2012, 19:33

Ce rost are "legatura inapoi"? "this" nu e OK?

In fine, sa incerc s-o lamuresc.
NU are sens sa inserezi tu '\t', '\r', '\n' pe handlerul lui WM_CHAR, intr-un control edit.

Cum am zis mai devreme...
  1. daca editul este single-line atunci iti va afisa un simbol reprezentand "caracter neprintabil".
  2. daca edit-ul este multi-line (are stilul ES_MULTILINE), atunci este suficient sa intoarca DLGC_WANTALLKEYS ca raspuns la mesajul WM_GETDLGCODE; mai departe se ocupa controlul intern, sa insereze TAB si respectiv sa treaca la linie noua.
Astea fiind zise, cineva ar putea intreba ce rost mai are tip-ul de aici: http://www.codexpert.ro/forum/viewtopic.php?f=30&t=1816 ?
In unele cazuri are, de exemplu daca am un "in-place edit" folosit pentru editarea unui grid sau unei liste stil report, ca sa "prind" TAB, ENTER si sageti pentru navigare intre celule.

Post Reply