Wie Typ eines CWnd herausbekommen



  • Servus

    ich lass mir von einem Dialog mit GetWindow(GW_CHILD) bzw GW_HWNDNEXT alle Elemente zurückgeben.
    Wie bekomme ich raus, ob mein aktuelles Element ein Button, SpinControl oder ähnliches ist?

    Viele Grüße,
    Jöran



  • mit GetClassName und dann mittels Window Classes vergleichen



  • int GetClassName(      
        HWND hWnd,
        LPTSTR lpClassName,
        int nMaxCount
    );
    

    will als erstes element aber ein HWND und nimmt demzufolge nicht mein CWnd*:

    CWnd* pw = m_tab1.GetWindow(GW_CHILD);
    	while(pw)
    	{
    		CString helpme;
    		GetClassName(pw, helpme, sizeof(helpme)); 
    		pw=pw->GetWindow(GW_HWNDNEXT);	
    	}
    

    *cannot convert parameter 1 from 'CWnd ' to 'HWND'



  • HWND hWnd = pw->GetSafeHwnd();
    

    😉



  • Ok, super,

    kurze Frage noch, der LPTSTR, den ich ihm da übergebe, wie initialisiere ich den?!

    Bekomm permanent Errors, außer, wenn ich ihn so initialisiere:

    LPTSTR* helpme = new LPTSTR;
    GetClassName(hw, *helpme, sizeof(helpme));
    

    Dann laufen mir aber permanent Exceptions in der Form durch:
    First-chance exception at 0x7e37f4c6 in TestReiter2.exe: 0xC0000005: Access violation writing location 0xcdcdcdcd.
    First-chance exception at 0x7e37f4c6 in TestReiter2.exe: 0xC0000005: Access violation writing location 0xcdcdcdcd.



  • kein wunder...
    alle LP*STR sind zeiger die man nur übergeben sollte. das LP steht für long pointer. du räumst dir da jetzt zwar speicher ein, aber der wird nur mit schrott gefüllt.

    char szHelpMe [64];
    

    wenn du jetzt szHelpMe an GetClassName übergibst, zeigt der LPTSTR von GetClassName auf den speicherbereich von szHelpMe und kann ihn befüllen.


Anmelden zum Antworten