C++ Win32 API - Zeichnen

Paxo

Cadet 1st Year
Registriert
Apr. 2014
Beiträge
9
Hallo, ich bin neu hier auf der Seite und habe gehofft, dass man mir hier weiterhelfen kann.
Ich würde mich als fortgeschrittenen Einsteiger sehen, wenn es ums Programmieren geht. Denoch soll ich eine alte Software, die noch aus dos-Zeiten stammt, mit Hilfe der Win32 API, Windows 7 kompatibel machen.

Ich benutze ich Visual Stuido 2013 und programmiere mit der WIN32 API.

Ich habe Probleme zwecks des Zeichnens in Funktionen. Das Zeichnen in der
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg,WPARAM wParam, LPARAM lParam) - Funktion ist kein Ding, da man da ja einfach unter WM_PAINT ganz leicht Zeugs zeichnen kann.
Es ist jetzt auch nicht schwer außerhalb des "case WM_PAINT" zu zeichnen, solange ich mich in der WndProc befinde - Ich benutze da immer hDC = GetDC(hWnd); und ReleaseDC(hWnd, hDC);.

Jetzt habe ich allerdings einige Funktionen außerhalb von LRESULT CALLBACK WndProc, in denen ich gewisse Dinge Zeichnen muss (zB. Linien, die je nach Variablen einen Graphen zeichnen).
Ich weiß einfach nicht wie ich sowas zeichnen lassen kann :/
Ich habe da zB. eine Funktion int screen_u(void), in der verschiedenes berechnet und dann gezeichnet werden soll, die auch in mehreren weiteren Funktionen auftaucht.
hWnd ist mein Handle für das Hauptfenser, ich kann es nicht einfach in die "aussenstehenden" Funktionen mit "HWND hWnd" integrieren, weil es so nicht initiallisiert wird.

Ich hoffe das ich mein Problem gut geschildert habe
mfg
 
geht das bei dir nicht?

Code:
case WM_PAINT:
{
    PAINTSTRUCT psPaint;
    const HDC hdc = BeginPaint( hwnd, &psPaint );

    const int result = screen_u( hdc, psPaint );

    EndPaint (hwnd, &psPaint);
    return result;
}

mit
Code:
int screen_u( HDC hdc, const PAINTSTRUCT& psPaint );
 
Zuletzt bearbeitet:
Hi mino,
danke für deine Antwort, ich editier hier einfach mein alten Beitrag.
Ich habe es jetzt mal so versucht, wie du es gesagt hast und es funktioniert nicht ganz wie gewollt.

Habe eine test-funktion erstellt, einfach um zu sehen was passiert.
screen_u:
Code:
int screen_u(HDC hdc, const PAINTSTRUCT& ps){

HBRUSH hOldBrush, hWhiteBrush;	//Pinsel
HPEN hOldPen, hWhitePen;        //Stift

hWhiteBrush = CreateSolidBrush(RGB(255, 255, 255));     // Pinsel erstellen
hWhitePen = CreatePen(PS_SOLID, 0, RGB(255, 255, 255)); // Stift erstellen

hOldBrush = (HBRUSH)SelectObject(hdc, hWhiteBrush);	//weißen Pinsel einsetzen
hOldPen = (HPEN)SelectObject(hdc, hWhitePen);		//weißen Stift einsetzen 
Ellipse(hdc, 10, 10, 300, 300);

DeleteObject(hWhitePen); hWhitePen = NULL;     // Stift freigeben
DeleteObject(hWhiteBrush); hWhiteBrush = NULL; // Pinsel freigeben

return(0);
}

und im case WM_PAINT:
Code:
 hdc = BeginPaint(hWnd, &ps);
const int result = screen_u(hdc, ps);
EndPaint(hWnd, &ps);
return result;

Das Problem dabei ist, dass diese Ellipse dauernd gezeichnet wird. Ich Starte das Programm und sie ist schon zu sehen. Allerdings sollten die Funktionen erst etwas zeichnen, wenn etwas bestimmtes passiert ist - zB. wenn ich ein Knopf drücke oder ein bestimmter switch-case auftritt.

Habe mal schnell ein Beispiel gemacht:
Code:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        int wmId, wmEvent;
	HDC hdc;

	switch (message)
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		
		switch (wmId)
		{
		case IDC_Button1:               //es wird ein Knopf gedrückt
			hdc = GetDC(hWnd);   
			screen_u(hdc, ps);      //erst jetzt soll Funktion aufgerufen werden
			ReleaseDC(hWnd, hdc);
			break;
               }
          }
}

Auch habe ich wie gesagt mehrere Funktionen, in denen gezeichnet werden soll. Kann ich dann im case WM_PAINT:
anstatt:
Code:
const int result = screen_u(hdc, ps);
return result;
eine Struktur (struct result result) anlegen und sagen:
Code:
result.funktion1 = funktion1(hdc, ps);  
result.funktion2 = funktion2(hdc, ps);
result.funktion3 = funktion3(hdc, ps);
return result;
 
Zuletzt bearbeitet:
habe dieses thema ehrlich gesagt das letzte mal vor 15 jahren gemacht :)

wie es aussieht, kannst es genau so machen wie in deiner eingangsfrage, jedoch musst du nach ende des zeichnens InvalidateRect aufrufen.
beispiel hier, ganz unten.
 
Du verstehst den Messageloop noch nicht komplett.
Sehs so: Windows meldet dir alles, was passiert im Messageloop.
Daher: Im Messageloop keine blockierende Dinge tun.

Was du realisieren willst, erfordert, dass du den Status "Button-gedrückt" irgendwo anders speicherst.
Wenn jetzt WM_PAINT kommt, musst du schauen, was es für ein Status hat und entsprechend zeichnen.
InvalidateRect ist nicht notwendig.
 
Hi,
nochmal danke für die Antworten, es scheint jetzt alles so zu funktionieren, wie es sollte.

mfg
 
Zurück
Oben