基于Windows API的粒子随机运动C++实现

基于Windows API编写Windows动画演示程序,具有便捷、不依赖于IDE的特点。

以随机运动粒子系统为例,实现了该动画框架,C++代码与效果图像如下:

#include <windows.h>
#include <vector>

using namespace std;

//粒子数量
#define N 1024

//粒子类型
typedef struct Particle {
	float x, y;
	float speedx, speedy;
	COLORREF rgb;
	Particle() {
		x = (float)rand() / RAND_MAX;
		y = (float)rand() / RAND_MAX;
		speedx = (float)rand() / RAND_MAX - 0.5;
		speedy = (float)rand() / RAND_MAX - 0.5;
		rgb = RGB(rand() % 256, rand() % 256, rand() % 256);
	}

	void update() {
		speedx += ((float)rand() / RAND_MAX - 0.5) * 0.1;
		speedy += ((float)rand() / RAND_MAX - 0.5) * 0.1;
		x += 0.01 * speedx;
		y += 0.01 * speedy;
		if (x < 0 || x > 1)
			x = (float)rand() / RAND_MAX;
		if (y < 0 || y > 1)
			y = (float)rand() / RAND_MAX;
	}
} Particle;

//粒子群体
Particle particles[N];

//定时器编号
UINT_PTR timerId;

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
char szClassName[ ] = "CodeBlocksWindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default colour as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "Code::Blocks Template Windows App",       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           1024,                 /* The programs width */
           768,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nCmdShow);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}

/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc, memdc;
	HBITMAP hbitmap, oldbitmap;
	RECT rc;
	HBRUSH          hBrush;
	HPEN pen, *oldpen;

	int x, y, W, H;

	switch (message)
	{
	case WM_CREATE:
		timerId = SetTimer(hWnd, 1, 20, NULL);
		break;
	case WM_TIMER:
		InvalidateRect(hWnd, NULL, FALSE);
		break;
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// 分析菜单选择:
		switch (wmId)
		{
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		GetClientRect(hWnd, &rc);
		W = (rc.right - rc.left + 1);
		H = (rc.bottom - rc.top + 1);

		memdc = CreateCompatibleDC(hdc);
		hbitmap = CreateCompatibleBitmap(hdc, W, H);
		oldbitmap = (HBITMAP)SelectObject(memdc, hbitmap);

        hBrush = CreateSolidBrush(RGB(0, 0, 0));
        FillRect(memdc, &rc, hBrush);
		for(int i = 0; i < N; i++) {
			pen = CreatePen(0, 4, particles[i].rgb);
			oldpen = (HPEN *)SelectObject(memdc, pen);
			x = particles[i].x * W;
			y = particles[i].y * H;
			Ellipse(memdc, x - 3, y - 3, x + 3, y + 3);
			particles[i].update();
			DeleteObject(pen);
			//SelectObject(hdc, oldpen);
		}
		//DrawText(memdc, 5, 5, "this");
		DeleteObject( hBrush );
		BitBlt(hdc, 0, 0, W, H, memdc, 0, 0, SRCCOPY);
		SelectObject(memdc, oldbitmap);
		DeleteObject(hbitmap);
		DeleteObject(memdc);

		EndPaint(hWnd, &ps);
		break;
    case WM_KEYDOWN:
        if (wParam == 27) {
            KillTimer(hWnd, timerId);
            PostQuitMessage(0);
        }
		break;
	case WM_DESTROY:
		KillTimer(hWnd, timerId);
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

时间: 2024-10-05 13:34:29

基于Windows API的粒子随机运动C++实现的相关文章

基于Windows api手柄映射编程

一个手柄/键盘映射程序,无外乎就四部分:一.界面:二.接收:三.处理:四.输出. 界面就不多说了. 接收,就是接收手柄的输出.这部分有多种方法,比如windows API和DirectX,这里我们选前者. 处理,就是将接收到的数据映射为输出数据. 输出,就是向操作系统发送假的键盘事件,从而完成映射过程. 接收部分: 那么,我们先来进行知识的准备.为了完成接收部分,我们需要了解和手柄相关的windows API.其中常用的较重要的函数如下: joyGetDevCaps               

基于windows api实现的共享锁/独占锁

众所周知,windows平台上实现线程同步.或者说资源的加锁与解锁的方法有内核事件.临界区.相互排斥量.信号量,甚至interlocked系列函数等多种手段. 可是在日常的编程中,我们使用这些手段对 "多个线程同一时候对同一个资源进行读写" 的时候,在读写之前先要对资源假锁,读写完之后要对资源解锁. 设想这样一种情况,有一个ftpserver.每天有非常频繁的对这个ftp服务的文件进行下载,可是差点儿好几天才会对这些文件进行更新.在我们每一次对文件下载的时候,读取文件的时候都要对文件进

c运行库、c标准库、windows API的区别和联系

C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的.  API函数API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的. 区别他们之间区别是:API函数是针对操作系统的,C语言运行时函数则是针对C语言本身的. ·1.运行时库就是 C run-time library,是C而非C++语言世界的概念.     取这个名字就是因为你的C程序运行时需要这些库中的函数. ·2.C语言是所谓的“小内核”语言,就其语言本身来说很

(转)c运行库、c标准库、windows API的区别和联系

C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的.  API函数API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的. 区别他们之间区别是:API函数是针对操作系统的,C语言运行时函数则是针对C语言本身的. ·1.运行时库就是 C run-time library,是C而非C++语言世界的概念.     取这个名字就是因为你的C程序运行时需要这些库中的函数. ·2.C语言是所谓的“小内核”语言,就其语言本身来说很

Windows API 编程学习记录&lt;三&gt;

恩,开始写API编程的第三节,其实马上要考试了,但是不把这节写完,心里总感觉不舒服啊.写完赶紧去复习啊       在前两节中,我们介绍了Windows API 编程的一些基本概念和一个最基本API函数 MessageBox的使用,在这节中,我们就来正式编写一个Windows的窗口程序. 在具体编写代码之前,我们必须先要了解一下API 编写窗口程序具体的三个基本步骤:             1. 注册窗口类:             2.创建窗口:             3.显示窗口: 恩,

分享一下我的部分毕设内容:基于Windows Phone平台的污染源管理应用

原文:分享一下我的部分毕设内容:基于Windows Phone平台的污染源管理应用 毕业半年,又总结了一下之前的工作,发现很多知识不复习都忘记了.最近新闻总是报道北京的空气污染,各种雾霾,各种PM X超标,然后想到以后我们有饭吃了(俺也算是搞环境的科班出身,本科环境科学专业),然后联系到本科的毕业论文,刚好做的是大气污染相关的,于是闲来和大家分享一下,也算是对自己的之前工作的一个总结. 论文主要做的一个基于Web和Windows Phone平台的污染预测和污染源管理的应用,大体的功能就是根据污染

Windows API 大全

常用Windows API1. API之网络函数WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConnection3 创建同一个网络资源的连接WNetCancelConnection 结束一个网络连接WNetCancelConnection2 结束一个网络连接WNetCloseEnum 结束一次枚举操作WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接WNetDis

你也可以玩转Skype -- 基于Skype API开发外壳程序入门

原文:你也可以玩转Skype -- 基于Skype API开发外壳程序入门 Skype是目前这个星球上最厉害的IM+VOIP软件,Skype现在已经改变了全球2.8亿人的生活方式.你,值得拥有! :) Skype中文官网:http://skype.tom.com/ Skype全球官网:http://www.skype.com/ Skype也是世界上最开放,最具创新意识的IM工具,他提供了Skype API, Skype4COM, Skype4Java几种形式的开发接口给Skype爱好者编写Sky

windows API中CreateWindow()函数详解

CreateWindow函数详解 在注册完窗口类后就需要进行窗口的创建,用到的函数理所当然就是CreateWindow(), 而这个函数是基于窗口类的,所以还需要指定几个参数来制定特定的窗口.而且像一些不带边框的窗口是怎么创建的也是具有相当的技巧的,就是创建的是不带标题和边框的窗口,然后自己在客户区绘制程序的内容,能够制作个性化的应用程序. API解释 该函数创建一个重叠式窗口.弹出式窗口或子窗口.它指定窗口类,窗口标题,窗口风格,以及窗口的初始位置及大小(可选的).函数也指该窗口的父窗口或所属