Page 1 of 1

Probleme rezolutie

Posted: 31 May 2011, 13:50
by carrera
Buna,

-O intrebare as avea: am un mic programel facut in C++/MFC, si cind l-am facut am avut un monitor cu rezolutia 1240X1024 care afisa toate controalele corect, il testasem si pe alt monitor cu rez. 1024x768 si la fel, mergea bine.
-Acum insa, am un ecran cu rezolutia 1366x768 (panoramic) si e jale ce afiseaza, controale incalecate, unele mai mici altele mai mari, etc.Pe google am vazut ca unii
creaza alte controale pe care le incarca dinamic in functie de rezolutie.Ar fi vreo metoda mai simpla de rezolvare?

Merci.

Re: Probleme rezolutie

Posted: 31 May 2011, 13:59
by Ovidiu Cucu
Pune aici un demo si vedem dupa aceea ce se intampla.

Re: Probleme rezolutie

Posted: 01 Jun 2011, 07:06
by carrera
Am atasat un exemplu, se vede cum combobox-urile au incalecat lista, iar randurile listei s-au facut mai late...la fel si la edit-box-urile din dreapta.Mentionez ca liniile erau perfect paralele, dintr-un capat in altul, de la combobox la editbox-uri.Controalele sint create static.Pina la urma cred ca o sa creez alt form, si in functie de rezolutie il incarc pe unul sau pe celalalt.
Merci.

Re: Probleme rezolutie

Posted: 01 Jun 2011, 08:07
by carrera
Gata, am gasit problema, e de la sistemul de operare, cind am schimbat monitorul am schimbat si SO-ul, inainte aveam xp acum win7.Si totusi, ce-as putea face acum sa se vada corect?

Re: Probleme rezolutie

Posted: 01 Jun 2011, 08:51
by mesajflaviu
O solutie ar fi sa incadrezi toate controalele intr-un groupbox , pe care il faci invizibil apoi , iar la OnSize(...) il iei ca referinta si muti toate controalele dupa el :

Code: Select all

void CMyFormView::OnSize(UINT nType, int cx, int cy) 
{
	CFormView::OnSize(nType, cx, cy);

	// TODO: Add your message handler code here

	if((GetScrollPos(SB_HORZ) != 0) || (GetScrollPos(SB_VERT) != 0))return;

	int topMargin = 5, leftMargin = 5;
	CRect rect, rectView, rectTotal;
	GetWindowRect(&rectView);

	for(CWnd* pWnd = GetWindow(GW_CHILD);pWnd != NULL;pWnd = pWnd->GetWindow(GW_HWNDNEXT))
	{
		CWnd* pTotal = GetDlgItem(IDC_TOTAL_RECT);
		if(pTotal == NULL)break;
		pTotal->GetWindowRect(&rectTotal);

		int xPos, yPos;
		pWnd->GetWindowRect(&rect);
		if(rectView.Width() > (rectTotal.Width() + 2 * leftMargin))
			xPos = (rectView.Width() - rectTotal.Width()) / 2;
		else xPos = leftMargin;

		if(rectView.Height() > (rectTotal.Height() + 2 * topMargin))
			yPos = (rectView.Height() - rectTotal.Height()) / 2;
		else yPos = topMargin;

		pWnd->MoveWindow(xPos + rect.left - rectTotal.left,yPos + rect.top - rectTotal.top, rect.Width(), rect.Height(), TRUE);
	}
}

aici ID-ul groupbox-ului care incadreaza totul este IDC_TOTAL_RECT.
Iti atasez si un mic exemplu .

Re: Probleme rezolutie

Posted: 01 Jun 2011, 10:22
by Ovidiu Cucu
Nu cred ca "durerea" din OP provine doar de la a centra niste controale. La asa ceva nu cred sa apara probleme, indiferent de rezolutia monitorului.

E posibil sa fie vorba de o aplicatie ceva mai "desteapta" care se uita la rezolutie si in functie de asta se apauca pe langa mutat, de redimensionat controale, fonturi si alte celea.
Un mic bugulet pe la calcule sau la transformari (de exempu din unitati dialog in pixeli) sau pur si simplu cel ce-a scris programul nu s-a gandit ca in viitor vor exista si monitoare "wide" si s-a dus totul de rapa.

Nu pot spune exact ce si cum ar trebui facut pentru ca n-am in fata aplicatia sau macar un demo cu comportare similara, deci nu stiu ce "minunatii" sunt prin cod si cum ar putea fi ele reparate.
carrera wrote:Am atasat un exemplu...
Unde?