DialogProc in Klasse
-
Hallo,
wie kann ich für jede DialogBox eine Klasse erstellen, so dass ich nur noch den Konstruktor aufrufe und die DialogBox öffnet sich. In der Klasse soll auch die DialogProc sein, was aber irgendwie nicht richtig funktioniert!
-
Was funktioniert denn nicht richtig, beschreib dein Problem mal genauer.
cu
-
dlgproc static machen
-
Schon, aber wenn ich DialogProc static mache, kann ich keine Funktionen mehr benutzen (EndDialog, ...)
-
Natürlich funktioniert ::EndDialog.
Du kannst nur keine Funktionen deiner Klasse mehr aufrufen.Dieses Thema haben wir übrigens schon in der FAQ:
WndProc in eine Klasse bekommen...Da geht es um die WndProc, aber die DlgProc ist ja fast dasselbe.
Nur so viel: Ums static kommst du nicht herum. Es gibt aber verschiedene Methoden, trotzdem auf die Elementvariablen zuzugreifen.
-
Habs jetzt folgendermaßen gemacht:
main.cpp:
#define WIN32_LEAN_AND_MEAN #include <windows.h> #include "Dialog.h" #include "resource.h" int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { CDialog dialog; dialog.Show(hInstance); return 0; }
CDialog.h:
// Dialog.h: Schnittstelle für die Klasse CDialog. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_DIALOG_H__6F3C9FF2_66AC_42E3_A9C4_325CEF273C76__INCLUDED_) #define AFX_DIALOG_H__6F3C9FF2_66AC_42E3_A9C4_325CEF273C76__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class CDialog { public: void OnOK(void); static INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); void Show(HINSTANCE hInstance); CDialog(); virtual ~CDialog(); }; #endif // !defined(AFX_DIALOG_H__6F3C9FF2_66AC_42E3_A9C4_325CEF273C76__INCLUDED_)
CDialog.cpp:
// Dialog.cpp: Implementierung der Klasse CDialog. // ////////////////////////////////////////////////////////////////////// #define WIN32_LEAN_AND_MEAN #include <windows.h> #include "resource.h" #include "Dialog.h" ////////////////////////////////////////////////////////////////////// // Konstruktion/Destruktion ////////////////////////////////////////////////////////////////////// CDialog::CDialog() { } CDialog::~CDialog() { } void CDialog::Show(HINSTANCE hInstance) { DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, CDialog::DialogProc, (long)this); } INT_PTR CALLBACK CDialog::DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { CDialog *pThis = (CDialog*)GetWindowLong(hwndDlg, GWL_USERDATA); switch(uMsg) { case WM_INITDIALOG: { LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam; pThis = (CDialog*)(lpcs->lpCreateParams); SetWindowLong(hwndDlg, GWL_USERDATA, (LONG)pThis); return TRUE; } case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: pThis->OnOK(); break; case IDCANCEL: ::EndDialog(hwndDlg, 0); break; } return TRUE; } return FALSE; } void CDialog::OnOK() { MessageBox(NULL, "OnOK()", "DialogBox", MB_OK); }