这是一个类似Screensaver的程序。
如何制作全屏&程序输出的着色? 鼠标移动时自动退出程序?
#include<windows.h>
#include<stdio.h>
#include<time.h>
#include<math.h>
struct tm *local(){
time_t t;
t = time(NULL);
return localtime(&t);
}
const char *ClsName = "BitmapLoading";
const char *WndName = "Easy bitmaploading!";
MSG Msg;
HWND hWnd;
WNDCLASSEX WndClsEx;
HINSTANCE hInstance;
int main(void)
{
GetSystemMenu(GetForegroundWindow(),1);
ShowWindow(GetForegroundWindow(),1);
int D=100;
int m,n;
MoveWindow(GetForegroundWindow(),0,0,0,0,1);
RegisterClassEx(&WndClsEx);
// Create the window object
hWnd = CreateWindow(ClsName,
WndName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
GetForegroundWindow(),
CreatePopupMenu(),
hInstance,
NULL);
HDC hdc=GetDC(hWnd);
for(m=0;m<=(local()->tm_hour*5)+local()->tm_min;m++)rand();//Random based on time
char *Label=" ScreenMove. - 2020 ";
int a[35],b[35],c[35],d[35],e=0;
for(n=1;n<=21;n++){
a[n]=(10+n)*n;
b[n]=(10+n)*n;
c[n]=1,d[n]=1;
}
do{
for(n=1;n<=21;n++){
if(a[n]+(6+n+n)<=740 && a[n]>=0 && c[n]==1)a[n]++;
else{ a[n]--;c[n]=0; }
if(a[n]<=0)c[n]=1;
if(b[n]+(6+n+n)<=1000 && b[n]>=0 && d[n]==1)b[n]++;
else{ b[n]--;d[n]=0; }
if(b[n]<=0)d[n]=1;
e++;
if(e==4)e=0;
RoundRect(hdc,b[n]+(2+n+n)+e,a[n]+(2+n+n)+e,b[n],a[n],b[n],a[n]);
TextOut(hdc,360,10,Label,43);//TEXT
}
for(m=0;m<=D*4;m++)Rectangle(hdc,1300,0,1350,50);
for(n=100;n>=0;n--)LineTo(hdc,rand()%1100,rand()%740);
SetTextColor(hdc,rand());
}while(1);
return 0;
}
答案 0 :(得分:1)
Windows GUI程序通常是事件驱动的。程序中的do ... while(1)
部分会创建一个无限循环,这会浪费CPU周期,并且很难检测鼠标移动等事件。花一些时间阅读有关开发Win32应用程序的教程。 Here is one来自Google。了解如何设置处理消息的窗口过程后,可以使用WM_MOUSEMOVE
消息检测鼠标移动并退出应用程序。
使您的窗口全屏显示:
WS_POPUP
样式而不是WS_OVERLAPPEDWINDOW
;这将删除标题栏CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT
,请使用0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)
。至于为输出添加颜色,您需要根据您想要的颜色做一些事情。使用笔绘制线条,使用画笔填充矩形等实体,并使用SetTextColor
单独设置文本颜色。有关使用钢笔和画笔的示例,请参阅this page。
答案 1 :(得分:0)
如果您想创建屏幕保护程序,通常需要使用screen saver API。这会自动处理除绘图之外的所有内容(例如,何时激活,当屏幕,键盘等输入时取消激活)