Pointer auf Window Proc



  • Hallo,

    ich würde einer Klasse von mir gerne einen Zeiger auf eine "Window Proc" übergeben damit diese übergebene Funktion in der WNDCLASS, welche sich in meiner Klasse befindet nutzen zu können.

    Kann mir da jemand ein Beispiel geben wie ich das mache.





  • hi so könnte man es zzum beispiel machen

    #include "Windows.h"
    #include "tchar.h"
    
    class CWindow {
    	HINSTANCE	m_hInstance;
    	HWND		m_hWnd;
    
    	TCHAR		m_szWindowName[64];
    
    	BOOL m_RegisterClass( void );
    	static LRESULT CALLBACK m_WndProc(HWND, UINT,WPARAM,LPARAM);
    public:
    	CWindow( LPTSTR lpWindowName, UINT nWidth = CW_USEDEFAULT, UINT nHeight = CW_USEDEFAULT );
    };
    
    CWindow::CWindow( LPTSTR lpWindowName, UINT nWidth, UINT nHeight )
    {
    	m_hInstance = GetModuleHandle(0);
    	_tcscpy( m_szWindowName, lpWindowName );
    
    	m_RegisterClass();
    
    	m_hWnd		= CreateWindow( "CWindowClass", lpWindowName,
    								WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
    								nWidth, nHeight, NULL, NULL, m_hInstance, this );
    
    	ShowWindow( m_hWnd, SW_SHOW );
    	UpdateWindow( m_hWnd );
    
    }
    
    LRESULT CALLBACK CWindow::m_WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
    {
    	CWindow *pThis = (CWindow*) GetWindowLong( hWnd, GWL_USERDATA );
    
    	switch(uMsg)
    	{
    		case WM_CREATE:
    			pThis = (CWindow*) ((LPCREATESTRUCT)lParam)->lpCreateParams;
    			SetWindowLong( hWnd, GWL_USERDATA, (LONG)pThis );
    			break;
    
    		case WM_LBUTTONDOWN:
    			MessageBox( pThis->m_hWnd, pThis->m_szWindowName, "Hallo", MB_OK );
    			break;
    
    		case WM_DESTROY:
    			PostQuitMessage(0);
    			return 0;
    	}
    
    	return DefWindowProc( hWnd, uMsg, wParam, lParam ); 
    }
    
    BOOL CWindow::m_RegisterClass( void )
    {
    	WNDCLASSEX  wndclass;
    
    	wndclass.cbSize			= sizeof(wndclass);
    	wndclass.style			= CS_HREDRAW | CS_VREDRAW;
    	wndclass.cbClsExtra		= 0;
    	wndclass.cbWndExtra		= 0;
    	wndclass.hIcon			= LoadIcon(0, IDI_APPLICATION);
    	wndclass.hCursor		= LoadCursor (NULL, IDC_ARROW);
    	wndclass.hbrBackground	= (HBRUSH)(COLOR_BTNFACE + 1);
    	wndclass.lpszMenuName	= NULL;
    	wndclass.hIconSm		= NULL;
    	wndclass.lpszClassName	= "CWindowClass";
    
    	wndclass.lpfnWndProc	= CWindow::m_WndProc;
    	wndclass.hInstance		= m_hInstance;
    
    	return RegisterClassEx(&wndclass); 
    }
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    	MSG msg;
    
     	// TODO: Place code here.
    	CWindow Test( "Test Fenster 1", 200, 50 );
    	CWindow Lol( "Test Fenster 2", 300, 300 );
    
    	while (GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    
    	return 0;
    }
    


  • Vorischt damit, den Instanzzeiger in CWindow::m_WndProc einfach so mittels GetWindowLong zu holen. Erstmal ist GetWindowLongPtr/SetWindowLongPtr geeigneter. Und zweitens ist WM_CREATE _nicht_ die erste Nachricht. Dh, pThis wird vorher noch einige male ein Nullzeiger und Dereferenzieren führt somit unweigerlich zu Problemen.



  • Hi

    Wie kann man diese Lösung für einen modalen Dialog umsetzen?
    Ich muss den Dialog dann ja vermutlich mit CreateWindowEx erzeugen oder bekommt man das auch mit DialogBoxParam() oder einer anderen Funktion hin?

    Irgendwie muss ich ja den Spericher reservieren und nach meinen momentanen Kenntnissen geht das nur über CreateWindow() bzw CreateWindowEx().

    Dank und Schönen Gruß,
    Pedro.



  • Wieso, das geht doch genauso wenn du DialogBoxParam benutzt. Der letzte Parameter dwInitParam wird als lParam bei WM_INITDIALOG übergeben.


Anmelden zum Antworten