Eigene GUI elemente
-
Hab zwar den Thread schon im Spieleform erstellt, aber dort kommen keine Antworten.
Ich will für ein Spiel meine eigenen Buttons, Listboxen, Edit-Felder usw. erstellen.
Hab z.Bsp. ein Bitmap als Button, welcher beim anclicken einen neuen Dialog öffnet.
Kann man das Bitmap irgendwie als eigenes Fenster behandeln, also mit eigener
WNDPROC?
-
Umgekehrt wird ein Schuh draus.
Du erstellst dir für deinen Button ein eigene Klasse und dann damit ein ChildWindow.In seiner WM_PAINT Procedure zeichnest du dann stattdessen deine Bitmap.
-
Die Idee hat ich auch schon, aber wie soll die Klasse aussehen?
Hab schon eine CreateWindow-Funktion, aber beim Regestrieren der Fensterklasse
muss ich die WinProc angeben.
Ich hab sie zwar als Memberfunktion, doch es kommt immer ein Fehler wegen der Typumwandlung.error C2440: '=': 'WNDPROC (__thiscall mGUI::* )(HINSTANCE,HINSTANCE,LPSTR,int)' kann nicht in 'WNDPROC' konvertiert werden
-
Wenn du sie als Memberfunktion machst, dann muss sie static sein.
-
Funktioniert irgendwie nicht.
Der Code:#pragma once #include <windows.h> #include <stdio.h> #include <stdlib.h> class mGUI { public: mGUI(void); ~mGUI(void); HWND m_hWnd; bool Create(DWORD dwExStyle,LPCTSTR lpLabel, DWORD Style, int x, int y, int nWidth, int nHeight, HWND hWndParent,HMENU hMenu,HINSTANCE hInstance, LPVOID lpParam ); WNDCLASSEX winc; bool Register(UINT style, WNDPROC lpfnWndProc, int cbClsExtra, int cbWndExtra, HINSTANCE hInstance, HICON hIcon, HCURSOR hCursor, HBRUSH hbrBackground, LPCTSTR lpszMenuName, LPCTSTR lpszClassName, HICON hIconSm); static LRESULT CALLBACK WinProc(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int cmndshow); };#include ".\mgui.h" mGUI::mGUI(void) { } mGUI::~mGUI(void) { } bool mGUI::Create(DWORD dwExStyle,LPCTSTR lpLabel, DWORD Style, int x, int y, int nWidth, int nHeight, HWND hWndParent,HMENU hMenu,HINSTANCE hInstance, LPVOID lpParam) { CreateWindowEx(dwExStyle,winc.lpszClassName,lpLabel,Style,x,y,nWidth,nHeight,hWndParent,hMenu,hInstance,lpParam); return true; } bool mGUI::Register( UINT style, WNDPROC lpfnWndProc, int cbClsExtra, int cbWndExtra, HINSTANCE hInstance, HICON hIcon, HCURSOR hCursor, HBRUSH hbrBackground, LPCTSTR lpszMenuName, LPCTSTR lpszClassName, HICON hIconSm ) { winc.cbSize=sizeof(WNDCLASSEX); winc.style = style; winc.cbClsExtra = cbClsExtra; winc.cbWndExtra = cbWndExtra; winc.lpfnWndProc = WinProc; winc.hInstance = hInstance; winc.hIcon = hIcon; winc.hCursor = hCursor; winc.hbrBackground =hbrBackground; winc.lpszMenuName = lpszMenuName; winc.lpszClassName = lpszClassName; winc.hIconSm = hIconSm; return true; } LRESULT CALLBACK mGUI::WinProc(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int cmndshow) { return LRESULT(); }
-
Der Fehler?
-
Steht doch oben. Die Funktion WinProc wird nicht von der WNDCLASSEX angenommen.
-
INTEGER schrieb:
Steht doch oben. Die Funktion WinProc wird nicht von der WNDCLASSEX angenommen.
Na kein Wunder, ist ja auch nicht vom selben Funktionstyp. Du weist der WndProc von WNDCLASSEX eine Funktion zu die bis zum Namen eine WndProc ist und eine Parameterliste wie die WinMain hat...
Schau dir das nochmal genau in der MSDN an

MfG SideWinder
-
Stimmt, hab garnicht gemerkt, dass die Parameter total falsch sind.
-
LRESULT CALLBACK mGUI::WinProc(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int cmndshow)
{
return LRESULT();
}WinProc(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int cmndshow) { return LRESULT(); }ohne Klassenname.
-
@Der_Toni
wenn du schon was berichtigst, dann bitte richtig.
Deine Codevorgabe ist der gleiche Scheiß in Lila getupft, halt ohne Klassenbezug, und ohne Rückgabe Bezeichnung der Funktion.
-
halt ohne Klassenbezug
Jip, so sollte es sein.
und ohne Rückgabe Bezeichnung der Funktion.
Hatte ich leider vergessen.
-
Hm, ich glaube ich hatte das mit "friend" verwechselt.

-
Die Rede ist immer noch von den Parametern der WNDPROC.