Pointer la CView dintr-o functie globala

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Pointer la CView dintr-o functie globala

Post by mesajflaviu » 19 Oct 2010, 21:38

Pt obtine un pointer la un CView intr-o functie globala ?
Eu am incercat in felul urmator si n-am reusit :

Code: Select all

CView* pWnd = (CView*)AfxGetMainWnd()->GetParentFrame()->GetActiveView();
sau

Code: Select all

CMyView* pWnd = (CMyView*)AfxGetMainWnd()->GetParentFrame()->GetActiveView();
La compilare nu zice ca nu e bun pointerul dar cand il folosesc programul crapa ...
Aplicatia e SDI .



User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Pointer la CView dintr-o functie globala

Post by Marius Bancila » 20 Oct 2010, 10:00

Pai si ai incercat sa vezi de ce crapa? I-a incearca codul asta:

Code: Select all

CWnd* mainwnd = AfxGetMainWnd();
if(mainwnd != NULL)
{
  CFrameWnd* frame = mainwnd->GetParentFrame();

  if(frame != NULL)
  {
    CView* view = frame->GetActiveView();
    if(view != NULL)
    {
    }
  }
}
Mai crapa? Ce pointer ti-e null?
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

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

Re: Pointer la CView dintr-o functie globala

Post by Ovidiu Cucu » 20 Oct 2010, 13:28

mesajflaviu wrote:

Code: Select all

[...]
AfxGetMainWnd()->GetParentFrame()
[...]
Ce "parent frame" mai vrem de la fereastra principala? :)

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

Re: Pointer la CView dintr-o functie globala

Post by Ovidiu Cucu » 20 Oct 2010, 13:41

Din cate imi aduc eu aminte s-a mai discutat pe aici ceva asemanator numai ca ne refeream la documentul activ.
A rezultat acest FAQ: http://www.codexpert.ro/forum/viewtopic.php?f=30&t=995 care se poate adapta pentru view.

// voi compune unul pt. view, asap.

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Pointer la CView dintr-o functie globala

Post by Marius Bancila » 20 Oct 2010, 14:07

Ovidiu Cucu wrote:
mesajflaviu wrote:

Code: Select all

[...]
AfxGetMainWnd()->GetParentFrame()
[...]
Ce "parent frame" mai vrem de la fereastra principala? :)
LOL. Ca bine zici. :thumbup: Vezi, ce inseamna sa scri fara sa citesti? Nici nu m-am prins. :o
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

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

Re: Pointer la CView dintr-o functie globala

Post by Ovidiu Cucu » 20 Oct 2010, 14:49

E bine totusi pentru ca, odata ce ai desfacut "carnatzul" mai oricine isi poate da seama cam pe unde-i buba.
Asta-i o dovada in plus ca e important sa scriem cod frumos, mai ales cand ne jucam cu pointeri. ;)

Cum am promis mai devreme am plasat FAQ-ul: http://www.codexpert.ro/forum/viewtopic.php?f=30&t=1547

Acuma, doar o mica nota:
Eu unul, n-am simtit niciodata nevoia unei functii globale care sa-mi dea view-ul sau documentul activ.
Probabil de aceea nici cei de la echipa de Visual C++ nu s-au obosit sa implementeze asa ceva.
Totusi, e o intrebare des pusa prin diverse forumuri asa ca am plast aceste FAQ-uri cum de altfel au facut si bajetii de la MS.
In final recomand intelegerea cat mai buna a arhitecturii document-view din MFC (in fond si la urma urmei nu-i cine stie ce filozofie), si numai daca musa-i si musa-i si nu-i incotro altfel sa se recurga la jmecherii gen "cum obtin ceva de oriunde".

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Pointer la CView dintr-o functie globala

Post by mesajflaviu » 20 Oct 2010, 18:23

De fapt accesul la pointer-ul CView imi trebuia dintr-un thread ( care la mine arata ca o functie globala ) , asa ca nu puteam folosi structura MFC pentru a evita obtinerea pointerului .

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Pointer la CView dintr-o functie globala

Post by Marius Bancila » 20 Oct 2010, 22:43

Si nu poti pasa pointerul ca argument la functia threadului?
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Pointer la CView dintr-o functie globala

Post by mesajflaviu » 21 Oct 2010, 08:27

Marius Bancila wrote:Si nu poti pasa pointerul ca argument la functia threadului?
Acum am rezolvat chiar asa , cu pointer-ul ca argument la functia thread ...

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

Re: Pointer la CView dintr-o functie globala

Post by Ovidiu Cucu » 21 Oct 2010, 09:33

Gurile rele spun ca in MFC nu-i tocmai OK sa plasezi (poiteri la) obiecte de tipuri derivate din CWnd intre threaduri.
Mai safe si ca sa nu ai dureri de cap e sa folosesti un handle (HWND) cu ajutorul caruia sa postezi mesaje.

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Pointer la CView dintr-o functie globala

Post by mesajflaviu » 21 Oct 2010, 11:01

... sa folosesti un handle (HWND) cu ajutorul caruia sa postezi mesaje.
Pare ca e mai elegant asa , dar poate daca detaliezi un piculet , incerc sa fac asa ...

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

Re: Pointer la CView dintr-o functie globala

Post by Ovidiu Cucu » 21 Oct 2010, 14:16

Am zis "gurile rele" :D
Q&A C++ Paul DiLascia

Q: I have to write an application using the doc/view architecture of MFC so that every document and view instantiated on a File | New command is in a separate thread. How can I do this?

A: This is an example of the kind of multithreaded approach I would say is doomed from the outset. There are two main reasons. First, there's the inherent problem that MFC's internal handle maps—the tables that link handles (like HWNDs) to C++ objects (like CWnds)—are thread-specific. In other words, if a CWnd exists in one thread's map, it doesn't exist in any other. That's why the MFC documentation advises you to use HWNDs instead of CWnd pointers when sharing Windows objects among threads. You can get by using CWnd, and there are clever ways to improve your odds, but I don't want to even discuss them for fear I might encourage you.
Another reason ...

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Pointer la CView dintr-o functie globala

Post by mesajflaviu » 21 Oct 2010, 14:52

Ok , o las asa ... si scriu si cum am rezolvat , nu stiu daca am facut o magarie , dar merge :

Code: Select all

//        CMyView.h
...
...
	static UINT ThreadFunction(LPVOID param);		// controlling function header

	typedef struct THREADSTRUCT					// structure for passing to the controlling function
	{
		CMyView* _this;
	}THREADSTRUCT;

Code: Select all

//        CMyView.cpp
...
...
void CMyView::OnSetSomething() 
{
	// TODO: Add your control notification handler code here

	// Begin our thread function
	THREADSTRUCT* _param = new THREADSTRUCT;
	_param->_this = this;
	AfxBeginThread(ThreadFunction, _param);
}

...
...

UINT CMyView::ThreadFunction(LPVOID param)
{
        THREADSTRUCT* ts = (THREADSTRUCT*)param;
        ....
        CButton* pGetFile = (CButton*)ts->_this->GetDlgItem(IDC_GETFILE);
        ....
	return 1;
}

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

Re: Pointer la CView dintr-o functie globala

Post by Ovidiu Cucu » 21 Oct 2010, 22:36

Depinde ce se face mai departe cu pGetFile.
Sunt trei posibile efecte:
  1. nu merge;
  2. merge;
  3. uneori s-ar putea sa mearga, alteori nu.
Cazul al treilea e cel mai nashpa si cu posibile dureri de cap. ;)
Atata timp cat sunt niste recomandari care sa ne scuteasca de cazul 3, nu vad de ce nu le-am aplica.

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Pointer la CView dintr-o functie globala

Post by mesajflaviu » 22 Oct 2010, 11:42

Pai cu acel pointer citesc/scriu niste text pe controale , ( cel mult fac disable/enable ) , inca n-a dat rateu pana acum , dar nici nu l-am testat pe mai multe sisteme ...

Post Reply