Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Snowsong Junior JLI'ler
Alter: 37 Anmeldedatum: 15.05.2007 Beiträge: 53
Medaillen: Keine
|
Verfasst am: 21.05.2007, 03:35 Titel: Grundlegendes Problem bei einem Map Editor |
|
|
Hy Leute,
vornweg diese Frage die ich nun stellen werde beruht auf reiner Theorie und
ich habe noch keine Zeile Code geschrieben also weder bös sein noch
Code verlangen^^
So nun zu meiner Frage.
Ich frag mich schon seit einiger Zeit wie man Die Fläche auf der Direct3D
ausgegeben wird im Fenster festlegen kann sodass man zb das obere viertel
des Fensters die Direct3D Flache belegt und auf dem Rest sind Knöpfe und
so angeordnet?
Der Hintergrund hinter all dem ist das ich einen "Map" Editor schreiben
möchte und dieser ja als Fenster sein soll mit n paar Einstellmöglichkeiten.
Meine zweite Frage ist, wie ich ein Menü erstellen kann (ihr wisst schon
Datei->Neu....) ohne .rc Files zu benutzen, da ich die VC++ 2005 Express
benutze und dies dort ja nicht zur verfügung habe.
Ich hoffe ihr könnt mir helfen^^ Danke im voraus.
MfG Snowsong |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 21.05.2007, 05:25 Titel: |
|
|
Das ist im Prinzip sehr einfach.
Ich habe es so gemacht, dass ich mein Hauptfenster in 2 Unterfenster unterteilt habe. In das eine Unterfenster hab ich Steuerelemente und Buttonsund so gemacht. In das andere das Level gerendert. Im Prinzip ist es nur wichtig, D3D im Fenstermodus zu initialisieren. Dann gibt es nur ncoh ein paar Kleinigkeiten zu beachten:
- erstellt habe ich D3D in der CreateWindow Nachricht, des D3D Fensters
- bei WM_PAINT: Einmal Begin- und EndPaint aufrufen, (sollte man bei WM_PAINT imho immer machen), danach einfach ganz normal mit D3D zeichnen.
- Du kannst in diesem Fenster ganz einfach auf Mausklicks reagieren. Du bekommst genauso die LBUTTONDOWN Nachricht, wie in jedem anderen Fenster
- Wenn du nicht für jedes Objekt klicken möchtest: Bei WM_MOUSEMOVE kannst du testen ob die Maustaste gedrückt ist und dann so tun, als hätte sie geklickt. In etwa so:
CPP: | else if(wParam & MK_LBUTTON)
{
//so tun als ob button geklickt würde, um damit die tiles zu setzen
SendMessage(hWnd, WM_LBUTTONDOWN, wParam, lParam);
} |
- nur neuzeichnen, wenn es sein muss. d.h. bei WM_PAINT und jedesmal wenn du etwas veränderst (scrollen, Objekt hinzufügen/löschen).
Und noch ein letzer Tip: Du willst ja bestimmt nicht, das beim Fenstergröße ändern, sich etwas verzerrt. Daher bei der Nachricht WM_SIZE die Matrzen neu setzen. Ich habs so gelöst:
CPP: | void UpdateWorkWnd()
{
RECT Size;
GetWindowRect(hWorkWindow, &Size);
unsigned int YSize=Size.bottom-Size.top, XSize=Size.right-Size.left;
theDirect3D.GetDevice()->SetTransform(D3DTS_VIEW, &MatrixOrthogonalView(XSize, YSize).D3DMatrix);
theDirect3D.GetDevice()->SetTransform(D3DTS_PROJECTION, &MatrixOrthogonalProjektion(XSize, YSize).D3DMatrix);
Repaint(hMainWindow);
Zoomed=false;
} |
Die Funktion evtl. noch beim erstellen einmal aufrufen. Im Prinzip hohlt man sich die neue Fenstergröße und setz die View und Proejktion Matrix neu.
Das ist jetzt halt für meine Sprite klasse, inwiwiet das auf D3DXSprites übertragbar oder übrehaupt notwendig ist, weiß ich gerade nicht so genau.
So, zu den Menüs:
Such mal nach CreateMenu und AppendMenu. benutzen tust du das Menü entweder mit SetMenu oder übergibts das Handle an CreateWindow, des Hauptfensters. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Snowsong Junior JLI'ler
Alter: 37 Anmeldedatum: 15.05.2007 Beiträge: 53
Medaillen: Keine
|
Verfasst am: 21.05.2007, 05:47 Titel: |
|
|
Danke das werd ich alles mal versuchen umzusetzen^^
(2 Fenster heist das Main mit 2 Childs versehen oder direkt 2 Fenster) |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 21.05.2007, 05:51 Titel: |
|
|
Ich hab ein Hauptfenster und in dem 2 Unterfenster. Aber Gimp z.B. hat komplett getrennte Fenster. Ist im Prinzip egal, ich würds aber in ein großes Fenster machen. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Snowsong Junior JLI'ler
Alter: 37 Anmeldedatum: 15.05.2007 Beiträge: 53
Medaillen: Keine
|
Verfasst am: 21.05.2007, 06:32 Titel: |
|
|
Und wie trenn ich das am besten?
kenn mich mit WinApi nich soo sehr aus bis auf einige Grundlegende
Dinge und die Bücher die ich hab sind eher MFC...
Und naja für neue Bücher reicht das Bargeld immo nich so
(geht ja aufs ende des Monats zu^^).
Bei DirectX siehst dann zum Glück mit den Kenntnissen wieder
besser aus obwohl ich da auch eher der 2D Typ bin von dem was
ich gut kann^^ |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 21.05.2007, 07:37 Titel: |
|
|
getrennte Fenster sind eifnach, wenn du 2 Fenster erstellst. Wenn du ein Oberfenster und darin 2 Child fenster erstellst, hast du alles in einem Fenster, ich persönlich finde das übersichtlicher. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 21.05.2007, 13:45 Titel: Re: Grundlegendes Problem bei einem Map Editor |
|
|
Snowsong hat Folgendes geschrieben: |
Meine zweite Frage ist, wie ich ein Menü erstellen kann (ihr wisst schon
Datei->Neu....) ohne .rc Files zu benutzen, da ich die VC++ 2005 Express
benutze und dies dort ja nicht zur verfügung habe. |
Diese Frage hab ich auch mal hier im Forum gestellt; letztendlich bin ich dann so verfahren, dass ich den Editor von der früheren VC++ Autorenedition genommen und da meine Resourcen erstellt hab, sodass ich die bei VC++ 2005 nur bei Resource Files hinzufügen musste. Weitere Möglichkeiten wären:
- die Dateien selber zu schreiben (der rc-Code ist nicht schwer, wenn du den Petzold hast müsstest du den relativ leicht verstehen können, da der dort immer abgedruckt wird)
- dir einen externen Resource Editor zu beschaffen und den benutzen
Gruß DXer |
|
Nach oben |
|
|
Snowsong Junior JLI'ler
Alter: 37 Anmeldedatum: 15.05.2007 Beiträge: 53
Medaillen: Keine
|
Verfasst am: 21.05.2007, 17:52 Titel: |
|
|
Danke für die ganze Hilfe^^ jetzt werd ich mal alles umsetzen und hoffen das es was wird. Wenn ich noch weitere fragen hab meld ich mich wieder^^ |
|
Nach oben |
|
|
Snowsong Junior JLI'ler
Alter: 37 Anmeldedatum: 15.05.2007 Beiträge: 53
Medaillen: Keine
|
Verfasst am: 21.05.2007, 18:49 Titel: |
|
|
Hallo ich bins wieder^^
Hab nun ein neues Problem.
Da ich alles gern in Klasse hab wollte ich bis auf die WinMain den Rest
nun auch als Klasse haben um es besser verwalten zu können und stoße
hierbei an ein Problem.
CPP: | WNDCLASSEX wndMainWindow;
wndMainWindow.cbSize = sizeof(WNDCLASSEX);
wndMainWindow.style = CS_DBLCLKS | CS_OWNDC |CS_HREDRAW | CS_VREDRAW;
wndMainWindow.lpfnWndProc = &cApplication::MessageMainWindow;
wndMainWindow.cbClsExtra = 0;
wndMainWindow.cbWndExtra = 0;
wndMainWindow.hInstance = hinstance;
wndMainWindow.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndMainWindow.hCursor = LoadCursor(NULL, IDC_ARROW);
wndMainWindow.lpszMenuName = NULL;
wndMainWindow.lpszClassName = "MainWindowClass";
wndMainWindow.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wndMainWindow.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
|
CPP: | wndMainWindow.lpfnWndProc = &cApplication::MessageMainWindow;
|
Das letzte ist das Problem er nimmt den Klasseninternen MessageHandler
nicht an mit folgendem Fehler:
Zitat: |
------ Erstellen gestartet: Projekt: Project Editor, Konfiguration: Debug Win32 ------
Kompilieren...
cApplication.cpp
.\cApplication.cpp(48) : error C2440: '=': 'LRESULT (__stdcall cApplication::* )(HWND,UINT,WPARAM,LPARAM)' kann nicht in 'WNDPROC' konvertiert werden
Es gibt keinen Kontext, in dem diese Konvertierung möglich ist
Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\Michael\Eigene Dateien\Visual Studio 2005\Projects\Project Editor\Debug\BuildLog.htm" gespeichert.
Project Editor - 1 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
|
Ich will das aber alles Klassenintern regeln und wüsste gern ob es da
eine Methode gibt das, daß auch funktioniert. |
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 21.05.2007, 19:33 Titel: Re: Grundlegendes Problem bei einem Map Editor |
|
|
Snowsong hat Folgendes geschrieben: | Meine zweite Frage ist, wie ich ein Menü erstellen kann (ihr wisst schon
Datei->Neu....) ohne .rc Files zu benutzen, da ich die VC++ 2005 Express
benutze und dies dort ja nicht zur verfügung habe. |
Ich benutze auch VC++ 2005 Express => Ich hab auch keinen Resource Editor. Aber es gehts auch ohne:
http://www.jliforum.de/board/viewtopic.php?p=67237#67237
edit: zu deiner neuen Frage:
Ist der Message Handler in einer Klasse untergebracht?
Wenn ja dann solltest du dir das mal angucken:
http://www.c-plusplus.de/forum/viewtopic-var-t-is-39356.html
Denn da muss man schon sehr viel tricksen um das hinzubekommen. _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
Snowsong Junior JLI'ler
Alter: 37 Anmeldedatum: 15.05.2007 Beiträge: 53
Medaillen: Keine
|
Verfasst am: 21.05.2007, 20:29 Titel: |
|
|
Hmm das mit dem Menü is sehr hilfreich^^
Jedoch mit dem anderen komm ich nich wirklich klar muss doch einfacher
gehen normalerweise. |
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 21.05.2007, 20:33 Titel: |
|
|
Naja einfacher geht so weit ich weiß nicht.
Aber du könntest das ja so machen:
Du hast eine wndproc und die benutz du für alle Klassen. Und jedesmal wenn die wndproc aufgerufen wird, guckst du für welches Fenster die gilt und dann rufst du eine ensprechende Funktion oder Methode auf. So hab ich das damals auch mal gemacht. _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
Snowsong Junior JLI'ler
Alter: 37 Anmeldedatum: 15.05.2007 Beiträge: 53
Medaillen: Keine
|
Verfasst am: 21.05.2007, 20:47 Titel: |
|
|
kuck mir grade durch suche das hier an.
Hoffe das wird helfen aba ist das selbe was du mir gepostet hast nurnochmal geordneter^^
Danke für die Hilfe |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 22.05.2007, 06:38 Titel: |
|
|
Callback-Messagehandler, wie WndProc einer ist, müssen statisch definiert werden, da der Callbackhandler nicht wissen kann, welche Instanz der Klasse verwendet werden soll.
Um eine spezielle Instanz zu benutzen musst du diese Instanz als (Null)Pointer der Fensterklasse zuordnen, dann kannst du diese später, wenn benötigt in der Handlerfunktion casten _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
Snowsong Junior JLI'ler
Alter: 37 Anmeldedatum: 15.05.2007 Beiträge: 53
Medaillen: Keine
|
Verfasst am: 23.05.2007, 10:09 Titel: |
|
|
Und wieder taucht ein unschönes Problem auf aber diesmal ist
es nur ein Schönheitsfehler^^
Nun zu meiner Frage.
Wie übergeb ich einem Fenster die Eigenschaft das seine
Größe Konstant bleibt als kein Resize des Fensters möglich? |
|
Nach oben |
|
|
|