Funkcja GetDlgItem wciąż jest NULL

0

Cześć, mam problem taki jak w temacie.
Chcę stworzyć okienko typu popup ,i dodać do niego kilka zakładek ,ale przy funkcji CWnd::GetDlgItem (int nID) wskazuje mi wciąż, że wartość jest NULL-em.
Sprawdzałem czy ID kontrolki jest w resources, dodałem bibliotekę resources.h oraz zrobiłem rzutowanie. Niestety nie znalazłem żadnego rozwiązania i proszę o pomoc (dopiero uczę się MFC i jeszcze nigdy nie korzystałem z CWnd::GetDlgItem (int nID).

			NewSheetPopup newPopup;
			CWnd* pWnd = GetDlgItem(IDC_EDIT);
			CEdit* newpWnd = (CEdit*)pWnd;

			if (newpWnd != NULL)
			{
				WINDOWPLACEMENT windowPlacement;
				newpWnd->GetWindowPlacement(&windowPlacement);
				newpWnd->DestroyWindow();
			
				newPopup.SetPlacement(windowPlacement.rcNormalPosition);
			}
			abc.SetParent(this);

			abc.AddPage("Adres", new Person());
			abc.AddPage("Dodaj", new Person());

			newPopup.OnActivate();
			newPopup.SetDlgCtrlID(IDC_EDIT);
0

1. Dlaczego najpierw łapiesz wskaźnik do typu CWnd, a potem brzydko rzutujesz go dopiero do docelowego CEdit?

2. Może spróbuj wykorzystać słowo kluczowe auto?

3. Wartość zwrócona przez funkcję jest NULL - sprawdzasz to na podstawie już pWnd, czy dopiero newpWnd?

0

Na początek dziękuję za odpowiedź :)

  1. na początku miałem
CEdit* pWnd = (CEdit*)GetDlgItem(IDC_EDIT); 

ale to niestety też nie działało.
2. nie bardzo wiem o jakie słowo kluczowe chodzi. Jeżeli o auto z C++ 11 w takiej postaci.

 auto* pWnd = (auto*)GetDlgItem(IDC_EDIT); 

to wyrzuca błędy.
3. w obydwóch przypadkach wartość wynosi NULL.

0

1. Co rozumiesz przez nie działało? Bądź precyzyjny - jak przychodzisz do mechanika to opisujesz problem (olej cieknie gdzieś z uszczelki, słychać stuk przy skręcaniu, itp...), czy też stwierdzasz lakonicznie "nie działa"?

2. Jeśli używasz auto, to nie musisz ani robić z niego wskaźnika, ani tym bardziej rzutować na typ auto. Tego akurat się nie robi.
Z tego co widzę tutaj funkcja GetDlgItem() zwraca taki typ, do jakiego podajesz indeks (tutaj IDC_EDIT). Możesz co najwyżej rzutować do typu, jaki chcesz przechowywać, tak jak w przykładzie z dokumentacji.

3. Jeśli zwraca NULL od razu, to oznacza że problem leży najpewniej w samym wykorzystaniu funkcji. Mam tutaj na myśli prawidłowe, istniejące obiekty pod danym indeksem, biblioteka, itp...
Może pokaż cały kod, jeśli jest taka możliwość? Albo przynajmniej fragmenty powiązane z elementem pod IDC_EDIT, jeśli cały kod jest zbyt duży.

1

Trzeba czytać dokumentację: https://msdn.microsoft.com/pl-pl/library/77d16yhw.aspx (przełącz na angielski bo tłumaczenie jest bezsensu).
Napisałeś "Chcę stworzyć okienko typu popup" a dokumentacja nie mówi nic o tworzeniu, ale podawaniu wskaźnika do już istniejącej kontrolki!

0
MarekR22 napisał(a):

Trzeba czytać dokumentację: https://msdn.microsoft.com/pl-pl/library/77d16yhw.aspx (przełącz na angielski bo tłumaczenie jest bezsensu).
Napisałeś "Chcę stworzyć okienko typu popup" a dokumentacja nie mówi nic o tworzeniu, ale podawaniu wskaźnika do już istniejącej kontrolki!

mógłbyś pokazać na przykładzie jak to działa?, bo według mnie podałem już wskaźnik do istniejącej kontrolki (IDC_EDIT).

0

podałem już wskaźnik do istniejącej kontrolki (IDC_EDIT).

O to właśnie pytałem mówiąc:

Albo przynajmniej fragmenty powiązane z elementem pod IDC_EDIT, jeśli cały kod jest zbyt duży.

edit: Skoro funkcja rzuca NULL, to oznacza (według dokumentacji, którą i ja i @MarekR22 Ci przytaczaliśmy), że z samą kontrolką pod IDC_EDIT jest coś nie tak. Pisałem Ci to pod punktem 3.

0
Bartosz36 napisał(a):

podałem już wskaźnik do istniejącej kontrolki (IDC_EDIT).

O to właśnie pytałem mówiąc:

Albo przynajmniej fragmenty powiązane z elementem pod IDC_EDIT, jeśli cały kod jest zbyt duży.

edit: Skoro funkcja rzuca NULL, to oznacza (według dokumentacji, którą i ja i @MarekR22 Ci przytaczaliśmy), że z samą kontrolką pod IDC_EDIT jest coś nie tak. Pisałem Ci to pod punktem 3.

Cały program składa się z około 100 klas dlatego postaram się wrzucić fragmenty związane z IDC

	CEdit		m_edPersonName; // zmienna do IDC_EDIT
m_edPersonName.SubclassDlgItem(IDC_EDIT, this);  // subclass do zmiennej
#define IDC_EDIT 2318   // resources.h

tyle znalazłem podczas uruchomienia programu w tych fragmentach kodu kontrolka jest przypisywana widać to w debuggerze

0

SubclassDlgItem zwraca TRUE, jeśli uda się podpiąć pod kontrolkę o podanym ID. Sprawdź, co ta funkcja zwraca.

0

u mnie zwraca 0

0

Zatem kontrolka IDC_EDIT nie należy do this. Za mało danych, żeby coś więcej napisać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1