当前位置:C++技术网 > 精选软件 > 使用计时器实现Win10安装时的窗口颜色的动态改变

使用计时器实现Win10安装时的窗口颜色的动态改变

更新时间:2016-01-12 17:35:12浏览次数:1+次

    在安装win10的时候,在需要用户等待的情况下,系统没有使用进度条那么Low的提示等待的效果了,而是使用窗口颜色的不停的改变,让你觉得等待不会单调。
    这个效果,我们也可以自己实现,只需要一个计时器就可以来做到。不过,我们这里只提供一个简单的渐变改变颜色的效果。如果要实现更加灵活的颜色切换,可以自己写一个小小的代码来实现。

    下面是我们程序的效果图:

仿Win10提示:颜色不断的渐渐改变

【仿Win10提示:颜色不断的渐渐改变】
    动态渐变的改变颜色,使用计时器。我们在WM_CREATE消息就可以创建一个计时器,调用SetTimer函数,指定时间为50毫秒。不需要指定回调函数,即默认计时器的消息都会在WM_TIMER消息中处理。至于计时器的ID,即第二个参数,随便设置一个即可,比如1,然后在窗口销毁时,用这个ID删除计时器即可。
    在计时器消息WM_TIMER中,我们先根据一定的规则来改变红绿蓝三个基色的值。这里就可以实现颜色是如何切换的。我们这里提供的是:先从黑色显示到最红色,然后从黑色显示到最绿色,然后从黑色显示到最蓝色。然后周期性循环显示。使用一个取模来实现三种颜色的轮转。
    我们要在客户区显示颜色,当然不会使用画笔将所有像素设置颜色,这样效率太低了。我们使用矩形填充颜色来完成。这样就需要一个画刷,画刷的颜色由上一步修改三个分量值来创建,使用RGB宏即可。然后创建一个颜色的画笔,使用FillRect来填充矩形。这个矩形则有GetClientRect来得到窗口的客户区的矩形,这样填充之后,整个客户区就是一个颜色了。用完画刷后记得删除自己创建的画刷。
    因为定时器会不停的定时执行代码,所以,我们在每次计算颜色值时需要不停的改变,我们将三个颜色分量用静态变量存储起来了。这样就可以不断的切换颜色了。
    下面是完整的代码:
#include "windows.h"
#include <tchar.h>
#include <vector>
using namespace std;
TCHAR tip[]=_T("C++技术网www.cjjjs.com");
// - 项目是Unicode字符集
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    RECT rect;
    HBRUSH hBrush;
    static int iR=0,iG=0,iB=0;
    static int c=0;

    switch (message)
    {
        case WM_CREATE:
            SetTimer(hwnd,1,50,NULL);//创建计时器
        return 0;
        case WM_TIMER:
            {
                hdc= GetDC(hwnd);
                GetClientRect(hwnd,&rect);//获得客户区的矩形
                //循环的修改颜色
                switch(c%3)
                {
                case 0:
                    iR++;
                    if (iR==255)
                    {
                        iR=0;
                        c++;
                    }
                    break;
                case 1:
                    if (iG==255)
                    {
                        iG==0;
                        c++;
                    }
                    iG++;
                    break;;
                case 2:
                    if (iB==255)
                    {
                        iB==0;
                        c++;
                    }
                    iB++;
                    break;
                }
                //创建画刷
                hBrush = CreateSolidBrush(RGB(iR,iG,iB));
                FillRect(hdc,&rect,hBrush);//填充矩形
                DeleteObject(SelectObject(hdc,GetStockObject(WHITE_BRUSH)));//删除画刷
                ReleaseDC(hwnd,hdc);
            }
            return 0;
        case WM_DESTROY:
            KillTimer(hwnd,1);
            PostQuitMessage(0);
            return 0;
        default:
        break;//跳出到默认处理
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrev,LPSTR lpCmd,int iShow)
{
    TCHAR ClassName[] = _T("MyClass");
    TCHAR title1[] = _T("C++技术网http://www.cjjjs.com");
    WNDCLASS wndClass;
    wndClass.cbClsExtra=0;
    wndClass.cbWndExtra=0;
    wndClass.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wndClass.hInstance = hInstance;
    wndClass.lpfnWndProc = WinProc;
    wndClass.lpszClassName = ClassName;
    wndClass.lpszMenuName=NULL;
    wndClass.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;

    if(!RegisterClass(&wndClass))return 0;
    HWND hwnd = CreateWindow(ClassName,title1,WS_OVERLAPPEDWINDOW,0,0,350,400,NULL,NULL,hInstance,NULL);
    ShowWindow(hwnd,SW_SHOWNORMAL);

    MSG msg;
    while (GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}