Erstes Windows Fenster erstellen



  • naja indem fall würde mich mal interessieren, was es für alternativen gibt. Auf der Suche danach bin ich eben nur auf die WinApi gestoßen



  • Kannst dich mal unter WinForms schlau machen. Damit erstellst du Fenster per Mausklick, und mindestens ebenso einfach lassen sich Buttons einfügen 🙂



  • ok das durfte wohl sowas ähnliches sein wie bei Autoit der Koda Form designer damit kann man auch ganz einfach Forms erstellen und er spuckt den Code aus. Damit gehts natürlich recht einfach un schnell aber der Lernfaktor dürfte wohl erher nicht sehr groß sein. Und wie ich den Post vor dir Verstehe meinete er es gäbe andere Möglichkeiten Sorms zu erstellen ohne direkt die API zu nutzen.



  • Wenn du die WinAPI eingehender ansehen möchtest, schau dir folgende Seiten an:
    http://www.winprog.org/tutorial/

    Hab es nicht geprüft, aber da steht das der Quelltext an die aktuelleren Compiler angepasst sein soll. Man kommt zwar meist auch mit älteren Quellcodes und kleinen Anpassungen klar, aber als Neuling kann wegen der Kleinigkeiten schon mal die eine oder andere Minute für das Suchen drauf gehen.



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • ach ich bin jetzt schon am verzweifen. ich habs gesetern noch probiert und heute schin 6 stunden lang aber ich bekomm es nicht mal hin ne einfachen push button auf das Fester zu packen. ICh versteht das gazne auch nicht, es gibt immer wieder gegensätze. In den einem TuT wird erzählt ctrl seien nur Parent Fenster. In dem anderen wird wieder etwas ganz anderes erzählt.

    Ich hier gekuckt : http://msdn.microsoft.com/de-de/library/bb775949.aspx klingt anfürsich ganz logisch nur ich versteh diese Zeile nicht.

    L"BUTTON",   // Predefined class; Unicode assumed.
    

    und hier mal das ganze wie ich es Probiert hab:

    #include <windows.h>
    #include <stdio.h> 
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); 
    //Deklaration der Windows-Nachrichten-Prozedur
    
    int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow)
    {
    char szName[] = "Fensterklasse"; // Fensterklassenname
    
    HBRUSH MyBrush = CreateSolidBrush( RGB( 0, 150, 255 ) ); //Ein brush für meine BG Farbe
    
    WNDCLASS wc; //Hier wird die Fensterklasse erstellt
    
    wc.style         = 0 ;                   // CS = "class style". Vergleichbar mit Register MSG denk ich mal ^^ CS_HREDRAW | CS_VREDRAW
    wc.lpfnWndProc   = WndProc;                                   
    wc.cbClsExtra    = 0;                                         
    wc.cbWndExtra    = 0;                                         
    wc.hInstance     = hI;                                        
    wc.hIcon         = LoadIcon (NULL, IDI_WINLOGO);              //Festlegen des Icons 
    wc.hCursor       = LoadCursor (NULL, IDC_ARROW);              //Festlegen des Fenster Mauzeiger
    wc.hbrBackground = MyBrush;                                   //Hintergrund Festlegen ; Standardbrush  (HBRUSH) GetStockObject (GRAY_BRUSH)
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = szName;
    
    RegisterClass (&wc); //Hier wird die Fensterklasse Registriert
    
    /*
    char szName2[] = "Buttonklasse"; // Fensterklassenname
    
    HBRUSH MyBrush2 = CreateSolidBrush( RGB( 110, 150, 255 ) ); //Ein brush für meine BG Farbe
    
    WNDCLASS bc; //Hier wird die Fensterklasse erstellt
    
    wc.style         = 0 ;                   // CS = "class style". Vergleichbar mit Register MSG denk ich mal ^^ CS_HREDRAW | CS_VREDRAW
    wc.lpfnWndProc   = WndProc;                                   
    wc.cbClsExtra    = 0;                                         
    wc.cbWndExtra    = 0;                                         
    wc.hInstance     = hI;                                        
    wc.hIcon         = 0;              //Festlegen des Icons 
    wc.hCursor       = LoadCursor (NULL, IDC_ARROW);              //Festlegen des Fenster Mauzeiger
    wc.hbrBackground = MyBrush2;                                   //Hintergrund Festlegen ; Standardbrush  (HBRUSH) GetStockObject (GRAY_BRUSH)
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = szName2;
    
    RegisterClass (&bc); //Hier wird die Fensterklasse Registriert
    */
    
    HWND hwnd = CreateWindow
    (
         szName,                                               //Fensterklasse übergeben
         "Fenstername",                                        //Fenstername
         WS_OVERLAPPEDWINDOW,                                  //Styls
         400,                                                  //Xpos
         400,                                                  //Ypos
         600,                                                  //Width      
         300,                                                  //Height
         NULL,
         NULL,
         hI,
         NULL
    );
    
    HWND hwndButton = CreateWindow( 
        szName,   // Predefined class; Unicode assumed. 
        "OK",       // Button text. 
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // Styles. 
        10,         // x position. 
        10,         // y position. 
        100,        // Button width.
        100,        // Button height.
        hwnd,       // Parent window.
        NULL,       // No menu.
        (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), 
        NULL);      // Pointer not needed.
    
    ShowWindow   (hwndButton, iCmdShow);
    ShowWindow   (hwnd, iCmdShow);
    UpdateWindow (hwnd);
    
    /*
    HDC hdc;//gerätekontext Variable Deklarieren
    hdc = GetDC(hwnd); //Wert zuweisen
    PAINTSTRUCT ps; //paint Struktur Variable Deklarieren
    hdc = BeginPaint (hwnd, &ps);
        //SetTextColor( hdc, RGB( 255,   0,  0) );  // rot
        //SetBkColor  ( hdc, RGB( 255, 255,  0) );  // gelb
        SetBkMode              //Hintergrund FarbenMod setzten hier als Bsp. Tranzparent
        (
            hdc,              // hadle zum gerätekontext
            TRANSPARENT       // flag spezieleer Modus
        );        
    
        TextOut (hdc, 50, 100, "Ich bin ein Fenster.", 20); //Label Zeichnen           
    EndPaint (hwnd, &ps);
    */
    
    // Nachrichten-Schleife. Ist denke ich Vergleichbar mit unsere Hauptschleife.
    MSG msg;
        while (GetMessage (&msg, NULL, 0, 0))
        {
            TranslateMessage (&msg);
            DispatchMessage (&msg);//gibt die nachrichten an WndProc weiter   
        }
    return msg.wParam;
    }
    
    // Windows-Nachrichten-Prozedur
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    HDC hdc;
    hdc = GetDC(hwnd);
    char str[50];   
    
    switch (message)
    {
    case WM_PAINT:  
         return 0;
    
    case WM_DESTROY:
        PostQuitMessage (0);
        return 0;
    
    case WM_LBUTTONDOWN:
        sprintf(str,"Fensterhandle: %i ;MSG: %i ;wParam: %i ;xPos: %i ;yPos: %i",hwnd,message,wParam,LOWORD(lParam),HIWORD(lParam));
        TextOut (hdc, 50, 100, str, strlen(str));//strlen(str)
        ReleaseDC(hwnd,hdc);
        return 0;    
    
    case WM_RBUTTONDOWN:
        sprintf(str,"Fensterhandle: %i ;MSG: %i ;wParam: %i ;xPos: %i ;yPos: %i",hwnd,message,wParam,LOWORD(lParam),HIWORD(lParam));
        TextOut (hdc, 50, 100, str, strlen(str));//strlen(str)
        ReleaseDC(hwnd,hdc);
        return 0; 
    
    }
    
    return DefWindowProc (hwnd, message, wParam, lParam);
    }
    

    Was genau mach ich denn da Falsch oder bin ich die Sache kommplet falsch angegangen?

    mfg



  • Hm, ich hab mir das mal angesehen und das sieht mir ein bisschen chaotisch aus.
    Da es mir jetzt zu lange dauert, das alles zu überblicken, poste ich mal einen Code. Das Programm macht nichts anderes, als ein Fenster mit Button zu erstellen.

    #include <windows.h>
    
        LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    
        int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
        {
        HWND hwnd;
        MSG msg;
    
        WNDCLASS wc;
    
        wc.style         = CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc   = WndProc;
        wc.cbClsExtra    = 0;
        wc.cbWndExtra    = 0;
        wc.hInstance     = hInstance ;
        wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
        wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
        wc.hbrBackground = (HBRUSH) 16;
        wc.lpszMenuName  = NULL ;
        wc.lpszClassName = "Classname" ;
    
        RegisterClass(&wc);
    
        int Width  = GetSystemMetrics(SM_CXSCREEN);
        int Height = GetSystemMetrics(SM_CYSCREEN);
        int xpos = (Width  / 2)-225;
        int ypos = (Height / 2)-150;
    
        hwnd = CreateWindow(
    				 "Classname",
                   	 "Fenstertitel",
                   	 WS_SYSMENU|WS_MINIMIZEBOX,
                   	 xpos,
                   	 ypos,
                   	 450,
                   	 300,
                   	 NULL,
                   	 NULL,
                   	 hInstance,
                   	 NULL
    		 );
    
        ShowWindow (hwnd, iCmdShow);
        UpdateWindow (hwnd);
    
        while (GetMessage (&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    
        return msg.wParam;
    
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    static HWND Button;
    
        switch (message)
        {
    
    	case WM_CREATE:
    	{
    	    Button = CreateWindow("button",
                                  "Hier klicken",
                                  WS_CHILD | WS_VISIBLE,
                                  225-60,220,120,30,
                                  hWnd,
                                  NULL,
                                  ((LPCREATESTRUCT) lParam) -> hInstance,
                                  (HMENU)1);
    	return 0;
    	}
    
    	case WM_COMMAND:
    	{
             if (lParam == (LPARAM)Button)
                  if (HIWORD(wParam) == BN_CLICKED)
                  {
    		      MessageBoxA(hWnd,"Button geklickt","Info",MB_ICONINFORMATION);
                  return 0;
                  }
        return 0;
        }
    
    	    case WM_DESTROY:
            {
    	        DestroyWindow(hWnd);
    	        PostQuitMessage(0);
                return 0;
            }
        }
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    

    Eventuell hilft dir ja der Quelltext.

    MfG, Jochen



  • Zu dieser Zeile:

    L"BUTTON",   // Predefined class; Unicode assumed.
    

    Das L vor dem String macht diesen zu einem UNICODE-String. In einem UNICODE-String belegt jedes Zeichen 2 Bytes an Speicher. In einem ASCII-String jedoch nur 1 Byte. Wenn das Projekt mit aktiviertem UNICODE-Flag kompiliert wird, Erwarten Funktionen wie CreateWindow Unicode-Strings anstelle von ASCII-Strings. Du kannst dir ja mal die Deklaration der Funktion CreateWindow in der winuser.h ansehen. vielleicht schafft das ja Klarheit.

    MfG, Jochen



  • Mal den Quelltext von Darter mit der Brechstange bearbeitet:

    // Windows-Nachrichten-Prozedur
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        static HWND Button;
        HDC hdc;
        hdc = GetDC(hwnd);
        char str[50] = "test";
    
        switch (message)
        {
        case WM_CREATE:
        {
            Button = CreateWindow("button",
                                  "Hier klicken",
                                  WS_CHILD | WS_VISIBLE,
                                  225-60,220,120,30,
                                  hwnd,
                                  NULL,
                                  ((LPCREATESTRUCT) lParam) -> hInstance,
                                  (HMENU)1);
            return 0;
        }
    
        case WM_PAINT:
            return 0;
    
        case WM_COMMAND:
        {
            if (lParam == (LPARAM)Button)
                if (HIWORD(wParam) == BN_CLICKED)
                {
                    SendMessage(Button, WM_CLOSE, 0, 0);
    
                }
            return 0;
        }
    
        case WM_DESTROY:
            DestroyWindow(Button);
            PostQuitMessage (0);
            return 0;
    
        case WM_LBUTTONDOWN:
    //    sprintf(str,"Fensterhandle: %i ;MSG: %i ;wParam: %i ;xPos: %i ;yPos: %i",hwnd,message,wParam,LOWORD(lParam),HIWORD(lParam));
            TextOut (hdc, 50, 100, str, strlen(str));//strlen(str)
            ReleaseDC(hwnd,hdc);
            return 0;
    
        case WM_RBUTTONDOWN:
    //    sprintf(str,"Fensterhandle: %i ;MSG: %i ;wParam: %i ;xPos: %i ;yPos: %i",hwnd,message,wParam,LOWORD(lParam),HIWORD(lParam));
            TextOut (hdc, 50, 100, str, strlen(str));//strlen(str)
            ReleaseDC(hwnd,hdc);
            return 0;
    
        }
    
        return DefWindowProc (hwnd, message, wParam, lParam);
    }
    

    Teste mal beide Maustasten.
    Der Rest des Quelltextes wie bei dir - überarbeiten kann bestimmt nicht schaden 😃



  • ok danke für die ANtworten, dann lag ich ja gar nicht so weit weg wie ich dachte. Also sind Button nicht anderes als auch Fenster, die mein Hauptfenster als parent haben.

    Ok soweit denke ich ist es ganz verschtändlich und ich gab natürlich gleich etwas mit den styles usw. rumgespielt nur mit den Styels bekomme ich so einen schönen Button den der nen hover effekt hat.

    Muss ich das also selber machen?

    hab das hier gefunden: http://msdn.microsoft.com/de-de/library/92fhtw0f%28VS.80%29.aspx

    bin ich da auf der Richtigen spur?

    Außerdem hab ich noch ein Buch gefunden, kann das einer empfehlen?
    http://www.amazon.de/Windows-Programmierung-Das-Entwicklerhandbuch-zur-WIN32-API/dp/3860631888



  • sorry für den doppelpost aber ich hab mir die seiten angeschaut:

    http://msdn.microsoft.com/de-de/library/bb775951.aspx
    http://msdn.microsoft.com/de-de/library/bb775943.aspx
    http://msdn.microsoft.com/de-de/library/bb775984.aspx

    bin ich da richtig um einen button mit dem hover effekt zu erstellen?


Anmelden zum Antworten