Winapi – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Winapi – C / C++ – Fórum – Programujte.comWinapi – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
loma
~ Anonymní uživatel
12 příspěvků
26. 1. 2011   #1
-
0
-

Ahoj mam dotaz ohledne funkce LRESULT CALLBACK WndProcMain(HWND m_hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
jakto že v teto funkci nevidim vytvarene (nemam pristup) k promennym tridy ve ktere je i tato funkce?? Napriklad jak zmacknu ENTER aby se nejaka hodnota nastavila na 1??Diky za odpoved

Nahlásit jako SPAM
IP: 82.99.180.–
Reklama
Reklama
yaqwsx+9
Posthunter
26. 1. 2011   #2
-
0
-

To loma : Důvod je prostý - aby jsi tuto funkci mohl mít ve třídě, musíš ji uvést jako static - tzn. že funkce nepřebírá další srytý argument, kterým je pointer this.
Řešením je si do nějaké globální struktury, třeba mapy, ukládat k příslušným HWND pointer this.

Nahlásit jako SPAM
IP: 85.160.87.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
loma
~ Anonymní uživatel
12 příspěvků
26. 1. 2011   #3
-
0
-

To yaqwsx : prosimte mohl bys mi to nejak vic priblizit s tou strukturou dekuji

Nahlásit jako SPAM
IP: 82.99.180.–
yaqwsx+9
Posthunter
26. 1. 2011   #4
-
0
-

Jednoduše:



//globální proměnná
std::map<HWND, void*> okna;

//Při registraci okna
okna[hwndOkna] = this;

//a na začátku callback funkce
tvojeStrukturaOkna* okno = reinterpret_cast<tvojeStrukturaOkna*>(okna[hwndZCallbackFunkce]);
okno->data...

Nahlásit jako SPAM
IP: 85.160.76.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
loma
~ Anonymní uživatel
12 příspěvků
27. 1. 2011   #5
-
0
-

To yaqwsx : promin ale ja tomu nedokazu nejak porozumet proctomu tak je, proc tato funkce nedokaze videt atributy a nic kolem...

Nahlásit jako SPAM
IP: 82.99.180.–
loma
~ Anonymní uživatel
12 příspěvků
27. 1. 2011   #6
-
0
-

To loma : jakto že ani v teto funkci nemuzu volat staticke atributy??

Nahlásit jako SPAM
IP: 82.99.180.–
Jura
~ Anonymní uživatel
634 příspěvků
27. 1. 2011   #7
-
0
-

Zdravím,

jak už psal yaqwsx, má to co dočinění s OOP a ukazateli na funkce. Jde o to, že kompilátor do všech členských (nestatických) metod dané třídy, přidavá argument - ukazatel na danou třídu. Příklad:



class Foo
{
public:
void fooMethod(int a) {
//...
}
};
// volani
Foo f;
f.fooMethod();

A mužeš si to třeba představit tak, že kompilátor z toho uděla něco jako toto:


void Foo::fooMethod(Foo* const this) {
//...
}
//volani
Foo f;
Foo::fooMethod(&f);



A jak to souvisí s ukazateli na funkce?
Je potřeba si uvědomit, že funkce má nějakou signaturu. Pokud chceš nastavit funkci nějakému ukazateli, nesmíš porušit signaturu. A zde je kámen úrazu. Ačkoliv sám ve třídě máš funkci fooMethod a ukazetel na void (*pFunc)(), tak kompilátor potichu rozšiřil fooMethod o jeden skrytý argument.

Proto má C++ ukazatel na metody. Takže když chceš předat metodu třídy do C-like ukazatele na funkci, tak se to obchází nejčastěji přes statické metody. Nicméně zde je zase problém, že statická metoda nemůže, bez instance dané třídy, přístupovat ke členským (nestatickým) atributům dané třídy. Tudíž musíš mít nějaký mechanismus, jak dostat referenci na instanci tvé třídy do statické metody. A to lze buď jak naznačil yaqwsx, nebo pokud, když už jsi ve WinApi, tak pak je velice dobrý článek: http://www.zezula.net/cz/prog/wndproc_v_tride.html

Nahlásit jako SPAM
IP: 78.80.45.–
loma
~ Anonymní uživatel
12 příspěvků
27. 1. 2011   #8
-
0
-

To Jura :
tak sem to zkusil presne podle toho kodu opsat, ale jakmile zmacknu END tak program prestane pracovat a musi se ukoncit... Prosim kde je chyba??

LRESULT CALLBACK WndProc(HWND m_hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
{
CWindow * py = (CWindow *)GetWindowLong(m_hwnd, GWL_USERDATA);


switch(umsg)
{

case WM_KEYDOWN:
switch (wParam)
{
case WM_CREATE:
SetWindowLong(m_hwnd, GWL_USERDATA, (LONG)((LPCREATESTRUCT)lParam)->lpCreateParams);
break;
case VK_ESCAPE:
PostQuitMessage(0);
break;
case VK_END:
py->bbbbb = true;
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(m_hwnd,umsg,wParam,lParam);


}

Nahlásit jako SPAM
IP: 82.99.180.–
loma
~ Anonymní uživatel
12 příspěvků
27. 1. 2011   #9
-
0
-

To loma : zkousel jsem to aji podobnym zpusobem jako yaqwsx a program mi po KLAVESE END kde nastavuju promennou prestane pracovat, jenom kdyz ji zavolam a zmacknu END tak to jde ale jinak ne Prosim kde delam chybu

Nahlásit jako SPAM
IP: 82.99.180.–
illioner0
Stálý člen
27. 1. 2011   #10
-
0
-

...jen tak jsem na to mrkl a WM_CREATE co vim neni podvyberem WM_KEYDOWN udalosti, to mas mit uplne mimo tu vetev na stejny urovni, takhle ti ten ukazatel nejspis zustava na NULL.

Nahlásit jako SPAM
IP: 90.178.107.–
Nechápu softwarové firmy, ktere utrácejí za čim dál těžkopádnější DRM ochranu!! Vidět kolem snahu o free2play model je jako příjemné připomenutí časů shareware (jen ten Microsoft stále nic nepochopil)
loma
~ Anonymní uživatel
12 příspěvků
27. 1. 2011   #11
-
0
-

To illioner : tam ta chyba urcite neni sem to debugoval a sekne se to u toho prirazeni

Nahlásit jako SPAM
IP: 82.99.180.–
illioner0
Stálý člen
27. 1. 2011   #12
-
0
-

py neni NULL a probehne ti opravdu WM_CREATE vetev, tomu se mi nechce verit :D

Nahlásit jako SPAM
IP: 90.178.107.–
Nechápu softwarové firmy, ktere utrácejí za čim dál těžkopádnější DRM ochranu!! Vidět kolem snahu o free2play model je jako příjemné připomenutí časů shareware (jen ten Microsoft stále nic nepochopil)
loma
~ Anonymní uživatel
12 příspěvků
27. 1. 2011   #13
-
0
-

To illioner : tam ta WM_CREATE nema na to zadny vliv sem to zkousel i bez toho a porad napise ze program prestal pracovat jakymkliv zpusbem

Nahlásit jako SPAM
IP: 82.99.180.–
loma
~ Anonymní uživatel
12 příspěvků
27. 1. 2011   #14
-
0
-

To loma : po debugu po tom py mi to ukazuje tady toto http://leteckaposta.cz/262896305

Nahlásit jako SPAM
IP: 82.99.180.–
illioner0
Stálý člen
27. 1. 2011   #15
-
0
-

fucking shit neboli NULL, jak sem rikal, ta WM_CREATE je dulezita tu bys vyhazovat nemel a konecne ji prozmenu zkus dat tam kam patri (o patro vys)...
...ale mozna jsem uz jenom z toho cely mimo :D

Nahlásit jako SPAM
IP: 90.178.107.–
Nechápu softwarové firmy, ktere utrácejí za čim dál těžkopádnější DRM ochranu!! Vidět kolem snahu o free2play model je jako příjemné připomenutí časů shareware (jen ten Microsoft stále nic nepochopil)
yaqwsx+9
Posthunter
27. 1. 2011   #16
-
0
-

To loma : Téma se trochu rozvinulo, ale co jsem letmo prohlížel, tak si myslím, že vím kde je chyba. Zpráva WM_CREATE je zasílána hned po vytvoření okna, tzn. v době, kdy v mapě ještě není uložen HWND a mapa vrátí nulu. Pro ověření projeď kód debuggerem o ověř si, že v mapě daná hodnota ještě není.

Nahlásit jako SPAM
IP: 85.160.93.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
loma
~ Anonymní uživatel
12 příspěvků
27. 1. 2011   #17
-
0
-

tak sem ji asi dal tam kam patri ale tam problem neni zkousel sem to i podle yaqwsx a stejnak jak prirazuju promenne hodnotu pise to chybu(program konci)



CWindow * py = (CWindow *)GetWindowLong(m_hwnd, GWL_USERDATA);

switch(umsg)
{

case WM_CREATE:
SetWindowLong(m_hwnd, GWL_USERDATA, (LONG)((LPCREATESTRUCT)lParam)->lpCreateParams);
break;
case WM_KEYDOWN:
switch (wParam)
{

case VK_ESCAPE:
PostQuitMessage(0);
break;
case VK_END:

py->bbbbb = 5;
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(m_hwnd,umsg,wParam,lParam);

Nahlásit jako SPAM
IP: 82.99.180.–
loma
~ Anonymní uživatel
12 příspěvků
27. 1. 2011   #18
-
0
-

no ja vlastně ani nevim proč tam tady tato funkce je SetWindowLong(m_hwnd, GWL_USERDATA, (LONG)((LPCREATESTRUCT)lParam)->lpCreateParams); ale když si psal že to mam dělat pomoci te mapy tam tam WM_CREATE vubec nemusim používat ne ja sem z toho celkem zmatený

Nahlásit jako SPAM
IP: 82.99.180.–
nervak0
Věrný člen
27. 1. 2011   #19
-
0
-

Z čeho jsi zmatený ? Prostě máš instanci třídy a HWND okna a musíš je nějak propojit, abys pak pro HWND zjistil tu instanci.

Takže si tu vazbu můžeš uložit třeba do té mapy...

CWindow *okno = new CWindow();

HWND hwnd = CreateWindow(....);
mapa[hwnd] = okno;
Nebo ve stylu toho, co jsi sem postnul, jako userdata okna...
CWindow *okno = new CWindow();

HWND hwnd = CreateWindow(....);
SetWindowLong(hwnd, GWL_USERDATA, (LONG) okno);
S tím, že ten "tvůj" kód využívá toho, že poslední parametr CreateWindow/CreateWindowEx se oknu předá se zprávou WM_CREATE, takže to vytvoření je takhle...
CWindow *okno = new CWindow();

HWND hwnd = CreateWindow(...., okno);
A ten parametr se uloží při obsluze zpráv...
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{
CWindow *okno = (CWindow *) GetWindowLong(hwnd, GWL_USERDATA);

switch (message)
{
case WM_CREATE:
okno = (CWindow *) ((LPCREATESTRUCT)lParam)->lpCreateParams;
SetWindowLong(hwnd, GWL_USERDATA, (LONG) okno);
break;
...
}

Nahlásit jako SPAM
IP: 213.211.51.–
loma
~ Anonymní uživatel
12 příspěvků
28. 1. 2011   #20
-
0
-

Děkuji vam všem za trpělivost a hlavně NERVAK podle tebe už to jde... no ja sem spise nevedel co ty 2 funkce set a get dělaji a předaval sem adresu NULL misto this takže díky

Nahlásit jako SPAM
IP: 82.99.180.–
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, 56 hostů

Podobná vlákna

WinAPI — založil QWERTY

Help :'-( (winAPI) — založil Sony

WinAPI — založil Kenvelo

WinApi vs. .NET — založil Kenvelo

C# SetParent (WinAPI) — založil Tomas

Moderátoři diskuze

 

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