Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » CWnd und HWND

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
04.07.2005, 09:03 Uhr
kox



Hallo,

ich habe ein mit Java erstelltes Fenster, in dem einige native Funktionen laufen sollen.
Dazu benötige ich einen CWnd-Handle auf dieses Fenster.
Das habe ich versucht mit CWnd::Attach, aber das gibt mir beim Starten den Fehler:

<unknown application>:
File wincore.cpp, Line 1152

Wincore.cpp ist Teil der MFC, und die Zeile lautet:

ASSERT(pMap->LookupPermanent(hWndOrig) == NULL);

Weiß jemand, was das Problem ist, oder wie ich sonst den CWnd Handle von einem HWND bekommen kann?
Danke schonmal für evtl. Antworten!

Kox
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.07.2005, 12:08 Uhr
Airdamn



CWnd ist kein Handle, sondern ein Objekt, welches ein Fenster(handle) verwaltet.
Wenn Du ein HWND hast kannst Du ein CWnd-Objekt erstellen und ihm den HWND zuweisen anstatt ein Fenster mit Create etc. zu erstellen

C++:
CWnd wnd;
// hWnd ist ein HWND
wnd.m_hWnd = hWnd;

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.07.2005, 12:20 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


normalerweise sollte man das mit Attach tun, dafür ist das nämlich da
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.07.2005, 13:42 Uhr
Airdamn



Ich frage mich, was Attach genau macht...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.07.2005, 14:14 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


überprüft ob das handle gültig ist und weißt es dann dem m_hWnd zu Außerdem erstellt es wenn keine Controlmap vorhanden ist eine


C++:
BOOL CWnd::Attach(HWND hWndNew)
{
    ASSERT(m_hWnd == NULL);     // only attach once, detach on destroy
    ASSERT(FromHandlePermanent(hWndNew) == NULL);
        // must not already be in permanent map

    if (hWndNew == NULL)
        return FALSE;

    CHandleMap* pMap = afxMapHWND(TRUE); // create map if not exist
    ASSERT(pMap != NULL);

    pMap->SetPermanent(m_hWnd = hWndNew, this);

#ifndef _AFX_NO_OCC_SUPPORT
    AttachControlSite(pMap);
#endif

    return TRUE;
}


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.07.2005, 14:28 Uhr
Airdamn



OK, Attach hört sich eh gut an
Dieser Post wurde am 04.07.2005 um 14:29 Uhr von Airdamn editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
05.07.2005, 09:01 Uhr
kox



Guten Morgen

Ich hab jetzt ein bißchen ein anderes Problem, die Zuordnung mit Attach klappt jetzt,
aber ich weiß nicht genau, wie ich jetzt das mache, was ich machen will...
Also ich will einen Thread aufmachen, der guckt, ob eine Hardwaretaste gedrückt wird (Pocket PC). Ich hab ne Klasse von CWnd abgeleitet und die OnKeyUp-Methode überladen, damit diese dann das macht, was ich will. Was muß ich jetzt in den Thread schreiben, damit immer, wenn ich eine Taste drücke, diese OnKeyUp-Funktion ausgeführt wird?
Und was mir auch unklar ist, wie lange lasse ich den Thread laufen? Oder besser, wie breche ich ihn ab? Fragen über Fragen...

Kox
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
05.07.2005, 09:04 Uhr
kox



Ok, also die letzte Frage habe ich mir glaube ich soeben selbst beantwortet, hab ne Schleife

while (cwnd) {} gemacht, damit läßt sich das Fenster schließen, und das müßte ja gehen.
Aber was schreib ich rein? Nichts? Oder nur Sleep(0)?

Kox
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
05.07.2005, 11:09 Uhr
kox



Ich will mal noch die entsprechenden Quelltexthäppchen schreiben:

Hier leite ich die Klasse ab:

C++:
class MyCWnd : public CWnd
{
public:

    MyCWnd();
    virtual ~MyCWnd();

    afx_msg void OnKeyUp (UINT nChar, UINT nRepCnt,UINT nFlags);
};


Das ist das überladen der OnKeyUp-Funktion:

C++:
void MyCWnd::OnKeyUp (UINT nChar, UINT nRepCnt,UINT nFlags)
{

    unsigned long *volume_pointer;
    unsigned long volume;
    unsigned long new_volume;
    char wavName[]  = "\\windows\\Default.wav";
    CString csName = CString (wavName);
    volume_pointer = &volume;
    waveOutGetVolume(HWAVEOUT WAVE_MAPPER, volume_pointer);
    switch (nChar){
        case 38: {
            if (volume+0x2000 > 0xFFFF) new_volume = 0xFFFF;
            else new_volume = volume+0x2000;
            waveOutSetVolume(HWAVEOUT WAVE_MAPPER,new_volume);
            PlaySound(csName, NULL, SND_SYNC | SND_FILENAME);
            break;
                 }
        case 40: {
            if (volume < 0x2000) new_volume = 0x0000;
            else new_volume = volume-0x2000;
            waveOutSetVolume(HWAVEOUT WAVE_MAPPER,new_volume);
            PlaySound(csName, NULL, SND_SYNC | SND_FILENAME);
            break;
                 }
    
    }
    
}



und hier starte ich meinen Listener-Thread:

C++:
    MyCWnd* pWnd = new MyCWnd;



    pWnd->Attach(hwnd);

    mythread = AfxBeginThread(
        KeyListener,
        pWnd,
        THREAD_PRIORITY_NORMAL,
        0,
        0,
        NULL);



der bisher nur so aussieht:


C++:

static UINT KeyListener(LPVOID Pparam) {
    MyCWnd *cwnd = (MyCWnd*) Pparam;
    while (cwnd) {
        Sleep(0);
    }
    return 0;
}  



Ist das so ok? Was fehlt noch, damit er auch listened? Bisher macht er das nämlich nicht, jedenfalls ändert sich die Lautstärke nicht beim Drücken der Tasten...

Kox
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
05.07.2005, 11:50 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


kannst du debuggen? wenn ja, dann könntest du einfach nen breakpoint in OnKeyUp reintun, dann siehste ob er da überhaupt reinspringt
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: