Visual C++ meckert bei einfacher Windows-Application



  • Hey Leute!
    Seit geraumer Zeit programmiere ich jetzt mit C++ Terminal Programme (Mit Dev-C++).
    Wie ihr euch sicher denen könnt, wird das mit der Zeit SEHR langweilig.
    Desswegen habe ich mir jetzt ein Buch zugelegt (Spieleprogrammierung mit c++ und Genesis3D) und wollte vor kurzem eines der ersten Programme versuchen.
    Im Buch gibt es den Vorschlag, mit Visual C++ zu progr.(habe mir die abgespeckte free-ware Express-Edition herruntergeladen).

    So, zurück zum Problem: Habe VC++ noch nie vorher verwendet, kenn mich also nix aus :D...

    Das erste Programm soll demonstrieren, wie man ein einfaches Windows-Fenster anzeigen kann.
    Leider happerts total.(11 Fehler, hauptsächlch nicht def. Variablen und so.)
    Besagte Variablen sollten aber irgendwo unter den Headers definiert werden...

    Aber genug geredet (besser: geschrieben).
    Hier ist der Code:

    #include <windows.h>
    #include <iostream>
    using namespace std;
    const int MaxWidth     = 640;   // Max. Screenbreite
    const int MaxHeight    = 480;   // Max. Screenhöhe
    
    HWND GHandle;                   // Fenster-Handle 
    bool isRunning;                 // "Laufvariable"
    LRESULT CALLBACK WndProc (HWND hWnd, 
      UINT iMessage, WPARAM wParam, LPARAM lParam);
    
    int WINAPI WinMain
      (HINSTANCE hInstance, HINSTANCE hPrevInstance, 
       LPSTR lpCmdLine, int nShowCmd)
    {
    
      WNDCLASS Win;     // Objekt der Fensterklasse
      MSG      msg;     // Aktuelle Meldung
    
      Win.cbClsExtra = 0;
      Win.cbWndExtra = 0;
    
      Win.hInstance  = hInstance;    
    
      Win.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
      Win.hCursor = LoadCursor(NULL, IDC_ARROW);
      Win.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
      Win.style = CS_HREDRAW | CS_VREDRAW;
      Win.lpfnWndProc = WndProc;
    
      Win.lpszClassName = "???";
      Win.lpszMenuName = NULL;    // kein Menü
      RegisterClass (&Win);
    
      GHandle = CreateWindow (Win.lpszClassName, 
        "Windows Minimum - [Esc]=Ende", WS_TILED, 
        CW_USEDEFAULT, CW_USEDEFAULT, MaxWidth, 
        MaxHeight, NULL, NULL, hInstance, NULL);
      if (!GHandle)
      {
        return 0;  // nicht ok
      }
      ShowWindow   (GHandle, nShowCmd);
      UpdateWindow (GHandle);
    
      isRunning = true;
      while (isRunning) 
      {
        while 
          (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
        {
          if (!GetMessage(&msg, NULL, 0, 0 ))
          {
            isRunning = false;
            break;
          }
          TranslateMessage (&msg);
          DispatchMessage  (&msg);
        }
      }
      return 1;  // ok
    }
    
    LRESULT CALLBACK WndProc (HWND hWnd, 
      UINT iMessage, WPARAM wParam, LPARAM lParam)
    {
      switch (iMessage)
      {
        case WM_KEYDOWN:
        {
          switch (wParam)
          {
            case VK_ESCAPE:  // Ende mit [Esc]-Taste
            {
              PostMessage(hWnd, WM_QUIT, 0, 0);
            }
          }
        }
        default:
          return DefWindowProc 
            (hWnd, iMessage, wParam, lParam);
      }
      return 0;
    }
    

    Tschuldigung für die chaotische Schreibweise... geht nicht viel besser.

    Ps: Ich bitte um Idioten-Beschreibung, dieses Gebiet ist absolutes Neuland für mich.



  • doch es geht besser, indem du die cpp tags benutzt.
    editir die mal noch rein, vorher liest sich das keienr gerne durch



  • Sorry, hab das erst jetzt entdeckt...
    Bin neu hier.



  • 11 Fehler

    Aber welche ist geheim, hm?

    Ich glaube nicht dass hier viele Leute Lust haben zu raten, oder den Code Zeile für Zeile durchzugehen etc.

    Dein Posting grenzt schon fast an Frechheit wenn ichs mir genau überlege.

    "Da is was kaputt und der Computer sagt mir auch was, aber ich sags euch nicht, aber erklärt mir trotzdam was und vor allem wieso" 🙄

    Und: du weisst schon dass du die Fehler einfach aus dem Visual Studio rauskopieren kannst, also einfach per Ctrl + C, Ctrl + V -- du musst die also nicht alle abtippen.



  • Dieser Thread wurde von Moderator/in Unix-Tom aus dem Forum MFC (Visual 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.



  • ja, ohne fehlermeldung wird das nix.
    Aber so sieht bei mir eine aufs notwendigste reduzierte win32-Anwendung aus:
    Den Code benutze ich ganz gern als ausgangspunkt für kleine Programme oder tests.

    // MinWInApp.c : Defines the entry point for the application.
    //
    #include <windows.h>
    #include "resource.h"
    
    // C RunTime Header Files
    #include <stdlib.h>
    #include <malloc.h>
    #include <memory.h>
    #include <tchar.h>
    
    #define MAX_LOADSTRING 100
    #define SZ_TITLE "MinWinApp"
    #define SZ_WND_CLASS "MINWINAPP"
    
    // Global Variables:
    HINSTANCE g_hInst;                // current instance
    HWND g_hWnd;
    
    TCHAR* szWndClass = TEXT(SZ_WND_CLASS);
    
    LRESULT CALLBACK  WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
      MSG msg;
      WNDCLASSEX wcex;
    
      UNREFERENCED_PARAMETER(hPrevInstance);
      UNREFERENCED_PARAMETER(lpCmdLine);
    
       // TODO: Place code here.
    
      wcex.cbSize = sizeof(WNDCLASSEX);
    
      wcex.style          = CS_HREDRAW | CS_VREDRAW;
      wcex.lpfnWndProc    = WndProc;
      wcex.cbClsExtra     = 0;
      wcex.cbWndExtra     = 0;
      wcex.hInstance      = hInstance;
      wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MINWINAPP));
      wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
      wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
      wcex.lpszMenuName   = NULL;
      wcex.lpszClassName  = szWndClass;
      wcex.hIconSm    = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
      RegisterClassEx(&wcex);
    
       g_hInst = hInstance; // Store instance handle in our global variable
       g_hWnd = CreateWindow(szWndClass, TEXT(SZ_TITLE), WS_OVERLAPPEDWINDOW,
                             CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    
       if (!g_hWnd)
       {
          return FALSE;
       }
    
       ShowWindow(g_hWnd, nCmdShow);
       UpdateWindow(g_hWnd);
    
      // Main message loop:
      while (GetMessage(&msg, NULL, 0, 0))
      {
          TranslateMessage(&msg);
          DispatchMessage(&msg);
      }
    
      return (int) msg.wParam;
    }
    
    //
    //  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
    //
    //  PURPOSE:  Processes messages for the main window.
    //
    //  WM_COMMAND  - process the application menu
    //  WM_PAINT  - Paint the main window
    //  WM_DESTROY  - post a quit message and return
    //
    //
    LRESULT CALLBACK WndProc(HWND g_hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
      int wmId, wmEvent;
      PAINTSTRUCT ps;
      HDC hdc;
    
      switch (message)
      {
      case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Parse the menu selections:
        switch (wmId)
        {
        case 0:
        default:
          return DefWindowProc(g_hWnd, message, wParam, lParam);
        }
        break;
      case WM_PAINT:
        hdc = BeginPaint(g_hWnd, &ps);
        // TODO: Add any drawing code here...
        EndPaint(g_hWnd, &ps);
        break;
      case WM_DESTROY:
        PostQuitMessage(0);
        break;
      default:
        return DefWindowProc(g_hWnd, message, wParam, lParam);
      }
      return 0;
    }
    


  • richtiges Project in deiner IDE gewählt ?
    Nix Konsole - du willst Windows !

    MfG f.-th.


Log in to reply