|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 09.07.2007, 16:56 Titel: |
|
|
Richtig, hast du denn eine Ressourcendatei(*.rc) in deinem Projekt?
Ich kann jetzt nur für Visual Studio sprechen, aber da kannst du mit dem Ressourceneditor Dialogfelder erstellen, die dann in der Ressourcendatei gespeichert werden. Das kann z.B. so aussehen:
Code: | IDD_DIALOG2 DIALOGEX 0, 0, 258, 45
STYLE WS_CHILD | WS_VISIBLE
FONT 8, "MS Sans Serif", 0, 0, 0x1
BEGIN
LTEXT "Externes Video:",IDC_STATIC_TEXT,17,17,75,8,0,
WS_EX_TRANSPARENT
PUSHBUTTON "Import...",IDB_BROWSE,181,27,50,15
EDITTEXT IDC_DATEIPFAD,17,28,158,12,ES_AUTOHSCROLL,
WS_EX_TRANSPARENT
END |
Hier werden 4 verschiedene IDs angesprochen:
IDD_DIALOG2, IDC_STATIC_TEXT, IDB_BROWSE und IDC_DATEIPFAD.
In einer Headerdatei(resource.h) gibt es eine ganze Define-Liste, die diese IDs mit Werten belegt:
CPP: | #define IDC_STATIC_TEXT 1010
#define IDB_BROWSE 1011
#define IDC_DATEIPFAD 1012
#define IDC_CLOSE 1013
#define IDC_FOOBAR 1014 |
Nun kannst du im Messagehandler, wenn du die WM_COMMAND-Nachricht abfängst wie folgt vorgehen:
CPP: | case WM_COMMAND:
switch(LOWORD(Wparam))
{
case IDB_BROWSE:
//Browsedialog aufrufen...
break;
case IDC_CLOSE:
//Alt+F4...
break;
case IDC_FOOBAR:
//Sinuston mit Frequenz 440 Hz ausgeben...
break;
}
break; |
Hierbei brauchst du nicht wie du es vorher gemacht hast oder wie DirectXer es zeigt, das Handle des zugehörigen Elements, sondern kannst einfach die ID vergleichen. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 09.07.2007, 17:09 Titel: |
|
|
Hmm also jetzt habe ich das so gemacht aber i-wie klappt das noch nicht so richtig. Also es kommt zwar kein Fehler, aber das checken der Auswahl klappt noch nicht. Ich find aber nicht den Fehler -.-
http://nopaste.de/p/a4aANw962
Könnt ihr mir weiter helfen ?? |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 09.07.2007, 17:20 Titel: |
|
|
CPP: | //Wird der Button gedrückt, so springt das Programm in die If-Anweisung
if(lParam == (LPARAM)g_hButton)
{
int iWort, iAusw = 0;
HWND thisHandle = (HWND)lParam; // abs. C-Cast wegen WinAPI-Komp.
//Wie soll auch nur ein Zweig dieses if-else-Konstrukts aufgerufen werden?
//lParam ist bereits = (LPARAM)g_hButton (siehe obere if-Anweisung)
//folglich kann lParam aka. thisHandle unmöglich g_hAuswahl1-3 oder g_hCheckbox sein
if( thisHandle == g_hAuswahl1 )
{
iAusw = 1;
}
else if( thisHandle == g_hAuswahl2 )
{
iAusw = 2;
}
else if( thisHandle == g_hAuswahl3 )
{
iAusw = 3;
}
else if( thisHandle == g_hCheckbox )
{
iWort = 1;
}
MessageBox(NULL, szAntwort.c_str(),"Sie haben auf Ok gedrückt",MB_ICONINFORMATION | MB_OK | MB_DEFBUTTON1);
SendMessage(hWnd, WM_CLOSE, 0, 0);
} |
Verschachtele hier die if-Anweisungen nicht, das bringt nichts (und ist kontraproduktiv). Alle Elemente, die du während des Abfangens von WM_COMMAND überprüfst, sind "gleichwertig", also behandle sie beim if-else auch gleichwertig _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 09.07.2007, 20:39 Titel: |
|
|
OK, das mit dem lParam klingt logisch.
Also brauche ich jetzt diese ID's und muss das mit der Resource-Datei machen.
Es gibt nur ein Problem, ich weiß nicht was ich mit einer Resource-Datei anfangen soll, sprich ich hatte das Thema noch nie.
Also ich habe auch MS VStudio und da wurde auch i-wie eine Resource-Datei erstellt, aber das was da steht kommt mir i-wie spanisch vor...
CPP: | //{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by test.rc
// Nächste Standardwerte für neue Objekte
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 101
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
|
Könnt ihr mir nochmal in einem kurzen Satz erleutern was eine Resource-Datei ist ?? |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 09.07.2007, 21:02 Titel: |
|
|
Ressourcendateien dienen eigentlich nur dazu, Ressourcne zu erstellen (Dialog, Menüs usw.). Nutzt man einen Ressourceneditor, wo man sich die zusammenklicken kann, wird die daovn erstellt, alternativ schreibt man die per Hand. Den genauen aufbau kenn ich jetzt auch net, aber es ist recht simpel, wenn man sich mal anschaut, was ein Ressourceneditor da so erstellt, kann mans schnell kapieren, wie die aufgebaut sind. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 09.07.2007, 21:03 Titel: |
|
|
nein, du brauchst die Res-Dateien nicht für die IDs. Du kannst die ganz einfach wie folgt setzen(hab ich oben schon erwähnt). Aber eigtl brauchst du nur eine der beiden Mögl., nämlich entweder IDs oder das per if( handle == ... ). Naja, das mit den IDs geht auf jeden Fall, indem du dir die IDs definierst und dann setzt (du kannst natürlich auch den schöneren Weg über C++ nehmen, aber um die WinAPI mal eher nachzuahmen mach ichs jetzt mit defines):
CPP: | #define ID_BUTTON 11001
#define ID_AUSWAHL 11002
#define ID_RADIO 11003
// ...
// unten nach CreateWindow
SetWindowLong( hButton, GWL_ID, ID_BUTTON );
SetWindowLong( hAuswahl, GWL_ID, ID_AUSWAHL );
SetWindowLong( hRadio, GWL_ID, ID_RADIO );
//... |
Gruß DXer |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 10.07.2007, 11:22 Titel: |
|
|
Bohaa ich bin i-wie blöd -.- Ich kriege es einfach nicht gebacken,
Also ich habe das jetzt so gemacht wie ich es verstanden habe :
http://nopaste.de/p/aPi7OGh6V
Aba es klappt i-wie immer noch nicht ??
Ich bin kurz davor alles aufzugeben und mein Glück in VB zu versuchen... |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 10.07.2007, 12:01 Titel: |
|
|
nagut, ich erklärs nochmal langsam:
du kannst entweder das Verfahren per IDs nehmen oder das per handle vergleich
ich empfehle das per IDs:
die IDs musst du einzeln vergeben: Für jedes Control Item jeweils eine ID: CPP: | #define ID_BUTTON 11001
#define ID_CHECKBOX 11002
#define ID_AUSWAHL1 11003
#define ID_AUSWAHL2 11004
#define ID_AUSWAHL3 11005
//ID's vergeben
SetWindowLong( g_hButton, GWL_ID, ID_BUTTON );
SetWindowLong( g_hCheckbox, GWL_ID, ID_CHECKBOX );
SetWindowLong( g_hAuswahl1, GWL_ID, ID_AUSWAHL1 );
SetWindowLong( g_hAuswah2, GWL_ID, ID_AUSWAHL2 );
SetWindowLong( g_hAuswah3, GWL_ID, ID_AUSWAHL3 ); |
du brauchst dann auch die handles nicht mehr globalisieren (kannst du aber trotzdem)
den Vergleich bei WM_COMMAND machst du dann so: CPP: | case WM_COMMAND:
// ID abfragen (das untere Wort con wParam enthält die zugewiesene ID
switch( LOWORD( wParam ) )
{
// eine Nachricht für den Button
case ID_BUTTON:
if (HIWORD(wParam) == BN_CLICKED)
SendMessage(hWnd, WM_CLOSE, 0, 0);
break;
// eine Nachricht für die CheckBox
case ID_CHECKBOX:
// werte die Nachricht in HIWORD(wParam) aus
break;
// eine Nachricht für Auswahl 1
case ID_AUSWAHL1:
// werte die Nachricht in HIWORD(wParam) aus
break;
// und so weiter, für jedes Control Item das du oben via
// CreateWindow erstellt hast und dem du die ID zugewiesen hast
}
|
Gruß DXer
PS: noch ein Tipp: gehe das langsam an, lege viel wert auf schönen Code Stil (d.h. nicht einfach schnell was zum Alten zuschreiben ohne das zu durchdenken und dann ärgern wenns net klappt) und frag lieber noch einmal präzise nach wenn du etwas nicht verstehst. Und vor allem: Lerne die MSDN zu nutzen! |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 10.07.2007, 13:16 Titel: |
|
|
Nagut jetzt habe ich das gemacht wie du das gesagt hast, sieht auch viel übersichtlicher aus..
Aber i-wie wird bei der AUTOCheckbox und den AUTORadiobutton's immer
noch nicht geguckt ob sie ausgewählt sind oder nicht-.-
Soll ich vielleicht die normalen Buttons nehmen und nicht die Autobutton's ??
http://nopaste.de/p/aTYfO4DHh
hmm ich glaube ich fang jetzt an euch zu nerven |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 10.07.2007, 17:51 Titel: |
|
|
OK, hat sich erledigt, habs hingekriegt
http://nopaste.de/p/agTZ1IDvr
Jetzt habe ich aber noch eine Frage:
Ist das die besste Lösung um so eine Anwendung zu schreiben? Also sind da evtl ein paar "Speed-Stopper" dabei ? Hätte ich einige Stellen besser machen können ?
Ach und wenn ich schon dabei bin Fragen zu schreiben, habe ich noch ein paar (Ich lerne ja schließlich noch).
Was bedeutet:
1. ( HWND )lParam
2. LOWORD( wParam )
3. HIWORD(wParam)
Ich meine großgeschriebene Wörter sind in WinApi doch meistens typedefs, aber was sollen dann diese wParams in Klammern danach ??
Oder das HWND vor lParam ?? |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 10.07.2007, 17:54 Titel: |
|
|
das liegt daran, dass du bei den checkboxes und so auf die Nachricht BN_CLICKED prüfst. BN_ steht für ButtoN-Messagge. Check boxes sind zwar BUTTON-Objekte, senden aber keine BN_CLICKED nachricht (siehe hier). Ein hilfreicher Link in der MSDN dazu ist dieser hier. Ob eine CheckBox gecheckt o.ä. ist, kannst du mit IsDlgButtonChecked() prüfen. Diese Funktion funktioniert für: MSDN hat Folgendes geschrieben: | BS_AUTOCHECKBOX, BS_AUTORADIOBUTTON, BS_AUTO3STATE, BS_CHECKBOX, BS_RADIOBUTTON, or BS_3STATE |
btw: wenn du möchtest kannst du mich auch für kleinere Fragen bei ICQ anschreiben; meine nummer steht ja unten.
Gruß DXer
PS: RebornX hat Folgendes geschrieben: | hmm ich glaube ich fang jetzt an euch zu nerven | nein, als community sind wir ja für fragen da
EDIT: Oh, ich seh grad du hast es schon selber hingekriegt... sonst noch:
1.
bedeutet: caste den Parameter lParam in ein HWND, oder anders gesagt: interpretiere die Bits in lParam so als ob sie die einer HWND-Variable wären
2. & 3:
wParam ist normalerweise eine Variable mit 32 Bits, also 4 Bytes. Manchmal möchte man aber eher 2 2-Byte (= 1 Wort fachspr.) Werte übergeben als 1 4-Byte Wert. Also werden beide Wörter nacheinander in die 4 Bytes von wParam gestellt. LOWORD bzw. HIWORD liefern dir dann die beiden einzelnen Wörter aus dem Doppelwort zurück. |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 11.07.2007, 09:45 Titel: |
|
|
Gut dann habe ich noch ne Frage:
ich habe ja einmal in der WinMain das um das Fenster anzeigen zu lassen:
CPP: | // Fenster aqnzeigen lassen
ShowWindow(hWnd, iCmdShow);
UpdateWindow(hWnd); |
Aba in der Callback- Funktion habe ich ja auch noch das:
CPP: | case WM_CREATE:
// Das Fenster wurde erstellt.
break;
|
Und das kann ich auch problemlos auskommentieren.
I-wie finde ich das aber nicht so sinnvoll, was bringt mir den überhaupt dieses WM_CREATE ?? Also ich weiß das das auch i-was mit dem anzeigen des Fensters zu tun hat, nur was ?? |
|
Nach oben |
|
|
valentin_ Mini JLI'ler
Alter: 34 Anmeldedatum: 16.07.2006 Beiträge: 28 Wohnort: Graz Medaillen: Keine
|
Verfasst am: 11.07.2007, 10:10 Titel: |
|
|
Sagt das nicht schon der Name?
Das ist ein Nachricht di du verarbeiten kannst, genau so wie wenn du eine Taste auf der Tastatur drückst. Bei jeder Aktion wird eine Nachricht (WindowsMessage->WM_xxx) geschickt. Die Nachricht WM_CREATE wird eben geschickt wenn das Fenster erzeugt wird. Du kannst auf dies Nachricht reagiern. Eben irgendwelche Operationen durchführen wenn das Fenster erzeugt wird.
valentin_ |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 11.07.2007, 11:01 Titel: |
|
|
RebornX: Wieso postest du egtl deine ganzen Fragen immer doppelt und dreifach in verschiedene Foren? Reicht die eine Meinung nicht? |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 11.07.2007, 12:21 Titel: |
|
|
David hat Folgendes geschrieben: | RebornX: Wieso postest du egtl deine ganzen Fragen immer doppelt und dreifach in verschiedene Foren? Reicht die eine Meinung nicht? |
Naja ich will viele Meinungen und Antworten von verschiedenen Leuten hören, dann kann ich mir ein besseres Bild davon machen, Ich weiß, ich weiß, das nicht so toll, aber so kann ich es besser Verstehen lernen^^ |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|