in der nähe von setwindowlong passt was nicht
-
hallo zusammen,
ich versuch mich gerade im kapseln und möchte einem button seine eigene callback geben.
nur wird er nach setwindowlong erst garnicht angezeigt, obwohl die msg's eigentlich weitergeleitet werden müssten..woran liegt das?
class Btn : public controls { public: Btn(){}; virtual ~Btn(){}; void set_handle(HWND hwnd){m_hwnd = hwnd;}; HWND get_handle(){return m_hwnd;}; void set_Callback(LONG Callback){wndProc_orig=SetWindowLong(m_hwnd, GWL_WNDPROC, Callback);}; LONG get_wndproc_orig() {return wndProc_orig;}; private: HWND m_hwnd; LONG wndProc_orig; }; HWND h_Dlg_FM; h_Dlg_FM = CreateDialog(hInst, (LPCTSTR)IDD_FM, hWnd, (DLGPROC)FM); LRESULT CALLBACK FM(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) { case WM_INITDIALOG: { h_btn_Ok = GetDlgItem(hDlg, IDC_BTN_OK); btn_Ok.set_handle(h_btn_Ok); btn_Ok.set_Callback((LONG)FM_BTN_OK); } return TRUE; } return FALSE; } LRESULT CALLBACK FM_BTN_OK( HWND hControl, UINT message, WPARAM wParam, LPARAM lParam ) { CallWindowProc((WNDPROC)btn_Ok.get_wndproc_orig(), h_Dlg_FM, message, wParam, lParam); return FALSE; }danke für eure hilfe
-
Musst du dann nicht den Rückgabewert von CallWindowProc() weiter durchreichen ?
Im Moment machste da ja einfach return FALSE...
-
stimmt, aber das problem besteht leider weiterhin
-
Klappt es denn ohne deine "komische" Klassen-Kapselung? Sind auch alle Variablen gültig?
-
wenn ich setwindowlong bei initdialog in der dlgCallback aufrufe, sagt mit der compiler aufeinmal:
error C2440: '=' : 'long' kann nicht in 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' konvertiert werdenwas tun, meine ganzen castVersuche schlagen fehl..?
-
ich bekomm es echt nicht hin. och, bitte, kommt schnippt mit dem finger und sagt: zack, da isser der böse fehler, musst nur des und das machen..
fänd ich wunderbar

-
Warum nimmst du eigentlich set_Callback(LONG Callback) und nicht set_Callback(WNDPROC Callback) ?
-
Du solltest dir mal ein funktionierendes Subclassing-Beispiel suchen und es dann Schritt für Schritt in eine Klasse kapseln.
-
@geeky setwindowlong benötigt und liefert mir long, drum dacht ich
mir, dass das casten bei callwindowproc am besten aufgehoben sei..ich habe jetzt die klassen weggelassen, so dass nur noch das da steht:
LONG test_wndProc_orig//global test_wndProc_orig=SetWindowLong(GetDlgItem(hDlg, IDC_BTN_OK), GWL_WNDPROC, (LONG)FM_BTN_OK);so soll die aufgerufene callback alles weiterleiten:
return CallWindowProc((WNDPROC)test_wndProc_orig, h_Dlg_FM, message, wParam, lParam);nur reagiert der button auf nichts mehr.
@tipp ich habe eigentlich ein ganz anderes problem was sich, wenn obiges laufen würde, gut lösen würde
-
Bau mal vor CallWindowProc() mal OutputDebugString() oder so ein, also prüfen ob in der neuen WindowProc überhaupt was ankommt...
-
-
@geeky in die callback geht er rein
@flenders mein winuser.h kennt kein setwindowlongptr, hab gerade das psdk download angefangen..
-
Wenn ich das richtig sehe musst du bei CallWindowProc auch wieder das Window-Handle des gesubclassten Buttons einsetzen. Also wenn du deine FM_BTN_OK-Callback nicht geändert hast hControl und nicht h_Dlg_FM

-
ohh flenders, sag des doch

dankschön euch beiden

-
Hab's doch auch da erst gesehen

