Simpler Graph



  • hi,
    sicher eine klassikerfrage, nämlich wie kann ich denn mit der winapi einen simplen graf erstellen?
    habe bereits gegoogelt und dort gelesen, dass man zig sachen implementieren muss (da grafisch)..
    ich habe allerdings die vermutung (bzw die hoffnung), dass man das für graphen braucht, die etwas aufwendiger sind, sprich ich kann bestimmte stellen mit der maus anklicken etc. etc.

    das ist allerdings für meine verwendung viel zu umfang reich. ich brauche lediglich eine x und y achse mit beschriftung und dann eben die fähigkeit ein paar graphen anzeigen zu lassen.

    komm ich um das implementieren von activex etc. nicht drum rum, oder gibt es doch eine simplere lösung? wenn ja, wie wäre denn das stichwort dazu

    thx


  • Mod

    So etwas gibt es in der Windows API nicht.
    Musst Du selberprogramieren oder zu einer Bibliothek greifen. Was passendes in der Form kenne ich nicht.

    Für einen ungerichteten Graphen Editor musste ich alles selbst schreiben.



  • Was für Graphen meinst du denn genau?
    Einen Graph einer mathematischen Funktion kannst du einfach zeichnen indem du die x Koordinate durchgehst, jeweils den y Wert mithilfe der Funktion berechnest und dann einfach die Punkte zeichnest (bzw. mit einer Linie verbindest). Linien und Punkte zeichnen geht ja mit der WinApi ganz einfach. Die Achsen musst du halt auch noch entsprechend zeichnen. Wenn die Funktion nicht fest im Quelltext steht, bräuchte man natürlich noch einen Parser für mathematische Ausdrücke der dir eine Baumstruktur oder ähnliches erzeugt, die du dann dynamisch ausführen kannst.

    /*---------------------------------------
       SINEWAVE.C – Sinuskurve über Polyline
                   (c) Charles Petzold, 1998
      ---------------------------------------*/
    
    #include <windows.h>
    #include <math.h>
    
    #define NUM    1000
    #define TWOPI  (2 * 3.14159)
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static TCHAR szAppName[] = TEXT ("SineWave") ;
         HWND         hwnd ;
         MSG          msg ;
         WNDCLASS     wndclass ;
    
         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         wndclass.lpszMenuName  = NULL ;
         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, TEXT ("Sinuskurve mit Polyline"),
                              WS_OVERLAPPEDWINDOW,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              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 int  cxClient, cyClient ;
         HDC         hdc ;
         int         i ;
         PAINTSTRUCT ps ;
         POINT       apt [NUM] ;
    
         switch (message)
         {
         case WM_SIZE:
              cxClient = LOWORD (lParam) ;
              cyClient = HIWORD (lParam) ;
              return 0 ;
    
         case WM_PAINT:
              hdc = BeginPaint (hwnd, &ps) ;
    
              // horizontaler Mittelstrich
              MoveToEx (hdc, 0,        cyClient / 2, NULL) ;
              LineTo   (hdc, cxClient, cyClient / 2) ;
    
              for (i = 0 ; i < NUM ; i++)
              { // Einzelstücke berechnen
                   apt[i].x = i * cxClient / NUM ;
                   apt[i].y = (int) (cyClient / 2 * (1 - sin (TWOPI * i / NUM))) ;
              }
              // und auf einen Rutsch zeichnen
              Polyline (hdc, apt, NUM) ;
    
              EndPaint (hwnd, &ps) ;
              return 0 ;
    
         case WM_DESTROY:
              PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    

    Das hier ist ein Codebeispiel aus dem Buch "Windows-Programmierung: Das Entwicklerhandbuch zur WIN32-API" von "Charles Petzold"


Anmelden zum Antworten