Funkcja GetDlgItem wciąż jest NULL

Funkcja GetDlgItem wciąż jest NULL
K3
  • Rejestracja:prawie 10 lat
  • Ostatnio:5 miesięcy
  • Postów:98
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).

Kopiuj
			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);
edytowany 1x, ostatnio: flowCRANE
Bartosz36
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 4 lata
  • Postów:348
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?


ExtendedVector czyli std::vector<T> z wygodą List<T> z .NET (ForEach, FindAll, itd...)
K3
  • Rejestracja:prawie 10 lat
  • Ostatnio:5 miesięcy
  • Postów:98
0

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

  1. na początku miałem
Kopiuj
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.

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

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

Bartosz36
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 4 lata
  • Postów:348
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.


ExtendedVector czyli std::vector<T> z wygodą List<T> z .NET (ForEach, FindAll, itd...)
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:2 minuty
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!


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
K3
  • Rejestracja:prawie 10 lat
  • Ostatnio:5 miesięcy
  • Postów:98
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).

Bartosz36
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 4 lata
  • Postów:348
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.


ExtendedVector czyli std::vector<T> z wygodą List<T> z .NET (ForEach, FindAll, itd...)
edytowany 1x, ostatnio: Bartosz36
K3
  • Rejestracja:prawie 10 lat
  • Ostatnio:5 miesięcy
  • Postów:98
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

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

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

06
  • Rejestracja:prawie 20 lat
  • Ostatnio:około rok
  • Postów:2440
0

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

K3
  • Rejestracja:prawie 10 lat
  • Ostatnio:5 miesięcy
  • Postów:98
0

u mnie zwraca 0

06
  • Rejestracja:prawie 20 lat
  • Ostatnio:około rok
  • Postów:2440
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.