JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=3b2e6b5ef849918ff4d134c7cbfb722aMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Win-Api Features...
Gehe zu Seite Zurück  1, 2, 3  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 09.07.2007, 17:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 09.07.2007, 18:09    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 09.07.2007, 18:20    Titel: Antworten mit Zitat

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 Wink
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 09.07.2007, 21:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 09.07.2007, 22:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 09.07.2007, 22:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 10.07.2007, 12:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 10.07.2007, 13:01    Titel: Antworten mit Zitat

nagut, ich erklärs nochmal langsam:

Arrow du kannst entweder das Verfahren per IDs nehmen oder das per handle vergleich
Arrow ich empfehle das per IDs:
Arrow 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 );

Arrow du brauchst dann auch die handles nicht mehr globalisieren (kannst du aber trotzdem)
Arrow 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! Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 10.07.2007, 14:16    Titel: Antworten mit Zitat

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 Laughing
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 10.07.2007, 18:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 10.07.2007, 18:54    Titel: Antworten mit Zitat

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 Wink

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 11.07.2007, 10:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
valentin_
Mini JLI'ler


Alter: 33
Anmeldedatum: 16.07.2006
Beiträge: 28
Wohnort: Graz
Medaillen: Keine

BeitragVerfasst am: 11.07.2007, 11:10    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 11.07.2007, 12:01    Titel: Antworten mit Zitat

RebornX: Wieso postest du egtl deine ganzen Fragen immer doppelt und dreifach in verschiedene Foren? Rolling Eyes Reicht die eine Meinung nicht?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 11.07.2007, 13:21    Titel: Antworten mit Zitat

David hat Folgendes geschrieben:
RebornX: Wieso postest du egtl deine ganzen Fragen immer doppelt und dreifach in verschiedene Foren? Rolling Eyes 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^^ Laughing
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Gehe zu Seite Zurück  1, 2, 3  Weiter
Seite 2 von 3

 
Gehe zu:  
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

Impressum