Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Anfänger: Setpixel funktioniert nicht?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.02.2003, 09:15 Uhr
~RiX0n
Gast


hallo,
ich möchte langsam mit der Spieleprogrammierung in C++ anfangen. Als erstes Ziel habe ich mir eine Partikelsimulation mit GDI-Funktionen gesetzt.

jetzt habe ich folgende WinMain-Funktion

C++:
{

...
Init();
...

BOOL notdone=TRUE;
HDC hdc;
PAINTSTRUC ps;

while (notdone)
{
if (PeekMessage (??)
{
  TranslateMessage (??);
  DispatchMessage (??);
}
else
{
  //Berechnungen
  hdc = BeginPaint (hWnd, &ps);
  SetPixel (hdc, 100, 100, RGB (128, 128, 128));
  EndPaint (hWnd, &ps);
}
}


Ich weiß jetzt nicht, ob die Parameter jetzt so hundertprozentig stimmen, aber auf jeden fall plottet er keine Pixel . Die Berechnungen führt er aber aus. Wenn ich dagegen bei WM_PAINT genauso einen Pixel zeichne, funktioniert es.
Noch eine zweite Frage, wie kann ich weiße Schrift ausgeben, auch in der Schleife?

Dieser Post wurde am 16.02.2003 um 12:35 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.02.2003, 18:22 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
hierher verschoben da API
Zum Thema:
Die Parameter an SetPixel() sind korrekt.

C++:
#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("PixelTest") ;
     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)){    
          MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"),
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
    
     hwnd = CreateWindow (szAppName, TEXT ("PixelTest"),
                          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 ;
     PAINTSTRUCT ps ;
    
     switch (message){
     case WM_SIZE:
          cxClient = LOWORD (lParam) ;
          cyClient = HIWORD (lParam) ;
          return 0 ;
          
     case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps) ;

          SetPixel(hdc,100,100,RGB(0,0,0));

          EndPaint (hwnd, &ps) ;
          return 0 ;
          
     case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}


Beim genauen hinschauen erkennt man sorgar das Pixel
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe

Dieser Post wurde am 15.02.2003 um 18:25 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.02.2003, 20:24 Uhr
~RiX0n
Gast


ja, so funzt es bei mir auch, aber es geht mir darum, dass Programm mit 100% cpu-auslastung laufen zu lassen. es soll ja später mal ein spiel werden... und da möcht ich halt nicht über WM_PAINT gehen... kann man also nur in WM_PAINT was zeichnen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.02.2003, 12:33 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo RiX0n,
Du kannst z.B. auch beim auslösen eines Mausereignisses zeichnen, aber WM_PAINT wird immer aufgerufen, wenn etwas neu zuzeichnen ist (z.B. Fenstergröße ändern). Da nun in WM_PAINT nichts ist, wird Dein zuvor erstelltes Objekt gelöscht.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe

Dieser Post wurde am 16.02.2003 um 12:33 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.02.2003, 19:14 Uhr
PacMan




C++:
{

...
Init();
...

BOOL notdone=TRUE;
HDC hdc;
PAINTSTRUC ps;

hdc = GetDC(hWnd); //Vorausgesetzt, dass schon ein Fenster existiert

while (notdone)
{
if (PeekMessage (??)
{
TranslateMessage (??);
DispatchMessage (??);
}
else
{
//Berechnungen
SetPixel (hdc, 100, 100, RGB (128, 128, 128));
}



Das sollte eigentlich auch funktionieren.

Dieser Post wurde am 17.02.2003 um 19:15 Uhr von PacMan editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.07.2004, 11:34 Uhr
~nichts
Gast


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: