1. 程式人生 > >Windows程序設計畫圖實現哆啦A夢

Windows程序設計畫圖實現哆啦A夢

erl object rbac eight number spa raw jpg date

在看雪論壇上看到的一個帖子,很喜歡,轉載一下。原文地址:http://bbs.pediy.com/showthread.php?t=138630
哆啦A夢是畫出來的,不知道作者算這些坐標位置算了多久,真的很犀利。記得原來看《Windows程序設計》的時候,每次看到GDI都不是很理解,也沒有仔細去研究。現在編程也很少與GDI打交道,還是等以後有空了在深入了解一下吧。把這個代碼轉載一份到博客,以後再回頭研究一下。順便貼一下程序運行後的截圖:(很酷吧~~~)
字數補丁~代碼瘋子~程序人生~字數補丁~代碼瘋子~程序人生~字數補丁~代碼瘋子~程序人生
技術分享

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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
// 請以C語言後綴(*.c)保存文件
#include <windows.h>
#include <math.h>
 
#define NUM    1000
#define TWOPI  (2 * 3.1415926)
 
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
 
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
	static TCHAR szAppName[] = TEXT ("HelloWin") ;
	HWND         hwnd ;
	MSG          msg ;
	WNDCLASS     wndclass ;
	int cx, cy ; 
	cx = GetSystemMetrics(SM_CXSCREEN) / 2 - 200;
	cy = GetSystemMetrics(SM_CYSCREEN) / 2 - 200; 
 
	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 (/*GRAY*/WHITE_BRUSH) ;
	wndclass.lpszMenuName  = NULL ;
	wndclass.lpszClassName = szAppName ;
 
	if (!RegisterClass (&wndclass))
	{
		MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
			szAppName, MB_ICONERROR) ;
		return 0 ;
	}
 
	RegisterClass (&wndclass);
 
	hwnd = CreateWindow (szAppName,                  // window class name
		TEXT ("The Hello Program"), // window caption
		WS_OVERLAPPEDWINDOW,        // window style
		cx,               // initial x position
		cy,               // initial y position
		400,              // initial x size
		400,              // initial y size
		NULL,                       // parent window handle
		NULL,                       // window menu handle
		hInstance,                  // program instance handle
		NULL) ;                     // creation parameters
 
	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 cxClient, cyClient ;
	HBRUSH hBrush ;
	int i ;
	POINT apt[NUM],
		leftHand[] = {
			cxClient / 2 - 60, cyClient / 2 - 20,
			cxClient / 2 - 100, cyClient / 2 + 10,
			cxClient / 2 - 100, cyClient / 2 + 30,
			cxClient / 2 - 60, cyClient / 2 + 10
	},
	rightHand[] = {
		cxClient / 2 + 60, cyClient / 2 - 20,
		cxClient / 2 + 100, cyClient / 2 + 10,
		cxClient / 2 + 100, cyClient / 2 + 30,
		cxClient / 2 + 60, cyClient / 2 + 10
			} ;
 
			switch (message)
			{
			case WM_SIZE:
				cxClient = LOWORD (lParam) ;
				cyClient = HIWORD (lParam) + 120;
				return 0 ;
 
			case WM_PAINT:
				hdc = BeginPaint (hwnd, &ps) ;
 
				Ellipse (hdc, cxClient / 2 - 70, cyClient / 2 + 55, cxClient / 2, cyClient / 2 + 85) ;      //腳
				Ellipse (hdc, cxClient / 2, cyClient / 2 + 55, cxClient / 2 + 70, cyClient / 2 + 85) ;
 
				hBrush = CreateSolidBrush (RGB (100, 150, 255)) ;
				SelectObject (hdc, hBrush) ;
 
				//    Rectangle (hdc, cxClient / 2 - 60, cyClient / 2 - 60, cxClient / 2 +60, cyClient / 2 + 70);    //身體
				RoundRect (hdc, cxClient / 2 - 60, cyClient / 2 - 60, cxClient / 2 + 60, cyClient / 2 + 70, 50, 20);
 
				DeleteObject (hBrush) ;
 
				hBrush = GetStockObject (WHITE_BRUSH) ;
				SelectObject (hdc, hBrush) ;
 
				Ellipse (hdc, cxClient / 2 - 50, cyClient / 2 - 50, cxClient / 2 + 50, cyClient / 2 + 50) ;    //肚子部分
 
				hBrush = CreateSolidBrush (RGB (100, 150, 255)) ;
				SelectObject (hdc, hBrush) ;
 
				Ellipse (hdc, cxClient / 2 - 100, cyClient / 2 - 220, cxClient / 2 +100, cyClient / 2 - 20) ;  //頭部
 
				DeleteObject (hBrush) ;
 
				hBrush = GetStockObject (WHITE_BRUSH) ;
				SelectObject (hdc, hBrush) ;
 
				Ellipse (hdc, cxClient / 2 - 85, cyClient / 2 - 170, cxClient / 2 + 85, cyClient / 2 - 20) ;  //臉部
				Ellipse (hdc, cxClient / 2 - 40, cyClient / 2 - 190, cxClient / 2, cyClient / 2 - 140 ) ;    //眼眶左
				Ellipse (hdc, cxClient / 2, cyClient / 2 - 190, cxClient / 2 + 40, cyClient /2 - 140) ;      //眼眶右
 
				hBrush = GetStockObject (BLACK_BRUSH) ;
				SelectObject (hdc, hBrush) ;
 
				Ellipse (hdc, cxClient / 2 - 15, cyClient / 2 - 155, cxClient / 2 -10, cyClient / 2 - 150) ;  //眼睛左
				Ellipse (hdc, cxClient / 2 + 10, cyClient / 2 - 155, cxClient / 2 + 15, cyClient / 2 -150) ;  //眼睛右
 
				DeleteObject (hBrush) ;
 
				hBrush = CreateSolidBrush (RGB (255, 0, 0)) ;
				SelectObject (hdc, hBrush) ;
 
				Ellipse (hdc, cxClient / 2 - 10, cyClient / 2 - 150, cxClient / 2 +10, cyClient / 2 -130) ;    //鼻子
 
				MoveToEx (hdc, cxClient / 2, cyClient / 2 -130, NULL) ;
				LineTo (hdc, cxClient / 2, cyClient / 2 - 60) ;
 
				MoveToEx (hdc, cxClient / 2 - 40, cyClient / 2 - 75, NULL);          //嘴
				for (i = 0; i < NUM / 2; i++)
				{
					apt[i].x = cxClient / 2 - 40 + i * 160 / NUM ;
					apt[i].y = cyClient / 2 - 75 +(int) (30 * sin (TWOPI * i / NUM)) / 2 ; 
					LineTo(hdc, apt[i].x, apt[i].y) ;
				} 
 
				MoveToEx (hdc, cxClient / 2 - 60, cyClient / 2 - 140, NULL) ;        //胡須
				LineTo (hdc, cxClient / 2 - 20, cyClient / 2 - 120) ;
 
				MoveToEx (hdc, cxClient / 2 - 60, cyClient / 2 - 110, NULL) ;
				LineTo (hdc, cxClient / 2 - 20, cyClient / 2 - 110) ;
 
				MoveToEx (hdc, cxClient / 2 - 60, cyClient / 2 - 80, NULL);
				LineTo (hdc, cxClient / 2 - 20, cyClient / 2 - 100) ;
 
				MoveToEx (hdc, cxClient / 2 + 60, cyClient / 2 -140, NULL) ;
				LineTo (hdc, cxClient / 2 + 20, cyClient / 2 - 120) ;
 
				MoveToEx (hdc, cxClient / 2 + 60, cyClient / 2 - 110, NULL) ;
				LineTo (hdc, cxClient / 2 +20, cyClient / 2 - 110) ;
 
				MoveToEx (hdc, cxClient / 2 +60, cyClient / 2 - 80, NULL) ;
				LineTo (hdc, cxClient / 2 + 20, cyClient / 2 - 100) ; 
 
				hBrush = GetStockObject (WHITE_BRUSH) ;                    //口袋
				SelectObject (hdc, hBrush) ;
 
				Chord (hdc, cxClient / 2 - 40, cyClient / 2 - 40, cxClient / 2 + 40, cyClient / 2 +40,
					cxClient / 2 - 40, cyClient / 2 + 10, cxClient / 2 +40, cyClient / 2 + 10) ;
 
 
 
				hBrush = CreateSolidBrush (RGB (255, 0, 0));                //脖子上的套圈
				SelectObject (hdc, hBrush) ;
 
				RoundRect (hdc, cxClient / 2 - 70, cyClient / 2 - 40, cxClient / 2 + 70, cyClient / 2 - 20, 20, 20);
 
				DeleteObject (hBrush) ;
 
				hBrush = CreateSolidBrush (RGB (100, 150, 255)) ;              //手臂
				SelectObject (hdc, hBrush) ;
 
				SetPolyFillMode (hdc, WINDING) ;
				Polygon (hdc, leftHand, 4) ;
 
				SetPolyFillMode (hdc, WINDING) ;
				Polygon (hdc, rightHand, 4) ;
 
				DeleteObject (hBrush) ;
 
				hBrush = GetStockObject (WHITE_BRUSH) ;                    //手
				SelectObject (hdc, hBrush) ;
 
				Ellipse (hdc, cxClient / 2 - 115, cyClient / 2 + 5, cxClient / 2 - 85, cyClient / 2 + 35) ;
				Ellipse (hdc, cxClient / 2 + 115, cyClient / 2 + 5, cxClient / 2 + 85, cyClient / 2 + 35) ; 
 
				hBrush = CreateSolidBrush (RGB (250, 255, 150)) ;              //鈴鐺
				SelectObject (hdc, hBrush) ;
 
				Ellipse (hdc, cxClient / 2 - 10, cyClient / 2 - 35, cxClient / 2 + 10, cyClient / 2 - 15) ;
 
				DeleteObject (hBrush) ;
 
				hBrush = GetStockObject (BLACK_BRUSH) ;
				SelectObject (hdc, hBrush) ;
 
				Ellipse (hdc, cxClient / 2 - 4, cyClient / 2 - 29, cxClient / 2 + 4, cyClient / 2 - 21) ;
 
				MoveToEx (hdc, cxClient / 2, cyClient / 2 - 25, NULL) ;
				LineTo (hdc, cxClient / 2, cyClient / 2 - 15) ;
 
				EndPaint (hwnd, &ps) ;
				return 0 ;
 
			case WM_DESTROY:
				PostQuitMessage (0) ;
				return 0 ;
 
			}
			return DefWindowProc (hwnd, message, wParam, lParam) ;
}

http://www.programlife.net/using-windows-programming-paint-doraemon.html

Windows程序設計畫圖實現哆啦A夢