Functions problem

Hi there, how do i get this function to draw a sine wave:


double y, x, Pi, TwoPi;

HDC hDC;
Pi = 3.14159;
TwoPi = 6.28318;

for(x=0; x < TwoPi; x++) {
y = sin(x);
SetPixel(hDC , 600, y, color);

Working in this default window program? (where do i declare the fuction, call it, etc)

#include <windows.h>
#include <math.h>

COLORREF color = RGB(255, 0, 0);

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
switch(Message) {

case WM_DESTROY: {
PostQuitMessage(0);
break;
}

default:
return DefWindowProc(hwnd, Message, wParam, lParam);
}
return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
WNDCLASSEX wc; /* A properties struct of our window */
HWND hwnd;
HDC hDC; /* A 'HANDLE', hence the H, or a pointer to our window */
MSG msg; /* A temporary location for all messages */

/* zero out the struct and set the stuff we want to modify */
memset(&wc,0,sizeof(wc));
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = WndProc; /* This is where we will send messages to */
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);

/* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszClassName = "WindowClass";
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */

if(!RegisterClassEx(&wc)) {
MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
return 0;
}

hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, /* x */
CW_USEDEFAULT, /* y */
640, /* width */
480, /* height */
NULL,NULL,hInstance,NULL);

if(hwnd == NULL) {
MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
return 0;
}

/*
This is the heart of our program where all input is processed and
sent to WndProc. Note that GetMessage blocks code flow until it receives something, so
this loop will not produce unreasonably high CPU usage
*/
while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */
TranslateMessage(&msg); /* Translate key codes to chars if present */
DispatchMessage(&msg); /* Send it to WndProc */
}
return msg.wParam;
}
In WndProc Add something like this:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
switch(Message) {

case WM_PAINT:
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hWnd, &ps);

// Do your drawing here (using hdc)...

    EndPaint(hWnd, &ps);
break;

case WM_DESTROY: {
PostQuitMessage(0);
break;
}

default:
return DefWindowProc(hwnd, Message, wParam, lParam);
}
return 0;
}

What is hdc??

Why do i declare it?

Why do i call it?

thanks
That HDC seems to be part of MS Windows API: https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx

API, Application Programming Interface defines the rules how your application can interact with -- in this case the machinery that actually draws something to screen.

If you want to use, say std::vector of C++ Standard Library, then you have to read the library's documentation. Similarly, if you want to use the Windows API, then you have to read the MS's documentation.
What is hdc??
hdc is what you use here to draw the curve:
1
2
3
4
5
6
7
8
9
double y, x, Pi, TwoPi;

HDC hDC;
Pi = 3.14159;
TwoPi = 6.28318;

for(x=0; x < TwoPi; x++) {
y = sin(x);
SetPixel(hDC , 600, y, color); // Note: 600 + x otherwise you draw just a line 


I forgot something:
1
2
3
4
5
6
7
8
9
10
case WM_PAINT:
{ // Note: you need the curly brace in order to define variables in switch case
    PAINTSTRUCT ps;
    HDC hDC = BeginPaint(hWnd, &ps);

// Do your drawing here (using hdc)...

    EndPaint(hWnd, &ps);
} // End curly brace
break;
Last edited on
Thanks for your help! i sorted out a lot of the errors and this seems to be the only one left:

In function 'LRESULT WndProc(HWND, UINT, WPARAM, LPARAM)':
line 27 [Error] expression list treated as compound expression in initializer [-fpermissive]


heres my code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <windows.h>
#include <math.h>

COLORREF color = RGB(0, 0, 255);

/* This is where all the input to the window goes to */
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
	switch(Message) {
		
		case WM_DESTROY: {
			PostQuitMessage(0);
			break;
		}
		
		case WM_PAINT: {

    	PAINTSTRUCT ps;
    	HDC hdc = BeginPaint(hwnd, &ps);

		double y, x, Pi, TwoPi;
	
		Pi = 3.14159;
		TwoPi = 6.28318;
	
		for(x=0; x < TwoPi; x++) {
		y = sin(x);
		COLORREF SetPixel(hdc, 600, y, color);

    	EndPaint(hwnd, &ps);
			break;
		}
	}
	
		default:
			return DefWindowProc(hwnd, Message, wParam, lParam);
	}
	return 0;
}

/* The 'main' function of Win32 GUI programs: this is where execution starts */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	WNDCLASSEX wc; /* A properties struct of our window */
	HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */
	MSG msg; /* A temporary location for all messages */

	
	memset(&wc,0,sizeof(wc));
	wc.cbSize		 = sizeof(WNDCLASSEX);
	wc.lpfnWndProc	 = WndProc; /* This is where we will send messages to */
	wc.hInstance	 = hInstance;
	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
	
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.lpszClassName = "WindowClass";
	wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
	wc.hIconSm		 = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */
	
	


	if(!RegisterClassEx(&wc)) {
		MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}

	hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, /* x */
		CW_USEDEFAULT, /* y */
		640, /* width */
		480, /* height */
		NULL,NULL,hInstance,NULL);


	if(hwnd == NULL) {
		MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}

	//	All input is processed here and sent to WndProc.		

	while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */
		TranslateMessage(&msg); /* Translate key codes to chars if present */
		DispatchMessage(&msg); /* Send it to WndProc */
	}
	return msg.wParam;
}
remove COLORREF before SetPixel.

The brace on line 31 is misplaced. Move it to line 28.

By the way: This way you won't see much. One or two pixel that's all. x is not moved and y is something between 0 and 1.
Now i'm getting this:

C:\Users\Mark\AppData\Local\Temp\ccgkTIsC.o main.cpp:(.text+0xc1): undefined reference to `__imp_SetPixel'
SetPixel() is in the

Gdi32.lib

you need to add this library to your project. See

https://msdn.microsoft.com/en-us/library/windows/desktop/dd145078%28v=vs.85%29.aspx
How do i add this library to my project in dev c++??
Last edited on
Topic archived. No new replies allowed.