CTreeView intr-o aplicatie fara doc/view support

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
rdenis
Membru
Membru
Posts: 50
Joined: 10 Apr 2010, 20:16
Judet: Iaşi

CTreeView intr-o aplicatie fara doc/view support

Post by rdenis » 03 Jul 2010, 23:45

buna tuturor...revin cu o noua problema, cel putin asa e pentru mine :) .... aplicatia mea nu face decat sa citeasca cateva campuri dintr-un DB si sa le afiseze...acuma, codul pentru conectarea la DB si citire e bazat pe MFC CDatabase si CRecordset...asadar, datorita complexitatii reduse a aplicatiei as dori sa scot doc/view support doarece mi se pare complet inutil in cazul acesta...
pasii facuti de mine sunt cei din wizard, numai ca acesta are view-ul derivat din CWnd...am gasit un articol pe codeproject in care autorul afisa un form derivat din CFormView fara doc/view, insa cand incerc sa aplic pasii sai pe un CTreeView nu imi afiseaza nimic...
din experienta, aveti vreo idee, cineva??

multumesc anticipat tuturor celor ce vor raspunde :whorship:



neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: CTreeView intr-o aplicatie fara doc/view support

Post by neagu_laurentiu » 04 Jul 2010, 06:42

Pune controlul tree in fereastra ta si nu ai nici o bataie de cap cu arhitecturile.

rdenis
Membru
Membru
Posts: 50
Joined: 10 Apr 2010, 20:16
Judet: Iaşi

Re: CTreeView intr-o aplicatie fara doc/view support

Post by rdenis » 04 Jul 2010, 09:24

buna laurentiu,
prin fereastra mea te referi la CChildView-ul creat de catre wizard?daca nu, poti sa imi oferi mai multe informatii, un exemplu sau un articol ar fi si mai bun....
mersi

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

Re: CTreeView intr-o aplicatie fara doc/view support

Post by Ovidiu Cucu » 04 Jul 2010, 11:46

rdenis wrote:...am gasit un articol pe codeproject in care autorul afisa un form derivat din CFormView fara doc/view.
// La Codeproject, ca peste tot pe net, sunt si articole bune dar si multe care au sarit gardul (sau au parasit incinta). :biggrin:

O metoda simpla pe calea care ai pornit ar fi ca lui CChildView sa-i atasezi un control tree (un membru tip GetTreeCtrl) dupa cum urmeaza.

Code: Select all

class CChildView : public CWnd
{
    CTreeCtrl m_tree;
public:
    CTreeCtrl& GetTreeCtrl() {return m_tree;}
    // ...
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg void OnSize(UINT nType, int cx, int cy);
};

Code: Select all

// ...
    ON_WM_CREATE()
    ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// ...
int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CWnd ::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    m_tree.Create(lpCreateStruct->style, CRect(0,0,0,0), this, 0);

   // JUST DEMO (to be removed).
   CTreeCtrl& tree = GetTreeCtrl();
   HTREEITEM hRoot = tree.InsertItem(_T("Baba"), 0, 1);
   tree.InsertItem(_T("Safta"), 0, 1, hRoot);
   tree.InsertItem(_T("Programeaza"), 0, 1, hRoot);
   // END DEMO
    
    return 0;
}

void CChildView::OnSize(UINT nType, int cx, int cy) 
{
    CWnd::OnSize(nType, cx, cy);

    if(m_tree.m_hWnd)
    {
        m_tree.MoveWindow(0, 0, cx, cy);
    }
}
Nu e prea elegant deoarece avem o fereastra care nu face altceva decat sa tina in brate o alta.
Dar nu-i asa mare bai, se practica si la case mai mari.

Un pic mai frimos ar fi sa facem ceva similar cu ce face CCtrlView, care este clasa de baza si pentru CTreeView.
Vezi articolul lui Paul DiLascia in MSDN Magazine: http://msdn.microsoft.com/en-us/magazine/cc301457.aspx

Totusi eu unul as recomanda sa lasi "arhitectura" doc-view asa cu e, chiar daca initial ti se pare ca documentul nu are rost. Clasele derivate din CView (incluzand CTreeView) sunt facute special ca sa lucreze cu aceasta, iar daca incerci tot felul de giumbuslucuri si fente luate de pe net s-ar putea sa-ti mearga pe o versiune de MFC iar pe alta sa te umple de asserturi si crapaciuni.
Chiar in cazul tau concret, cat de simplu o fi el, ai putea sa tii in clasa document obiectele de tip CDatabase si CRecordset. Uite ca i-am gasit o utilitate si la clasa docoment!
// "Standard", elegant si fara dureri de cap.

rdenis
Membru
Membru
Posts: 50
Joined: 10 Apr 2010, 20:16
Judet: Iaşi

Re: CTreeView intr-o aplicatie fara doc/view support

Post by rdenis » 04 Jul 2010, 12:25

buna ovidiu...mersi pentru src...o sa-l incerc imediat...am o intrebare insa: am incercat sa adaug un CListCtrl in CChildView dupa cum zicea si laurentiu insa cand incerc sa iau dimensiunile ferestrei child imi da assert error, banuiesc ca e din cauza ca nu e creata inca avand in vedere ca eu incerc sa creez lista in PreCreateWindow deoarece nu am reusit sa gasesc ONCREATE in lista de mesaje data de VS2008. acum intrebarea este, pt ca vad ca tu ai adaugat ONCREATE in cod, se poate sa adaug eu acest mesaj manual? va fi bagat in seama?

ps: codul meu, poate gresesc eu undeva..

Code: Select all

BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) 
{
	
	if (!CWnd::PreCreateWindow(cs))
		return FALSE;

	cs.dwExStyle |= WS_EX_CLIENTEDGE;
	cs.style &= ~WS_BORDER;
	cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, 
		::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL);
	
	mlist->CreateEx(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES,LVS_REPORT | LVS_NOSORTHEADER, CRect(1,1,1,1),this,1);
	
	return TRUE;
}
dupa care ii modific dimensiunile in ONSIZING

Code: Select all

void CChildView::OnSizing(UINT fwSide, LPRECT pRect)
{    
	CRect win;
	this->GetClientRect(&win);
	CWnd::OnSizing(fwSide, pRect);
	mlist->MoveWindow(win, TRUE);
}
am incercat si sa fac totul in PreCReateWindow insa primeam aceeasi eroare

Code: Select all

CRect win;
this->GetClientRect(&win);
mlist->CreateEx(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES,LVS_REPORT | LVS_NOSORTHEADER, win,this,1);

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

Re: CTreeView intr-o aplicatie fara doc/view support

Post by Ovidiu Cucu » 04 Jul 2010, 13:00

Pai, in PreCreateWindow, dupa cum ii zice si numele, fereastra inca nu-i creata deci nici copii sai.
La fel, poate sa primeasca foarte bine WM_SIZE (respectiv WM_SIZING) inainte de a fi creati copii.

Uita-te mai atent la ce am facut eu pe OnSize, nu dijeaba. ;)
// de ademenea, spun inca odata: cel mai bine e sa folosesti support pt. doc-view asa cum e de la mama lui (pardon, de la tata lui, wizard-ul).

rdenis
Membru
Membru
Posts: 50
Joined: 10 Apr 2010, 20:16
Judet: Iaşi

Re: CTreeView intr-o aplicatie fara doc/view support

Post by rdenis » 04 Jul 2010, 13:13

ovidiu, am incercat codul tau si merge perfect, multumesc....m-am tot uitat in ONSIZE si am inteles idea, insa cred ca totusi ceva imi scapa...incerc sa fac acelasi lucru cu lista de mai sus...am urmat intocmai pasii tai si totusi cand rulez app nu imi creaza nici headerul si nici itemul inserat....

asta e codul pe care il am, e ceva gresit?
La declaratii am:

Code: Select all

CListCtrl& GetListCtrl() {return mylist;}  -- ca public
         CListCtrl  mylist;                                    -- ca protected
OnCreate:

Code: Select all

mylist.CreateEx(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES,LVS_REPORT, CRect(0,0,0,0),this,0);
	CListCtrl& test = GetListCtrl();
	test.InsertColumn(1,L"test");
	test.InsertItem(1,L"sdgd");
OnSize:

Code: Select all

if(mylist.m_hWnd)
    {
        mylist.MoveWindow(0, 0, cx, cy);
    }

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

Re: CTreeView intr-o aplicatie fara doc/view support

Post by Ovidiu Cucu » 04 Jul 2010, 13:41

Stilul WS_VISIBLE cui il lasi?

rdenis
Membru
Membru
Posts: 50
Joined: 10 Apr 2010, 20:16
Judet: Iaşi

Re: CTreeView intr-o aplicatie fara doc/view support

Post by rdenis » 04 Jul 2010, 16:45

wow...i feel so stupid at this moment :yahoo: ....mersi mult de ajutor ovidiu....daca ma poti ajuta si cu toolbarul din postul anterior iti dau o bere mareeeee :whorship:

Post Reply