Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Probleme mit Message Maps

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 <
000
12.07.2005, 12:08 Uhr
kox



Hallo,

ich möchte für meine CWnd-Klasse Messages registrieren.
Das mache ich so:

C++:
class MyCWnd : public CWnd
{
public:
    MyCWnd();
    virtual ~MyCWnd();
protected:
    afx_msg void ON_WM_KEYDOWN (UINT nChar, UINT nRepCnt,UINT nFlags);
    DECLARE_MESSAGE_MAPS();

};

BEGIN_MESSAGE_MAP(MyCWnd, CWnd)
    ON_WM_KEYDOWN()
END_MESSAGE_MAP()



Compiler meldet:

error C2509: 'GetMessageMap' : member function not declared in 'MyCWnd'

Warum muß ich die deklarieren? Und wie??
Kann mich jemand auf den richtigen Weg stupsen?
Danke schonmal für alle Antworten!

Kox
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.07.2005, 13:30 Uhr
kox



DECLARE_MESSAGE_MAP() ohne S natürlich.
Aber das war's auch nicht, jetzt hab ich solche Fehler:

Win32SoundWrapper.obj : error LNK2005: "protected: static struct AFX_MSGMAP const MyCWnd::messageMap" (?messageMap@MyCWnd@@1UAFX_MSGMAP@@B) already defined in MyCWnd.obj
Win32SoundWrapper.obj : error LNK2005: "private: static struct AFX_MSGMAP_ENTRY const * const MyCWnd::_messageEntries" (?_messageEntries@MyCWnd@@0QBUAFX_MSGMAP_ENTRY@@B) already defined in MyCWnd.obj
Win32SoundWrapper.obj : error LNK2005: "protected: virtual struct AFX_MSGMAP const * __cdecl MyCWnd::GetMessageMap(void)const " (?GetMessageMap@MyCWnd@@MBAPBUAFX_MSGMAP@@XZ) already defined in MyCWnd.obj
Win32SoundWrapper.obj : warning LNK4006: "protected: static struct AFX_MSGMAP const MyCWnd::messageMap" (?messageMap@MyCWnd@@1UAFX_MSGMAP@@B) already defined in MyCWnd.obj; second definition ignored
Win32SoundWrapper.obj : warning LNK4006: "private: static struct AFX_MSGMAP_ENTRY const * const MyCWnd::_messageEntries" (?_messageEntries@MyCWnd@@0QBUAFX_MSGMAP_ENTRY@@B) already defined in MyCWnd.obj; second definition ignored
Win32SoundWrapper.obj : warning LNK4006: "protected: virtual struct AFX_MSGMAP const * __cdecl MyCWnd::GetMessageMap(void)const " (?GetMessageMap@MyCWnd@@MBAPBUAFX_MSGMAP@@XZ) already defined in MyCWnd.obj; second definition ignored




Kox
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.07.2005, 13:42 Uhr
Tommix



Hallo,

Zitat von kox:
DECLARE_MESSAGE_MAP() ohne S natürlich.

.. und ohne abschließendes Semikolon.
Die Messagemap selbst muß dann in die CPP Datei und nicht in den Header.

Gruß, Tommix

Dieser Post wurde am 12.07.2005 um 13:43 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.07.2005, 10:27 Uhr
kox



Ahaaa, danke schön, soweit so gut.

Hab das gemacht, außerdem hab ich meine Funktion umbenannt, damit sie auch bei ON_WM_KEYDOWN aufgerufen wird.
Insgesamt siehts jetzt so aus:

Headerdatei:

C++:
class MyCWnd : public CWnd
{
public:
    MyCWnd();
    virtual ~MyCWnd();
   protected:
    afx_msg void OnKeyDown (UINT nChar, UINT nRepCnt,UINT nFlags);
    DECLARE_MESSAGE_MAP()
};



CPP-Datei:

C++:
void MyCWnd::OnKeyDown (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;
                 }
    
    }
}
BEGIN_MESSAGE_MAP(MyCWnd,CWnd)
    ON_WM_KEYDOWN()
END_MESSAGE_MAP()



Aber et jeht immer noch nicht!
Jetzt müsste doch alles hinhauen, die Message ON_WM_KEYDOWN ist registriert, ich hab die entsprechende Funktion OnKeyDown überschrieben, warum wird sie nicht aufgerufen??

Kox
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.07.2005, 23:34 Uhr
mmc20
puss in boots


hi, meines wissens funktioniert OnKeyDown nur bei controls, nicht aber für den ganzen dialog ( zumindest hat das bei mir nie funktioniert ). tastendrücke landen aber auf alle fälle bei OnCmdMsg

C++:
BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)


frag mich jetzt aber nicht wie man die dort abfängt...

Dieser Post wurde am 13.07.2005 um 23:36 Uhr von mmc20 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: