Paules-PC-Forum.de Anzeige:

Microsoft Windows Intune: PC-Verwaltung und -Sicherheit in der Cloud: Updateverwaltung, Anti-Virus und vieles mehr!


Zurück   Paules-PC-Forum.de > Programmierung > C/C++, Visual C++, Visual C++.NET

C/C++, Visual C++, Visual C++.NET Fragen und Antworten zu C/C++, Visual C++ und Visual C++.NET

EM-Tippspiel

Paule bei Facebook


Paule bei Twitter


Letzte Forenthemen
Gehe zum ersten neuen Beitrag PPF - Shoppingwahn
Aufrufe: 50847, Antworten: 1390
Gehe zum ersten neuen Beitrag PPF - Spiel "Wörter weiter...
Aufrufe: 26606, Antworten: 4194
Gehe zum ersten neuen Beitrag Windows Oberfläche (Schrift,...
Aufrufe: 175, Antworten: 10
Gehe zum ersten neuen Beitrag Von Live CD Windowspfad...
Aufrufe: 63, Antworten: 5
Gehe zum ersten neuen Beitrag TabCtrl
Aufrufe: 121, Antworten: 12
Gehe zum ersten neuen Beitrag Rechner fährt herunter,...
Aufrufe: 93, Antworten: 4
Gehe zum ersten neuen Beitrag Dateien lassen sich nicht...
Aufrufe: 17, Antworten: 2
Gehe zum ersten neuen Beitrag Suche Programm um Werbung zu...
Aufrufe: 48, Antworten: 2
Gehe zum ersten neuen Beitrag McAfee AVERT Stinger...
Aufrufe: 12, Antworten: 0
Gehe zum ersten neuen Beitrag Sticky Password 6.0.2...
Aufrufe: 24, Antworten: 0
Zeige:





Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 02.08.2008, 15:33   #1 (Direktlink)
Speedy_92
Gast
 
Beiträge: n/a
Standard [Win32 API] Fragen zur GDI und zum Programmierstil.

Hallo,
ich habe ein kleines Manko. Ich habe ein wenig mit der GDI gespielt und wenn ich mein Programm öffne sollten eigentlich die Zeichnungen sofort erscheinen... Doch das tun sie nicht. Erst wenn von Windows aus das Ereignis WM_PAINT aufgerufen wird (also z.B. durch verändern der Größe des Fensters) wird die Zeichnung dargestellt. Wenn ich ihn ein wenig ändere funktioniert es... warum nur?

Code:
Code:
#include <windows.h>
#include <cmath>

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
				   PSTR szCmdLine, int iCmdShow)
{
	static TCHAR szAppName[] = TEXT("GDI");
	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))
		return 0;

	hwnd = CreateWindow(szAppName,
						TEXT("GDI - Grundlagen"),
						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)
{
	HDC hdc;
	PAINTSTRUCT ps;
	static int xPos, yPos;
	const int DIM = 10000;
	const double double_PI = 2 * 3.14159;
	static POINT points[DIM];

        for(int i = 0; i < DIM; i++) //Es geht um diesen Teil
	{
	    points[i].x = i * xPos / DIM;
	    points[i].y = (int)(yPos / 2 * (1 - sin(double_PI * i / DIM)));
	}

	switch(message)
	{
	case WM_SIZE:
		xPos = LOWORD(lParam);
		yPos = HIWORD(lParam);
	case WM_PAINT:
		hdc = BeginPaint(hwnd, &ps);
			MoveToEx(hdc, 0, 0, NULL);
			LineTo(hdc, xPos, yPos);
			MoveToEx(hdc, 0, yPos, NULL);
			LineTo(hdc, xPos, 0);
			
			Polyline(hdc, &points[0], DIM);
		EndPaint(hwnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd, message, wParam, lParam);
}
veränderter Code:
Code:
#include <windows.h>
#include <cmath>

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
				   PSTR szCmdLine, int iCmdShow)
{
	static TCHAR szAppName[] = TEXT("GDI");
	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))
		return 0;

	hwnd = CreateWindow(szAppName,
						TEXT("GDI - Grundlagen"),
						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)
{
	HDC hdc;
	PAINTSTRUCT ps;
	static int xPos, yPos;
	const int DIM = 10000;
	const double double_PI = 2 * 3.14159;
	static POINT points[DIM];

	switch(message)
	{
	case WM_SIZE:
		xPos = LOWORD(lParam);
		yPos = HIWORD(lParam);
	case WM_PAINT:
		hdc = BeginPaint(hwnd, &ps);
			MoveToEx(hdc, 0, 0, NULL);
			LineTo(hdc, xPos, yPos);
			MoveToEx(hdc, 0, yPos, NULL);
			LineTo(hdc, xPos, 0);

			for(int i = 0; i < DIM; i++) //Es geht um diesen Teil
			{
				points[i].x = i * xPos / DIM;
				points[i].y = (int)(yPos / 2 * (1 - sin(double_PI * i / DIM)));
			}
			
			Polyline(hdc, &points[0], DIM);
		EndPaint(hwnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd, message, wParam, lParam);
}
Wenn ich die for-Schleife also in das WM_PAINT Ereignis setze, dann funktioniert die ganze Sache... Aber ich dachte bei UpdateWindow(my_handle_to_window) wird die WndProc mit WM_PAINT als message-Parameter (der 2. Parameter) angegeben (hoffe ihr versteht den Satz ).

Und jetzt zu dem Stil:
Schreib man folgenden Kram immer in die WndProc oder sollte ich das lieber auslagern in einer Funktion oder so? :
Code:
const int DIM = 10000;
	const double double_PI = 2 * 3.14159;
	static POINT points[DIM];

        for(int i = 0; i < DIM; i++) //Es geht um diesen Teil
	{
	    points[i].x = i * xPos / DIM;
	    points[i].y = (int)(yPos / 2 * (1 - sin(double_PI * i / DIM)));
	}
Hoffe ihr könnt meine Fragen beantworten

Gruß Speedy_92
  Mit Zitat antworten
Werbung

Windows 7 Tipps und Tricks in Bildern

Antwort

  Paules-PC-Forum.de > Programmierung > C/C++, Visual C++, Visual C++.NET

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an




Alle Zeitangaben in WEZ +2. Es ist jetzt 05:00 Uhr.


Powered by vBulletin® Version 3.8.7 (Deutsch)
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Powered by vBCMS® 2.7.0 ©2002 - 2012 vbdesigns.de
(c) Paules-PC-Forum.de

::: Impressum :::

Search Engine Optimization by vBSEO 3.3.2