好些东西和功能都没有实现,总体来说是不怎么满意的。
代码如下:
#include<graphics.h>
#include<cstdio>
#include<time.h>
#include<easyx.h>
#include<vector>
#include<stdlib.h>
#include<conio.h>
#define RAND 1 //随机文字
#define CUSTOM 2 //自定义文字
using namespace std;
static COLORREF c[8] = { WHITE,BLACK,BLUE,YELLOW,BROWN,GREEN,RED,LIGHTBLUE };
struct text
{
int speed;
int x, y;
COLORREF color;
char p[150];
};
vector<text> v;//动态数组
static void creatwindow();
static void settext();
static void showtext();
static void move();
int main()
{
creatwindow();
CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)settext,NULL,NULL,NULL);//创建线程 都是while死循环
while (1)
{
showtext();
move();
Sleep(500);
//用定时器SetTimer也可以
}
return 0;
}
static void move()
{
//size_t就是unsigned int 用了typedef
for (size_t i = 0; i< v.size(); i++)
{
v[i].x -= v[i].speed;
}
}
static void showtext()
{
BeginBatchDraw();//批量绘图 easyx里的
cleardevice();
for(size_t i=0;i<v.size();i++)
{
settextcolor(v[i].color);
outtextxy(v[i].x, v[i].y, v[i].p);
}
EndBatchDraw();
}
static void settext()
{
text *t;
t = new text;
//new更简洁明了 还可以初始化数据元素这是和malloc不一样的地方 不过我感觉new里面就是个malloc。。。
while (true)
{
printf_s("一大波弹幕正在靠近中:");
gets_s(t->p);
/*if (_kbhit()&&_getch() == '#') model=CUSTOM
else*/
t->x = GetSystemMetrics(SM_CXSCREEN)-20;
srand((unsigned int)time(NULL));
t->speed = rand() % 20 + 1;
t->color = c[rand() % 8];//t->color = RGB(rand() % 256, rand() % 256, rand() % 256);
t->y = rand() % (GetSystemMetrics(SM_CYSCREEN) - 30) + 20;
// case CUSTOM: 用mfc更容易实现这点 我懒得打了
// {
// int r=0,xx,yy;
// printf_s("弹幕速度:");
//
// printf_s("弹幕颜色:");
//
// r%=8;
// t->color = c[r];
// printf_s("弹幕坐标x,y:");
//
// t->x = xx;
// t->y = yy;
// }
v.push_back(*t);//加载到模板里
}
}
static void creatwindow()
{
HWND hwnd;//工具里的spy++可以看句柄
int x = GetSystemMetrics(SM_CXSCREEN), y = GetSystemMetrics(SM_CYSCREEN);
//metric米制的 getsystemmetrics用来获取系统窗口长度 SM_CXSCREEN是宽x 是win32的api
initgraph(x, y,SHOWCONSOLE);
hwnd = GetHWnd();//获取当前窗口句柄 操控权限-.-!
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) - WS_CAPTION);
//设置窗口风格 hwnd窗口-标题 gwl_style窗口风格
SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, x, y, SWP_SHOWWINDOW);
//设置窗口起始点 句柄 窗口z序 左上角坐标 大小 显示窗口且不能改变大小 并真正改变窗口
LONG wl = GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED;
SetWindowLong(hwnd, GWL_EXSTYLE, wl);//扩展风格
SetLayeredWindowAttributes(hwnd, RGB(0, 0, 0), 0, LWA_COLORKEY);
//把窗口后面的东西沾到窗口上面或者说伪透明
//取值为LWA_COLORKEY时,bAlpha参数无效而窗体中的所有颜色为crKey的地方将变为透明。
//取值为LWA_ALPHA crkey无效 bAlpha是透明度[0,255]
}