Ordner wählen
-
Hallo ,
ich versuche gerade ein Stück Code zu schreiben mit dem
ich ein Verzeichnis wählen kann,
und bekomme die MeldungSelektor::BrowseCallbackProc': 'static' sollte nicht für Memberfunktionen verwendet werden, die außerhalb der Klasse definiert werden
Wie kann ich die Methode ::SendMessage dann aufrufen ?
void Selektor::VerzeichnisWaehlen()
{
char pszName[MAX_PATH];
BROWSEINFO sBrowstruktur;
LPITEMIDLIST browsList;
char szPath[256] = "";
char Title[] = "Verzeichnis wählen: ";sBrowstruktur.hwndOwner = this->m_hWnd;
sBrowstruktur.pszDisplayName = pszName;
sBrowstruktur.pidlRoot = NULL;
sBrowstruktur.lpszTitle = Title;
sBrowstruktur.ulFlags = BIF_STATUSTEXT|BIF_RETURNONLYFSDIRS;
sBrowstruktur.lpfn= BrowseCallbackProc;
.........
}static int CALLBACK Selektor::BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
switch(uMsg){
case BFFM_INITIALIZED:
if (lpData){
::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,lpData);
}
break;
case BFFM_SELCHANGED: {
::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0, lpData);
}
break;
}
default:
break;
}
return 0;
}Danke.
-
Lass das static bei der Implementierung der Methode BrowseCallbackProc weg.
Wenn klassenweite Funktionen implementiert werden, schreibe das static in die Deklaration und nich mehr in die Implementierung.
Dort hat static eine andere Bedeutung.
class Selektor { //.. anything else static int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData); }; int CALLBACK Selektor::BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) { //.. do anything return 0; }
-
Es hat geklappt. Vielen Dank.
Noch eine kleine Frage : Ich benutze SendMessage mit 2 Doppelpunkten
d.h. so: ::SendMessage( hwnd,BFFM_SETSTATUSTEXT,0, lpData );
Wenn ich mir aber andere Beispiele anschaue , dann wird
SendMessage ohne Doppelpunkte benutzt.Bei mir bringt der Compiler aber Fehler ohne Doppelpunkt.
Muss ich vielleicht noch was includieren ?Danke.
Gruß Elke.
-
warst du MVO(Musikverein Opfingen?
-
mit ::SendMessage wird die Funktion der WinAPI aufgerufen.
Lässt du :: weg, rufst du mit Sendmessage die Methode deiner Klasse auf.
Das funktioniert aber nur wenn deine Klasse von CWnd abgeleitet ist.Auch solltest du beachten, dass die Syntax unterschiedlich ist und du bei der API Version das Handle des Fensters übergeben must.
LRESULT ::SendMessage(HWND hWnd, UINT Msg,WPARAM wParam, LPARAM lParam);
LRESULT SendMessage(UINT Msg, WPARAM wParam = 0, LPARAM lParam = 0 );
-
Hallo Mathe ,
vielen Dank.
Gruß Elke