Windows程序设计画图实现哆啦A梦

在看雪论坛上看到的一个帖子,很喜欢,转载一下。原文地址: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

时间: 2024-11-11 17:47:56

Windows程序设计画图实现哆啦A梦的相关文章

Windows 程序设计 复习笔记(共 77 问)

Windows 程序设计 复习笔记(共 77 问) (个人整理,仅做复习用 :D,转载注明出处:http://blog.csdn.net/hcbbt/article/details/42706501) 知识点 双字节字符集和Unicode字符集有何区别?采用双字节字符集有何问题 双字节字符集(DBCS)编码是0-255,DBCS含有1字节代码与2字节代码,而Unicode是统一的16位系统,这样就允许表示 65536个字符.Unicode中的每个字符都是16位宽而不是8位宽.在Unicode中,

哆啦A梦杀入中国手游 是惊喜还是惊吓

对于很多80后乃至90后来说,日本动漫永远是童年最美好的回忆之一.直到现在,仍然影响着很多人的行为举止乃至世界观.与现在只知道喜洋洋.大头儿子的零零后相比,真心幸福许多.也正是因为日本动漫在国内巨大的影响力,让众多周边企业对其的再开发带来的潜在收益垂涎三尺. 尤其是在移动互联网领域,由于80后.90后正是手游的消费主力,众多日本动漫开始变着花样杀入国内手游市场,甚至曝出一出出版权闹剧.近日,<哆啦A梦>版权商正式确定,与国内手游厂商企业合作推出手游.对于"蓝胖子"的粉丝来说

关于《Windows程序设计(第五版)》中一个实例程序的疑问

最近一直在看Charlse Petzold的<Windows程序设计>,作为一个新得不能再新的新手,只能先照着书的抄抄源码了,之前的例子一直都很正常,但昨天遇到一个很诡异的BUG. 先看实例源码吧: 1 /*----------------------------------------------------------------- 2 ENVIRON.C -- Environment List Box 3 (c) Charles Petzold,1998 4 Copy by XXXX,2

创建【哆啦A梦】风格字体

学习canvas,为作画.对于一个毫无逻辑思维的人简直遭罪啊~想象坐标坐标坐标啊- - 好啦言归正传,基于本月16号,在春熙路IFS展出120只哆啦a梦,以及canvas的作用,在此介绍一种PS的美化:哆啦a梦的风格的字体. 第一步:背景铺垫 新建一个600像素×300像素,分辨率为72像素/英寸的文档,设置前景色为#30a1e4,背景色为#056199.选择渐变工具,打开渐变编辑器,预设选从前景色到背景色.然后从中心往角落拉个渐变,这样背景就算完成了. 第二步:书写文字 以“ZCOOL”为例,

windows程序设计笔记

2014.05.06 新建一个visual C++ -- 常规 -- 空白 的项目,用.c后缀名指定这是一个用C语言来写的windows项目.和C语言的hellworld程序做了一个比较,按照windows程序设计规定的入口函数名称.函数参数.参数传递方式等写个入口函数,并弹出一个MessageBox. windows程序设计笔记,布布扣,bubuko.com

突然想起哆啦A梦里的某一首诗

<哆啦A梦>长篇<宇宙开拓>主题曲<放松心情>作词:武田铁矢    我终于发现,/昨日失去的一切,/虽然还无法完全意会,/可是对我却非常重要./加紧脚步追赶,/但是昨日已经远去,/伸长手臂追寻,/如今已随风飘逝./放松心情!/放松心情!/追忆也是甜美的!/放松心情!/放松心情!/请别轻言放弃./放松心情!/放松心情!/回到昨日去!/放松心情!/放松心情!/明日正等着你. 找了有点久.

Windows程序设计笔记4:第10章:TCP/IP和网络通信

WinSock接口:Windows处理网络的API 套接字socket 流套接字:SOCKET_STREAM           可靠连接   TCP HTTP POP3 数据报套接字:SOCKET_DGRAM     不可靠连接 UDP 寻址方式: 1:sockaddr的第1个版本 struct sockaddr{ u_short  sa_family;       //地址家族 char      sa_data[14];   //数据 } 2.sockaddr的TCP/IP版本的 sock

为游戏卖萌,哆啦A梦蛮拼的,这就是营销

产品和游戏一旦联系到一起,难免产生诸多亮点和"吐槽点",足以在社交网络上形成一个个粉丝主动传播热点 文/张书乐 原载于<人民邮电报>2016年11月18日<乐游记>专栏123期 上期专栏谈到了皮卡丘.超级玛丽"合体",黑武士维达与变形金刚组合,我突然想到了此前收到的一份朋友寄来的"奇葩"生日礼物--"蓝胖子"(即哆啦A梦)与变形金刚的"合体".当然,这只是作为"蓝胖子&qu

[css]我要用css画幅画(七) - 哆啦A梦

接着之前的[css]我要用css画幅画(六),今天画的有所不同,画的是哆啦A梦,我们小时候对他的称呼其实是小叮当机器猫. (PS:这次我要做的事情,很多人已经做过,这并不是什么创新,我只是在学习并记录下学习的过程) 这次就不多说CSS属性的基础概念了. 说说我画的过程吧, 好,进入正题. 因为和之前的瞎画不同,这次是画现有的东西.我认为临摹是比较简单的. 我先上网找了下要临摹的对象,找了个最中规中矩的图片,如下: 这对我来说不是一个简单的任务, 而我处理不简单的任务的解决方案,就是把他拆分再拆分