Eigene Messages Senden ?

colblake

Erfahrenes Mitglied
Hi,
Ich hab folgendes Problem:

Ich hab eine SDI-Anwendung, die eine Internetverbindung aufbaut über eine eigene, von CAsyncSocket abgeleitete, Klasse.
Nun hab ich in der eigenen Klasse die OnRecieve von CAsyncSocket überschrieben.


Problem:
Diese OnReceive soll nun eine Funktion in der View-Klasse aufrufen.

Kann ich das mit Messages machen? Wenn ja, wäre ich über ein Stück Code mit Beschreibung sehr dankbar.

Vereinfacht:
Code:
class MySocket: public CAsyncsocket
{

void OnReceive (void);
...
}

class ApplDoc:public CDocument
{
public:
      MySocket sock;
}


Mfg Col.Blake
 
Hi ...

Wenn ich mich nicht irre, kannst du eigene Messages du die z.B. global definierst mit
#define MY_MESSAGE 123
im eigenen Projekt ohne Probleme benutzen.

Aber wenn du eigene Messages zwischen zwei eigenständigen Projekten (z.B. Dll->Dialog) benutzen willst musst du die registrieren mit RegisterWindowMessage.

Die Messages fragst du einfach in der WndProc ab ... sollte funktionieren ...

Gruß
Shai
 
hi, danke erstmal für deine Antwort.

Ich hab das schon mit RegisterWindowMessage probiert, bin aber gescheitert.

Mein Versuch:
die OnReceive der Klasse MySocket:
PHP:
void CMySocket::OnReceive(int nErrorCode)
{	
	SendMessage(HWND_BROADCAST,WM_MY_MESSAGE,0,0);
}

StdAfx.h:
PHP:
...
static UINT NEAR WM_MY_MESSAGE = RegisterWindowMessage("MY_MESSAGE");
...

View.h :
PHP:
	//{{AFX_MSG(CTBView)
         ....
	afx_msg LONG RefreshFromReceive(UINT wparam,LONG lparam);
	//}}AFX_MSG
View.cpp
PHP:
BEGIN_MESSAGE_MAP(CTBView, CFormView)
	//{{AFX_MSG_MAP(CTBView)
        ....
	ON_REGISTERED_MESSAGE(WM_MY_MESSAGE,RefreshFromReceive)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
...
...
...
LONG CTBView::RefreshFromReceive(UINT wparam,LONG lparam)
{
	AfxMessageBox("aaaaa recieved   ");
	return 0;
}

Es kommt kein Fehler, aber die Funktion "RefreshFromReceive" wird nicht aufgerufen. :(
Mfg
 
Zuletzt bearbeitet:
Also ich wüsste jetzt nur, das man ab WM_USER eigene Nachrichen defeniren kann:

so wie :
Code:
#define SOCKET_HTTP_FILE_COMPLETE WM_USER +1
#define SOCKET_HTTP_UPDATE WM_USER +2
#define SOCKET_HTTP_ERROR WM_USER +3
#define SOCKET_HTTP_EVENT WM_USER +4
Vielleicht hilft das ja ._.

M.f.G. Erik
 
Weiß nicht, ob dir das weiter hilft, aber ich schicke aus einem Thread selbst erstellte Nachrichten, was ohne Probleme funktioniert, dabei sind jedoch 4 Dinge zu beachten:

1. Wie schon oben erwähnt:
Code:
#define WM_MYMSG_MOVE					WM_USER+11
in die Klasse schreiben, die die Nachricht empfangen soll

2. In die Klassen Declaration (Bereich protected) der empfangenden Klasse Funktion definieren
Code:
afx_msg void OnMyMsgMove(CMyPlayer *);
...
DECLARE_MESSAGE_MAP()

3. In die Message Map der Klasse dann noch:
Code:
ON_MESSAGE(WM_MYMSG_MOVE, OnMyMsgMove)

4. ganz wichtig:
Wenn diese Message durch eine Funktion einer anderen Klasse aufgerufen werden soll, brauchst du einen Zeiger auf die Klasse, die die Nachricht empfangen soll.
Code:
pView->SendMessage(WM_MYMSG_MOVE, (UINT) this);
 
Zurück