Einfaches Programm zum Fenstererstellen mit Buttons



  • Hallo, haben in der FH jetzt grad das Thema "Gui mit c"

    hab hier ein Beispielprogramm mit Visual Studio 2005 erstellt.

    /*-----------------------------------------------------------------------
       HELLOWIN.C  Zeigt "Hello, World!" in einem Dialogfenster an
       vgl. Petzold Kap. 3
      -----------------------------------------------------------------------*/
    
    #include <windows.h>
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    //Deklaration der Windows-Nachrichten-Prozedur
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static TCHAR szAppName[] = TEXT ("HelloWin") ;
         HWND         hwnd ;										// Window handle
         MSG          msg ;											// MSG Nachrichten Struktur
         WNDCLASS     wndclass ;									// WNDCLASS Struktur
    
    	 //Anwendungsbereich (client area)
         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;			// Neuzeichnen des Fensters
         wndclass.lpfnWndProc   = WndProc ;							// Nachrichtenverarbeitung CALLBACK WndProc
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;	// Cursor
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;   // Hintergrund
         wndclass.lpszMenuName  = NULL ;	// Zeiger auf null-term. char string, der Ressourcen-Namen des Menüs festlegt
         wndclass.lpszClassName = szAppName ;
    
         if (!RegisterClass (&wndclass))
         {    // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit 
              MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"), 
                          szAppName, MB_ICONERROR) ;
              return 0 ;
         }
    
          hwnd = CreateWindow (szAppName,                 // Name der Fensterklasse
                      TEXT ("Das erste echte Programm"),  // Fenstertitel
                      WS_OVERLAPPEDWINDOW,                // Fensterstil - Art des Fensters
                      CW_USEDEFAULT,                      // X-Position des Fensters
                      CW_USEDEFAULT,                      // Y-Position des Fensters
                      CW_USEDEFAULT,                      // Fensterbreite
                      CW_USEDEFAULT,                      // Fensterhöhe
                      NULL,                               // übergeordnetes Fenster
                      NULL,                               // Menü
                      hInstance,                          // Programm-Kopiezähler (Programm-ID)
                      NULL) ;                             // zusätzliche Parameter
    
         ShowWindow (hwnd, iCmdShow) ;
         UpdateWindow (hwnd) ;
    
         while (GetMessage (&msg, NULL, 0, 0))			// Nachrichten-Schleife  
         {
              TranslateMessage (&msg) ;
              DispatchMessage (&msg) ;
         }
         return msg.wParam ;
    }
    
    // Windows-Nachrichten-Prozedur  
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
         HDC         hdc ;
         PAINTSTRUCT ps ;
         RECT        rect ;
    	 HWND hwndButton1 ;
    	 HWND hwndButton2 ;
    
         switch (message)
         {
    	 /*case WM_CREATE:
              PlaySound (TEXT ("yippee.wav"), NULL, SND_FILENAME | SND_ASYNC) ; // WinMM.lib einbinden
              return 0 ;														// ...nicht vergessen*/
    	  case WM_CREATE:
    			hwndButton1 = CreateWindow ( "button", "OK", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 490, 400, 100, 40, hwnd, (HMENU)1,((LPCREATESTRUCT) lParam)->hInstance, NULL);
    			hwndButton2 = CreateWindow ( "button", "Cancel", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 600, 400, 100, 40, hwnd, (HMENU)2,((LPCREATESTRUCT) lParam)->hInstance, NULL);
    			return 0 ;
    	  case WM_COMMAND:
    			switch(LOWORD(wParam))
    			{
    				case 1:
    					MessageBox(hwnd,"Der Button OK wurde gedrückt", "Message", MB_OK);
    				break;
    				case 2:
    					MessageBox(hwnd,"Der Button Cancel wurde gedrückt", "Message", MB_OK);
    				break;
    			}
    			return 0;
         case WM_PAINT:
              hdc = BeginPaint (hwnd, &ps) ;
    
              GetClientRect (hwnd, &rect) ;
    
              DrawText (hdc, TEXT ("Hello, World!"), -1, &rect,
                        DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
    
    		  TextOut (hdc, 20, 20, "Ich bin ein Fenster.", 20); // device context, x, y, string, string-Länge 
    
              EndPaint (hwnd, &ps) ;
              return 0 ;
    
         case WM_DESTROY:
              PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    

    Eigentlich sollte es ja 2 Buttons erstellen, aber anstelle bekomme ich nur ein Fenster mit Chinesischen Zeichen.

    http://img241.imageshack.us/img241/2272/templa5.th.jpg

    Bin mit dem WinAPI aber auch noch recht unerfahren, aber das versteh ich jetzt wirklich net 🙂

    edit: der selbe Code scheint bei Visual Studio 2003 zu funktionieren, versteh das jetzt gar nicht mehr



  • In VC2005 ist das Default UNICODE!!!!
    Also bitte *ALLE* String mit dem TEXT oder _T Macro umgeben!!!

    hwndButton1 = CreateWindow ( TEXT("button"), TEXT("OK"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 490, 400, 100, 40, hwnd, (HMENU)1,((LPCREATESTRUCT) lParam)->hInstance, NULL);
    hwndButton2 = CreateWindow ( TEXT("button"), TEXT("Cancel"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 600, 400, 100, 40, hwnd, (HMENU)2,((LPCREATESTRUCT) lParam)->hInstance, NULL);
    

Anmelden zum Antworten