visual C++ 程序设计 旋转风车
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
这是一个小程序,旋转的风车。
按上下左右键,可以加快或者减速。
W,w 或者A,a,或者Q,q可以变大变小,移动。
#include <windows.h>
#include <math.h>
// 回调函数声明
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); // 初始化窗口类声明
BOOL InitWindowsClass(HINSTANCE hInstance, char *lpszClassName);
// 初始化窗口声明
BOOL InitWindows(HINSTANCE hInstance, int nCmdShow, char *lpszClassName, char *lpTitle); WNDCLASS wndclass; // 定义一个窗口类
HWND hwnd; // 定义一个窗口句柄
const double Pi = 3.1415926;
int nMaxNumber = 20; // 叶片循环一周中绘图的次数
int nNum = 0; // 记录当前的顺序
int speed=100;
int nRadious = 50;// 定义圆的半径
int maxsize=20;
int color[20];
BOOL yes=TRUE;
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG Msg; // 定义消息
char lpszClassName[] = "风车"; // 窗口的类名
char lpTitle[] = "基本绘图-旋转的风车"; // 窗口标题名
// 初始化窗口类
if (!InitWindowsClass(hInstance, lpszClassName))
{
return FALSE;
}
// 初始化窗口
if (!InitWindows(hInstance, nCmdShow, lpszClassName, lpTitle))
{
return FALSE;
}
//消息循环
while(GetMessage(&Msg, NULL, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam; // 程序终止时将信息返回系统
}
// 初始化窗口类定义
BOOL InitWindowsClass(HINSTANCE hInstance, char *lpszClassName)
{
//1、窗口类定义
wndclass.style = 0; // 窗口类型为默认类型
wndclass.lpfnWndProc = WndProc; // 窗口处理函数为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 = lpszClassName; //类名为lpClassName
//2、注册窗口类
if (!RegisterClass(&wndclass))
{ // 如果注册失败则发出警告声音
MessageBeep(0);
return FALSE;
}
return TRUE;
}
// 初始化窗口声明
BOOL InitWindows(HINSTANCE hInstance, int nCmdShow, char *lpszClassName, char *lpTitle) {
//3、创建窗口
hwnd = CreateWindow(
lpszClassName,
lpTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
600,
450,
NULL,
NULL,
hInstance,
NULL
);
//4、显示窗口
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
return TRUE;
}
// 回调函数定义
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
HDC hDC; // 定义设备环境句柄
HPEN hPen; // 定义画笔句柄
HBRUSH hBrush; // 定义画刷句柄
PAINTSTRUCT PtStr; // 定义包含绘制信息的结构体变量
POINT pCenterPoint; // 定义一个圆尽心点的坐标
double fAngle; // 叶片的直边与水平轴的夹角
switch(message)
{
case WM_LBUTTONDOWN://单击左键时,叶子暂停旋转
{
nNum++; // 当前充数增加1
Sleep(1000); //等待2秒
InvalidateRect(hwnd, NULL, 1); // 重绘窗口区域
}
case WM_CHAR:
{
if(wParam=='w'||wParam=='W')
{
if(speed>1500)
speed=1500;
speed=speed+3;
InvalidateRect(hwnd, NULL, 1);
}
if(wParam=='q'||wParam=='Q')
{
if(speed<10)
speed=10;
speed=speed-2;
InvalidateRect(hwnd, NULL, 1);
}
if(wParam=='a'||wParam=='A')
{
nRadious=nRadious+2;
InvalidateRect(hwnd, NULL, 1);
}
if(wParam=='S'||wParam=='s')
{
nRadious=nRadious-1;
InvalidateRect(hwnd, NULL, 1);
}
if(wParam=='z'||wParam=='Z')
{
yes=!yes;
}
break;
}
case WM_KEYDOWN:
{
switch(wParam)
{
case VK_UP:
yes=TRUE;
break;
case VK_DOWN:
yes=FALSE;
break;
}
break;
}
case WM_PAINT:
{ // 处理绘图消息
hDC = BeginPaint(hwnd, &PtStr); // 得到设备句柄
SetMapMode(hDC, MM_ANISOTROPIC); // 设置映像模式
SetWindowExtEx(hDC, 400, 300, NULL); // 设置窗口区域(逻辑单位)
SetViewportExtEx(hDC, 600, 450, NULL); // 设置视口区域(物理单位)
SetViewportOrgEx(hDC, 300, 200, NULL); // 设置视口原点坐标为(300,200)
for(int i=1;i<maxsize;i++)
{
color[i]=i*6;
}
// 绘制外圆
//hPen = (HPEN)GetStockObject(BLACK_PEN);
//SelectObject(hDC, hPen);
//Ellipse(hDC, -100, -100, 100, 100);
// 绘制风车的叶片
// 1、画红色叶片
hBrush = CreateSolidBrush(RGB(color[i],0 ,0 ));
SelectObject(hDC, hBrush);
fAngle = 2 * Pi / nMaxNumber * nNum;
pCenterPoint.x = (int)(nRadious * cos(fAngle));
pCenterPoint.y = (int)(nRadious * sin(fAngle));
Pie(
hDC,
pCenterPoint.x - nRadious, pCenterPoint.y - nRadious,
pCenterPoint.x + nRadious, pCenterPoint.y + nRadious,
(int)(pCenterPoint.x + nRadious * cos(fAngle)),
(int)(pCenterPoint.y + nRadious * sin(fAngle)),
(int)(pCenterPoint.x + nRadious * cos(fAngle + Pi)),
(int)(pCenterPoint.y + nRadious * sin(fAngle + Pi))
);
// 2、画天蓝色叶片
hBrush = CreateSolidBrush(RGB(255,color[i], 0));
SelectObject(hDC, hBrush);
pCenterPoint.x = (int)(nRadious * cos(fAngle + 2 * Pi / 3));
pCenterPoint.y = (int)(nRadious * sin(fAngle + 2 * Pi / 3));
Pie(
hDC,
pCenterPoint.x - nRadious, pCenterPoint.y - nRadious,
pCenterPoint.x + nRadious, pCenterPoint.y + nRadious,
(int)(pCenterPoint.x + nRadious * cos(fAngle + 2 * Pi / 3)),
(int)(pCenterPoint.y + nRadious * sin(fAngle + 2 * Pi / 3)),
(int)(pCenterPoint.x + nRadious * cos(fAngle + Pi + 2 * Pi / 3)),
(int)(pCenterPoint.y + nRadious * sin(fAngle + Pi + 2 * Pi / 3))
);
// 3、画黄色叶片
hBrush = CreateSolidBrush(RGB(0, 255, 255-color[i]));
SelectObject(hDC, hBrush);
pCenterPoint.x = (int)(nRadious * cos(fAngle + 4 * Pi / 3));
pCenterPoint.y = (int)(nRadious * sin(fAngle + 4 * Pi / 3));
Pie(
hDC,
pCenterPoint.x - nRadious, pCenterPoint.y - nRadious,
pCenterPoint.x + nRadious, pCenterPoint.y + nRadious,
(int)(pCenterPoint.x + nRadious * cos(fAngle + 4 * Pi / 3)),
(int)(pCenterPoint.y + nRadious * sin(fAngle + 4 * Pi / 3)),
(int)(pCenterPoint.x + nRadious * cos(fAngle + Pi + 4 * Pi / 3)),
(int)(pCenterPoint.y + nRadious * sin(fAngle + Pi + 4 * Pi / 3))
);
if(yes)
nNum++; // 当前充数增加1
else
nNum--;
Sleep(speed); //等待0.1秒
InvalidateRect(hwnd, NULL, 1); // 重绘窗口区域
DeleteObject(hPen);
DeleteObject(hBrush);
EndPaint(hwnd, &PtStr);
break;
}
case WM_DESTROY:
{
// 调用PostQuitMessage 发出WM_QUIT 消息
PostQuitMessage(0);
}
default:
{
return DefWindowProc(hwnd, message, wParam, lParam);
}
}
return 0;
}。