我制作的跑马灯程序
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define Pi 3.141592653
long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);
//消息处理函数声明.
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow) //主函数
{
MSG Message; //定义消息变量.
HWND hWnd; //定义窗口句柄.
WNDCLASS WndClass; //定义窗口类.
WndClass.cbClsExtra=0; //无窗口类扩展.
WndClass.cbWndExtra=0; //无窗口实例扩展.
WndClass.hbrBackground=(HBRUSH)(GetStockObject(BLACK_BRUSH));//背景为黑色.
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); //窗口采用箭头光标.
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //采用缺省图标.
WndClass.hInstance=hInstance; //当前应用程序句柄.
WndClass.lpfnWndProc=WndProc; //窗口处理函数.
WndClass.lpszClassName="跑马灯"; //窗口类名称.
WndClass.lpszMenuName=NULL; //无窗口菜单.
WndClass.style=0; //窗口类型为缺省类型.
if(!RegisterClass(&WndClass)) //注册窗口.
{
MessageBeep(0);
return FALSE;
}
hWnd=CreateWindow("跑马灯", //窗口类名.可以用中文!
"圆形跑马灯", //标题名.
WS_OVERLAPPEDWINDOW, //带标题栏,最大和最小按钮的窗口.
150, //窗口左上角坐标.
0,
720, //采用缺省的宽度和高度.
730,
NULL, //无父窗口.
NULL, //无主菜单.
hInstance, //当前实例句柄.
NULL); //不要此参数.
ShowWindow(hWnd,nCmdShow); //显示窗口.
UpdateWindow(hWnd); //更新并绘制用户区.
while(GetMessage(&Message,0,0,0))
{
TranslateMessage(&Message); //消息循环.
DispatchMessage(&Message);
}
return Message.wParam;
}
long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam) //消息处理函数.
{
HDC hDC; //定义设备环境句柄.
HBRUSH hBrush; //定义画刷句柄
HPEN hPen; //定义画笔句柄
PAINTSTRUCT PtStr; //定义包含绘图信息的结构体变量
int step = 15; //彩灯的间隔角度
int radius = 35; //彩灯的半径
//变量的定义都要拿到switch结构的前面来,不能放到case语句中
switch(iMessage)
{
case WM_PAINT: //处理绘图消息.
hDC=BeginPaint(hWnd,&PtStr); //获得设备环境指针.
SetWindowOrgEx(hDC,0,0,NULL); //设置原点坐标为(0,0).
//debug经验:原点的位置永远是左上角,并不会移动,所以只能动坐标
hPen=CreatePen(PS_SOLID,1,RGB(255,255,255)); //创建新画笔.
SelectObject(hDC,hPen); //选入画笔.
Arc(hDC,350-300,350-300,350+300,350+300,350,350-300,350,350-300);
DeleteObject(hPen);
hPen=CreatePen(PS_SOLID,1,RGB(255,255,255)); //创建新画笔.
hBrush=CreateSolidBrush(RGB(0,0,0));
SelectObject(hDC,hBrush);
SelectObject(hDC,hPen); //选入画笔.
for(int i = 0; i < 360; i = i + step){
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * i / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * i / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) + radius));
//debug发现不加强制类型转换(int)也可编译通过;注意角度与弧度的转换
//而且Pie()函数有“缝合线”遗留,Ellipse()函数没有多余的线
}
DeleteObject(hPen);
DeleteObject(hBrush);
//第一种变化:顺时针,灯依次点亮,绕圆一周
hPen=CreatePen(PS_SOLID,1,RGB(255,255,255)); //创建新画笔.
hBrush=CreateSolidBrush(RGB(255,255,255));
SelectObject(hDC,hBrush);
SelectObject(hDC,hPen); //选入画笔.
for(int i = 0; i < 360; i = i + step){
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * i / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * i / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) + radius));
Sleep(100); //停0.1秒.
}
DeleteObject(hPen);
DeleteObject(hBrush);
//第二种变化:顺时针,灯依次熄灭,绕圆一周
hPen=CreatePen(PS_SOLID,1,RGB(255,255,255)); //创建新画笔.
hBrush=CreateSolidBrush(RGB(0,0,0));
SelectObject(hDC,hBrush);
SelectObject(hDC,hPen); //选入画笔.
for(int i = 0; i < 360; i = i + step){
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * i / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * i / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) + radius));
Sleep(100); //停0.1秒.
}
DeleteObject(hPen);
DeleteObject(hBrush);
//第三种变化:顺时针,仅一盏灯点亮,绕圆两周
hPen=CreatePen(PS_SOLID,1,RGB(255,255,255)); //创建新画笔.
SelectObject(hDC,hPen); //选入画笔.
for(int j = 0; j < 2; j++){
for(int i = 0; i < 360; i = i + step){
hBrush=CreateSolidBrush(RGB(255,255,255));
SelectObject(hDC,hBrush);
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * i / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * i / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) + radius));
Sleep(100); //停0.1秒.
DeleteObject(hBrush);
hBrush=CreateSolidBrush(RGB(0,0,0));
SelectObject(hDC,hBrush);
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * i / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * i / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) + radius));
}
}
DeleteObject(hPen);
DeleteObject(hBrush);
//第四种变化:顺时针,对称四盏灯点亮,绕圆两周
hPen=CreatePen(PS_SOLID,1,RGB(255,255,255)); //创建新画笔.
SelectObject(hDC,hPen); //选入画笔.
for(int j = 0; j < 2; j++){
for(int i = 0; i < 360; i = i + step){
hBrush=CreateSolidBrush(RGB(255,255,255));
SelectObject(hDC,hBrush);
//正上方一盏灯,点亮
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * i / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * i / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) + radius));
//正右方一盏灯,点亮
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * (i + 90) / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * (i + 90) / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * (i + 90) / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * (i + 90) / 360) + radius));
//正下方一盏灯,点亮
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * (i + 180) / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * (i + 180) / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * (i + 180) / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * (i + 180) / 360) + radius));
//正左方一盏灯,点亮
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * (i + 270) / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * (i + 270) / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * (i + 270) / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * (i + 270) / 360) + radius));
Sleep(100); //停0.1秒.
DeleteObject(hBrush);
hBrush=CreateSolidBrush(RGB(0,0,0));
SelectObject(hDC,hBrush);
//正上方一盏灯,熄灭
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * i / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * i / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) + radius));
//正右方一盏灯,熄灭
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * (i + 90) / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * (i + 90) / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * (i + 90) / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * (i + 90) / 360) + radius));
//正下方一盏灯,熄灭
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * (i + 180) / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * (i + 180) / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * (i + 180) / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * (i + 180) / 360) + radius));
//正左方一盏灯,熄灭
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * (i + 270) / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * (i + 270) / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * (i + 270) / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * (i + 270) / 360) + radius));
DeleteObject(hBrush);
}
}
DeleteObject(hPen);
DeleteObject(hBrush);
//第五种变化:顺时针,对称四盏灯依次点亮,然后逆时针依次熄灭,重复两次
hPen=CreatePen(PS_SOLID,1,RGB(255,255,255)); //创建新画笔.
SelectObject(hDC,hPen); //选入画笔.
for(int j = 0; j < 2; j++){
for(int i = 0; i <= 90; i = i + step){
hBrush=CreateSolidBrush(RGB(255,255,255));
SelectObject(hDC,hBrush);
//正上方一盏灯,点亮
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * i / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * i / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) + radius));
//正右方一盏灯,点亮
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * (i + 90) / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * (i + 90) / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * (i + 90) / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * (i + 90) / 360) + radius));
//正下方一盏灯,点亮
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * (i + 180) / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * (i + 180) / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * (i + 180) / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * (i + 180) / 360) + radius));
//正左方一盏灯,点亮
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * (i + 270) / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * (i + 270) / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * (i + 270) / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * (i + 270) / 360) + radius));
Sleep(100); //停0.1秒.
DeleteObject(hBrush);
}
for(int i = 0; i >= -90; i = i - step){
hBrush=CreateSolidBrush(RGB(0,0,0));
SelectObject(hDC,hBrush);
//正上方一盏灯,熄灭
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * i / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * i / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) + radius));
//正右方一盏灯,熄灭
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * (i + 90) / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * (i + 90) / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * (i + 90) / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * (i + 90) / 360) + radius));
//正下方一盏灯,熄灭
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * (i + 180) / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * (i + 180) / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * (i + 180) / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * (i + 180) / 360) + radius));
//正左方一盏灯,熄灭
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * (i + 270) / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * (i + 270) / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * (i + 270) / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * (i + 270) / 360) + radius));
Sleep(100); //停0.1秒.
DeleteObject(hBrush);
}
}
DeleteObject(hPen);
DeleteObject(hBrush);
//第六种变化:顺时针,对称四盏灯依次点亮,然后顺时针依次熄灭,重复两次
hPen=CreatePen(PS_SOLID,1,RGB(255,255,255)); //创建新画笔.
SelectObject(hDC,hPen); //选入画笔.
for(int j = 0; j < 2; j++){
for(int i = 0; i <= 90; i = i + step){
hBrush=CreateSolidBrush(RGB(255,255,255));
SelectObject(hDC,hBrush);
//正上方一盏灯,点亮
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * i / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * i / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) + radius));
//正右方一盏灯,点亮
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * (i + 90) / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * (i + 90) / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * (i + 90) / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * (i + 90) / 360) + radius));
//正下方一盏灯,点亮
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * (i + 180) / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * (i + 180) / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * (i + 180) / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * (i + 180) / 360) + radius));
//正左方一盏灯,点亮
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * (i + 270) / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * (i + 270) / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * (i + 270) / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * (i + 270) / 360) + radius));
Sleep(100); //停0.1秒.
DeleteObject(hBrush);
}
for(int i = 0; i <= 90; i = i + step){
hBrush=CreateSolidBrush(RGB(0,0,0));
SelectObject(hDC,hBrush);
//正上方一盏灯,熄灭
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * i / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * i / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) + radius));
//正右方一盏灯,熄灭
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * (i + 90) / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * (i + 90) / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * (i + 90) / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * (i + 90) / 360) + radius));
//正下方一盏灯,熄灭
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * (i + 180) / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * (i + 180) / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * (i + 180) / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * (i + 180) / 360) + radius));
//正左方一盏灯,熄灭
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * (i + 270) / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * (i + 270) / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * (i + 270) / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * (i + 270) / 360) + radius));
Sleep(100); //停0.1秒.
DeleteObject(hBrush);
}
}
DeleteObject(hPen);
DeleteObject(hBrush);
//第七种变化:从正上方开始,对称两盏灯依次点亮,然后反方向依次熄灭,绕圆一周
hPen=CreatePen(PS_SOLID,1,RGB(255,255,255)); //创建新画笔.
SelectObject(hDC,hPen); //选入画笔.
for(int k = 0; k < 1; k++){//变量 k 预留,可调节绕圆次数
for(int i = 0, j = 0; i <= 180 && j >= -180; i = i + step, j = j - step){
hBrush=CreateSolidBrush(RGB(255,255,255));
SelectObject(hDC,hBrush);
//顺时针方向的半圈灯,依次点亮
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * i / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * i / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) + radius));
//逆时针方向的半圈灯,依次点亮
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * j / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * j / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * j / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * j / 360) + radius));
Sleep(100); //停0.1秒.
DeleteObject(hBrush);
}
for(int i = 0, j = 0; i <= 180 && j >= -180; i = i + step, j = j - step){
hBrush=CreateSolidBrush(RGB(0,0,0));
SelectObject(hDC,hBrush);
//逆时针方向的半圈灯,依次熄灭
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * (i + 180) / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * (i + 180) / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * (i + 180) / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * (i + 180) / 360) + radius));
//顺时针方向的半圈灯,依次熄灭
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * (j - 180) / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * (j - 180) / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * (j - 180) / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * (j - 180) / 360) + radius));
Sleep(100); //停0.1秒.
DeleteObject(hBrush);
}
}
DeleteObject(hPen);
DeleteObject(hBrush);
//第八种变化:从正上方开始,对称两盏灯依次点亮,然后同方向依次熄灭,绕圆一周
hPen=CreatePen(PS_SOLID,1,RGB(255,255,255)); //创建新画笔.
SelectObject(hDC,hPen); //选入画笔.
for(int k = 0; k < 1; k++){//变量 k 预留,可调节绕圆次数
for(int i = 0, j = 0; i <= 180 && j >= -180; i = i + step, j = j - step){
hBrush=CreateSolidBrush(RGB(255,255,255));
SelectObject(hDC,hBrush);
//顺时针方向的半圈灯,依次点亮
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * i / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * i / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) + radius));
//逆时针方向的半圈灯,依次点亮
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * j / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * j / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * j / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * j / 360) + radius));
Sleep(100); //停0.1秒.
DeleteObject(hBrush);
}
for(int i = 0, j = 0; i <= 180 && j >= -180; i = i + step, j = j - step){
hBrush=CreateSolidBrush(RGB(0,0,0));
SelectObject(hDC,hBrush);
//逆时针方向的半圈灯,依次熄灭
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * i / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * i / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * i / 360) + radius));
//顺时针方向的半圈灯,依次熄灭
Ellipse(hDC,
(int)(350 + 300 * sin(2 * Pi * j / 360) - radius),
(int)(350 - 300 * cos(2 * Pi * j / 360) - radius),
(int)(350 + 300 * sin(2 * Pi * j / 360) + radius),
(int)(350 - 300 * cos(2 * Pi * j / 360) + radius));
Sleep(100); //停0.1秒.
DeleteObject(hBrush);
}
}
DeleteObject(hPen);
DeleteObject(hBrush);
EndPaint(hWnd,&PtStr); //删除设备环境指针.
if(1) InvalidateRect(hWnd,NULL,1); //刷新用户区.
return 0;
case WM_DESTROY: //关闭窗口.
PostQuitMessage(0);
return 0;
default:
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
}
完整演示视频链接:
http://v.youku.com/v_show/id_XMzA2NDAyMTMzNg==.html?spm=a2h3j.8428770.3416059.1#paction