title image


Smiley So geht es...
Es geht doch! Ich bin dabei, für ein größeres Projekt eine eigene Klassenbibliothek zu schreiben, die vor allem nicht so groß und träge wie die MFC ist. Außerdem gefällt mir die große Blackbox MFC nicht.

 

Ich benutze dafür eine Basisklasse, die den eigentlichen Verteiler darstellt und Grundfunktionen bietet (noch kaum etwas implementiert). Diese Klasse kann keine eigenen Fenster erzeugen. Die abgeleiteten Klassen müssen, um lauffähig zu sein:

1. Eine statische Register-Methode definieren, die die Fensterklasse mit der Register-Methode der Basisklasse NWnd (N steht für Nemonical :)) registrieren.

2. Die virtuelle Methode Create definieren, um Fenster erstellen zu können.

3. Die virtuelle Methode WindowProc definieren, um Nachrichten weiterzuverteilen. Damit könnten Methoden wie OnSize usw. versorgt werden.

 

Alleine die Nachricht WM_GETMINMAXINFO kann nicht weiterverteilt werden, weil diese Nachricht noch vor WM_NCCREATE und WM_CREATE kommt und daher zu diesem Zeitpunkt keine Bindung an eine Klasseninstanz möglich ist. Weiß irgendwer, wie man Fensterklassenvariablen setzen kann, ohne ein Fenster dieser Klasse erstellt zu haben? Die Funktion SetClassLong versagt hier.

 

Ein paar meiner bisherigen Ergebnisse:

NWnd.h



#ifndef _INC_NWND_H_

#define _INC_NWND_H_

 

#include <windows.h>

 

class NWnd

{

public:

HWND hWnd;

 

public:

static BOOL Register (UINT style, HINSTANCE hInstance, HICON hIcon, HCURSOR hCursor,

HBRUSH hbrBackground, LPCTSTR lpszMenuName, LPCTSTR lpszClassName);

virtual HWND Create (LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight,

HWND hWndParent, HMENU hMenu, HINSTANCE hInstance);

 

private:

static LRESULT CALLBACK DispatchWndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

 

protected:

virtual LRESULT WindowProc (UINT message, WPARAM wParam, LPARAM lParam);

 

public:

BOOL ShowWindow (int nCmdShow);

BOOL UpdateWindow ();

};

 

#endif // _INC_NWND_H_

 



NWnd.cpp



#include <windows.h>

#include "NWnd.h"

 

BOOL NWnd::Register (UINT style, HINSTANCE hInstance, HICON hIcon, HCURSOR hCursor,

HBRUSH hbrBackground, LPCTSTR lpszMenuName, LPCTSTR lpszClassName)

{

WNDCLASS wndclass;

 

wndclass.style = style;

wndclass.lpfnWndProc = DispatchWndProc;

wndclass.cbClsExtra = 0;

wndclass.cbWndExtra = sizeof (NWnd *);

wndclass.hInstance = hInstance;

wndclass.hIcon = hIcon;

wndclass.hCursor = hCursor;

wndclass.hbrBackground = hbrBackground;

wndclass.lpszMenuName = lpszMenuName;

wndclass.lpszClassName = lpszClassName;

 

return (RegisterClass (&wndclass));

}

 

HWND NWnd::Create (LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight,

HWND hWndParent, HMENU hMenu, HINSTANCE hInstance)

{

hWnd = NULL;

 

return (hWnd);

}

 

LRESULT CALLBACK NWnd::DispatchWndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

NWnd * pWnd;

 

if ((message == WM_NCCREATE) || (message == WM_CREATE))

{

pWnd = (NWnd *) ((LPCREATESTRUCT) lParam)->lpCreateParams;

pWnd->hWnd = hWnd;

 

SetWindowLong (hWnd, 0, (LONG) pWnd);

}

else if (message == WM_GETMINMAXINFO)

{

return (0);

}

else

{

pWnd = (NWnd *) GetWindowLong (hWnd, 0);

}

 

return (pWnd->WindowProc (message, wParam, lParam));

}

 

LRESULT NWnd::WindowProc (UINT message, WPARAM wParam, LPARAM lParam)

{

return (DefWindowProc (hWnd, message, wParam, lParam));

}

 

BOOL NWnd::ShowWindow (int nCmdShow)

{

return (::ShowWindow (hWnd, nCmdShow));

}

 

BOOL NWnd::UpdateWindow ()

{

return (::UpdateWindow (hWnd));

}

 



NTestWnd.h



#ifndef _INC_NTESTWND_H_

#define _INC_NTESTWND_H_

 

#include <windows.h>

#include "NWnd.h"

 

class NTestWnd : public NWnd

{

public:

static BOOL Register (HINSTANCE hInstance);

virtual HWND Create (LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight,

HWND hWndParent, HMENU hMenu, HINSTANCE hInstance);

 

protected:

virtual LRESULT WindowProc (UINT message, WPARAM wParam, LPARAM lParam);

};

 

#endif // _INC_NTESTWND_H_

 



NTestWnd.cpp



#include <windows.h>

#include "NWnd.h"

#include "NTestWnd.h"

 

BOOL NTestWnd::Register (HINSTANCE hInstance)

{

return (NWnd::Register (CS_HREDRAW | CS_VREDRAW, hInstance, LoadIcon (NULL, IDI_APPLICATION),

LoadCursor (NULL, IDC_ARROW), (HBRUSH) GetStockObject (WHITE_BRUSH), NULL, TEXT ("NTestWnd")));

}

 

HWND NTestWnd::Create (LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight,

HWND hWndParent, HMENU hMenu, HINSTANCE hInstance)

{

CreateWindowEx (0, TEXT ("NTestWnd"), lpWindowName, dwStyle, x, y, nWidth, nHeight,

hWndParent, hMenu, hInstance, this);

 

return (hWnd);

}

 

LRESULT NTestWnd::WindowProc (UINT message, WPARAM wParam, LPARAM lParam)

{

switch (message)

{

case WM_DESTROY:

PostQuitMessage (0);

return (0);

}

 

return (NWnd::WindowProc (message, wParam, lParam));

}

 



Main.cpp



#include <windows.h>

#include "NTestWnd.h"

 

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)

{

NTestWnd TestWnd;

MSG msg;

 

if (!NTestWnd::Register (hInstance))

{

MessageBox (NULL, TEXT ("Error while loading!"), TEXT ("NTestWnd"), MB_ICONEXCLAMATION | MB_OK);

return (0);

}

 

TestWnd.Create (TEXT ("NTestWnd"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance);

 

TestWnd.ShowWindow (iCmdShow);

TestWnd.UpdateWindow ();

 

while (GetMessage (&msg, NULL, 0, 0))

{

TranslateMessage (&msg);

DispatchMessage (&msg);

}

 

return (msg.wParam);

}

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: