Problem mit Button-ID(#define ID_BIN_3 4002)



  • theta schrieb:

    Was soll der gezeigte Code darstellen?

    Funktionsaufruf

    //window.h
    #include<Windows.h>
    class window{
    public:
    	HWND ErstelleHauptfenster(HINSTANCE hInst);
    	void ErstelleSteuerelemente(HWND hWnd, HINSTANCE hInst);
    private:
    #define ID_BTN_1           4000
    #define ID_BIN_2           4001
    HWND h1;
    HWND h2;
    };
    
    //window.cpp
    #include"window.h"
    
    HWND ::window ErstelleHauptfenster(HINSTANCE hInst)
    // Funktionscode
    

  • Mod

    Wenn müsste es wohl so heißen:

    HWND window::ErstelleHauptfenster(HINSTANCE hInst) 
    {
    // Funktionscode
    


  • @C++Developer2000
    Das sind grundlegendste Grundlagen.
    Du solltest dir angewöhnen dir solche Dinge selbst zu ergoogeln.

    Ein starkes Google-Fu ist eine der wichtigsten Eigenschaften eines guten Programmierers. Und nebenbei macht es auch keinen guten Eindruck wenn du Fragen, die du dir so einfach selbst beantworten könntest, in einem Forum stellst.

    Bzw. vielleicht wäre es auch besser wenn du nicht gleich drauflosprogrammierst, sondern erstmal die Grundlagen in Form eines Buches/Online-Kurses/... durchgehst.



  • Martin Richter schrieb:

    Wenn müsste es wohl so heißen:

    HWND window::ErstelleHauptfenster(HINSTANCE hInst) 
    {
    // Funktionscode
    

    Danke für die Antwort ich stand komplett neben mir, hab ne 2. Funktion wo ich es richtig gemacht habe



  • hustbaer schrieb:

    @C++Developer2000
    Das sind grundlegendste Grundlagen.
    Du solltest dir angewöhnen dir solche Dinge selbst zu ergoogeln.

    Ein starkes Google-Fu ist eine der wichtigsten Eigenschaften eines guten Programmierers. Und nebenbei macht es auch keinen guten Eindruck wenn du Fragen, die du dir so einfach selbst beantworten könntest, in einem Forum stellst. Bzw. vielleicht wäre es auch besser wenn du nicht gleich drauflosprogrammierst, sondern erstmal die Grundlagen in Form eines Buches/Online-Kurses/... durchgehst.

    Sry, versuche es nächstes Mal selbst zu lösen
    Jetzt weiß ich was ich besser machen muss.
    Habe Der C++ Programmierer als Buch



  • Hi, sry wenn ich euch zur Zeit nerve, aber ich krieg es einfach nicht ans Laufen.
    Hab auch schon gegoogelt, aber es irgendwie nicht wirklich verstanden, also bitte eure Antwort immer mit Erklärung, hab auch versucht das ergoogelte abzuschreiben, aber ohne Verständnis wird es halt nix.

    //main.cpp
    #include<Windows.h>
    #include"window.h"
    
    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst,
    	LPSTR lpcmdline, int ncmdshow)
    {
    	HWND hWnd;   // Fenster-Handle
    	MSG message; // Nachricht
    	window fenster;
    	window steuerelemente;
    
    	// Hauptfenster erstellen
    	hWnd =  fenster.ErstelleHauptfenster(hInst);
    
    	// Prüfen, ob alles glatt ging
    	if (hWnd == NULL)
    		return (0);
    
    	// Alle Steuerelemente erstellen
    	steuerelemente.ErstelleSteuerelemente(hWnd, hInst);
    
    	//
    	while (GetMessage(&message, NULL, 0, 0))
    	{
    		TranslateMessage(&message);
    		DispatchMessage(&message);
    
    	}
    
    	// Programm beenden
    	return (int)(message.wParam);
    
    } // WinMain
    
    //window.cpp
    #include"window.h"
    HWND window:: ErstelleHauptfenster(HINSTANCE hInst)
    {
    	HWND        hWnd;        // Fenster-Handle
    	WNDCLASSEX  windowclass; // Nachricht
    
    	// Der Klassenname des Fensters ist frei wählbar
    	const char szClassName[] = "123";
    
    	// Struktur mit gewünschten Eigenschaften füllen
    	//
    
    	// Größe der Struktur zwischenspeichern
    	windowclass.cbSize = sizeof (WNDCLASSEX);
    
    	// Fenster soll beim Verschieben neu gezeichnet werdenT
    	windowclass.style = CS_HREDRAW | CS_VREDRAW;
    
    	// Zeiger auf Callback-Funktion
    	windowclass.lpfnWndProc = WindowProc;
    
    	// Keine erweiterten Einstellungen
    	windowclass.cbClsExtra = 0;
    	windowclass.cbWndExtra = 0;
    
    	// Instanz speichern
    	windowclass.hInstance = hInst;
    
    	// Icons und Cursor festlegen
    	windowclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    	windowclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    	windowclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    
    	// Hintergrundfarbe festlegen
    	windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND + 1;
    
    	// Ein Menü brauchen wir nicht
    	windowclass.lpszMenuName = NULL;
    
    	// Klassenname angeben
    	windowclass.lpszClassName = szClassName;
    
    	// Fensterklasse registrieren
    	if (!RegisterClassEx(&windowclass))
    		return (NULL);
    
    	// Das Fenster erzeugen
    	hWnd = CreateWindowEx(NULL,
    		szClassName,
    		"übung",
    		WS_OVERLAPPEDWINDOW | WS_VISIBLE,
    		CW_USEDEFAULT, CW_USEDEFAULT,
    		300, 135,
    		NULL,
    		NULL,
    		hInst,
    		NULL);
    
    	// Fensterhandle zurückgeben
    	return (hWnd);
    
    } // ErstelleHauptfenster
    
    void window::ErstelleSteuerelemente(HWND hWnd, HINSTANCE hInst)
    {
    	// Statischen Text als Child-Fenster erstellen
    	//
    	h1 = CreateWindow("STATIC",
    		"Übung",
    		WS_VISIBLE | WS_CHILD | ES_CENTER,
    		0, 0,
    		300, 20,
    		hWnd,
    		(HMENU)ID_BIN_2,
    		hInst,
    		NULL);
    
    	// "Übernehmen"-Button als Child-Fenster erstellen
    	//
    	h2 = CreateWindow("BUTTON",
    		"Test",
    		BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
    		20, 50,
    		95, 40,
    		hWnd,
    		(HMENU)ID_BTN_1,
    		hInst,
    		NULL);
    
    }
    LRESULT CALLBACK WindowProc(HWND hWnd, UINT message,
    	WPARAM wParam, LPARAM lParam)
    {
    	// Messages auswerten
    	switch (message)
    	{
    		// Fenster schließen? (Auch Alt-F4)
    	case WM_DESTROY:
    	{
    					   // Nachricht zum Beenden schicken
    					   PostQuitMessage(0);
    					   return (0);
    
    	}
    
    		// Ab hier die Nachrichten unserer Child-Fenster bearbeiten
    	case WM_COMMAND:
    	{
    					   switch (wParam)
    					   {
    
    					   case ID_BTN_1:
    					   {
    
    					   }
    
    					   } break;
    	} break;
    	}
    
    	// Die Nachricht wurde nicht von uns verarbeitet, also
    	// von Windows verarbeiten lassen
    	return (DefWindowProc(hWnd, message, wParam, lParam));
    
    } // WindowProc
    
    //window.h
    #include<Windows.h>
    class window{
    public:
    
    	HWND ErstelleHauptfenster(HINSTANCE hInst);
    	void ErstelleSteuerelemente(HWND hWnd, HINSTANCE hInst);
    	LRESULT CALLBACK WindowProc(HWND hWnd, UINT message,
    		WPARAM wParam, LPARAM lParam);
    
    private:
    #define ID_BTN_1           4000
    #define ID_BIN_2		   4001
    HWND h1;
    HWND h2;
    
    };
    

    Danke für Antworten, Hilfestellungen jeder Art.



  • 1. WindowProc darf nicht in der Klassendefinition stehen; Compiler gibt doch Fehlerhinweis, oder ?

    2. statt

    const char szClassName[] = "123";
    

    besser:

    const TCHAR szClassName[] = TEXT("123");
    

    ... auch alle anderen Texte mit TEXT() definieren

    Code getestet, läuft dann so.


  • Mod

    merano schrieb:

    1. WindowProc darf nicht in der Klassendefinition stehen; Compiler gibt doch Fehlerhinweis, oder ?

    Darf schon. Muss aber statisch sein!



  • merano schrieb:

    1. WindowProc darf nicht in der Klassendefinition stehen; Compiler gibt doch Fehlerhinweis, oder ?

    2. statt

    const char szClassName[] = "123";
    

    besser:

    const TCHAR szClassName[] = TEXT("123");
    

    ... auch alle anderen Texte mit TEXT() definieren

    Code getestet, läuft dann so.

    Danke funktioniert jetzt



  • Noch eine Frage wenn ich eine dritte Steuerelemente ID erzeuge(#define ID_BIN_3 4002),in der klasse,dann findet er die die nicht in der window.cpp
    Woran könnte das liegen



  • C++Developer2000 schrieb:

    Noch eine Frage wenn ich eine dritte Steuerelemente ID erzeuge(#define ID_BIN_3 4002),in der klasse,dann findet er die die nicht in der window.cpp
    Woran könnte das liegen

    Warum heissen die IDs eigentlich mal "ID_BTN" und mal "ID_BIN" ?


  • Mod

    Fehlermeldung.

    Wenn Du schon alles in der Klasse haben willst, dann verwende keine #defines. Deren Definition in einem Scope machen keinen Sinn.

    Verwende const UINT Werte... oder static const UINT, was auch immer...



  • merano schrieb:

    C++Developer2000 schrieb:

    Noch eine Frage wenn ich eine dritte Steuerelemente ID erzeuge(#define ID_BIN_3 4002),in der klasse,dann findet er die die nicht in der window.cpp
    Woran könnte das liegen

    Warum heissen die IDs eigentlich mal "ID_BTN" und mal "ID_BIN" ?

    Hab drei Sachen gleichzeitig gemacht und dann kommt so was raus



  • Martin Richter schrieb:

    Fehlermeldung.

    Wenn Du schon alles in der Klasse haben willst, dann verwende keine #defines. Deren Definition in einem Scope machen keinen Sinn.

    Verwende const UINT Werte... oder static const UINT, was auch immer...

    Ok Danke für den Tipp


Anmelden zum Antworten