这个效果,我们也可以自己实现,只需要一个计时器就可以来做到。不过,我们这里只提供一个简单的渐变改变颜色的效果。如果要实现更加灵活的颜色切换,可以自己写一个小小的代码来实现。
下面是我们程序的效果图:
【仿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;
}