C++ -> WinApi -> DialogBox -> Objekt načtený pomocí GetWindowLongPtr shazuje aplikaci – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C++ -> WinApi -> DialogBox -> Objekt načtený pomocí GetWindowLongPtr shazuje aplikaci – C / C++ – Fórum – Programujte.comC++ -> WinApi -> DialogBox -> Objekt načtený pomocí GetWindowLongPtr shazuje aplikaci – C / C++ – Fórum – Programujte.com

 

Huge0
Návštěvník
13. 12. 2007   #1
-
0
-

Zdravíčko, mám drobný problém s použitím smyčky zpráv jako členské metody třídy.
Ta samozřejmě musí být static, je to popsáno zde: http://zezula.net/cz/prog/wndproc_v_tride.html

Kritický kód vypadá asi takhle:



bool game_class::let_set_new_game(){
return DialogBox(NULL, MAKEINTRESOURCE(DLG_SETTINGS), NULL, DLGPROC(setting_procedure));
}

LRESULT CALLBACK game_class::setting_procedure(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
game_class* object = (game_class*)(GetWindowLongPtr(hWnd, DWLP_USER));

switch(message){
case WM_INITDIALOG:
// Nastavení reference na objekt pro dialog:
SetWindowLongPtr(hWnd, DWLP_USER, (LONG_PTR)lParam);
// Potud je to vpořádku - otestováno.
// A nyní k jádru pudla:
object->POKUSNE; // Pokusné je int člen třídy. Tento řádek proběhne vpořádku.
int i = object->pokusne; // !!! ??? Zde však program padá s typickým ...došlo k problému a je třeba aplikaci zavřít.


Jestli někdo tušíte, čím by to mohlo být, prosím napište, budu moc vděčný.

Nahlásit jako SPAM
IP: 88.102.203.–
Huge0
Návštěvník
13. 12. 2007   #2
-
0
-

Taky se Vám ve fóru název tématu zobrazuje takto?
C++ -> WinApi -> DialogBox -> Objekt načtený p...
tedy místo > se zobrazí ->
Inu volaké pojebané to tu máte. Držím vám, palce, že se vám to brzo podaří opravit.

Nahlásit jako SPAM
IP: 88.102.203.–
Huge0
Návštěvník
14. 12. 2007   #3
-
0
-

Jen btw, jak se dá na tomhle fóru editovat nadpis příspěvku (jesli je to teda vůbec nějak možné)?

Nahlásit jako SPAM
IP: 88.102.203.–
Blujacker
~ Moderátor
0
Grafoman
14. 12. 2007   #4
-
0
-

Huge napsal:
Jen btw, jak se dá na tomhle fóru editovat nadpis příspěvku (jesli je to teda vůbec nějak možné)?

Moderátoři diskuze mají takové právo

Nahlásit jako SPAM
IP: 213.220.226.–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
Huge0
Návštěvník
20. 12. 2007   #5
-
0
-

Kdyby snad někdy někdo měl podobný problém, jako ten, se kterým jsem se dotazoval já (horní příspěvek), tak tady je řešení:
Celý problém je v použití nesprávné funkce DialogBox, místo níž je potřeba použít DialogBoxParam a v posledním parametru předat ukazatel na objekt tj. v rámci metody let_set_new_game stačí použít this asi takto:

bool game_class::let_set_new_game (void)

{
return DialogBoxParam(NULL, MAKEINTRESOURCE(DLG_SETTINGS),
NULL, (DLGPROC)setting_procedure, (LPARAM)this);
};


Ukazatel this je nastaven až při provádění WM_INITDIALOG, takže pokud chcete v rámci téže zprávy použít "object" tak jej musíte explicitně v rámci obsluhy WM_INITDIALOG nastavit, protože GetWindowLongPt, který byl volán na začátku procedury jestě neměl platný nastavený ukazatel. Takže nějak takto:
case WM_INITDIALOG: 

SetWindowLongPtr(hWnd, DWLP_USER, (LONG_PTR)lParam);
object = (game_class*)lParam;
// a ted muzete v ramci zpravy WM_INITDIALOG pouzit treba object->pokusne
...
break;


Nahlásit jako SPAM
IP: 88.102.203.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 10 hostů

Podobná vlákna

Objekt v objekte — založil zakkly

Objekt cin — založil q

Objekt a polia? — založil WraCkeR

Objekt s číslem — založil Paulí

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý