还是4年前在一本游戏开发的书里看到的,重新翻出来整理了下
#include<windows.h>
#include<time.h>
#define WINDOW_WIDTH 1300//宽
#define WINDOW_HEIGHT 1000//高
#define WINDOW_TITLE L"窗口标题"
#define T 1 //画面刷新周期,单位ms
/【全局变量声明】
HDC g_hdc = NULL, g_mdc = NULL, g_bufdc = NULL;//设备DC句柄
DWORD g_tPre = 0, g_tNow = 0;//用于比较上次刷新画面的时间与当前时间
int ColorOfNumber = 0;//花里胡哨
/【全局函数声明】
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);//回调
BOOL Init(HWND hwnd);//初始化
VOID Paint(HWND hwnd);//绘制
BOOL CleanUp(HWND hwnd);//清理
//【创建窗口】/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
WNDCLASSEX wndClass = {
sizeof(WNDCLASSEX),
CS_HREDRAW | CS_VREDRAW,//一旦移动或调整窗口尺寸,就发出WM_PAINT消息重新绘制窗口
WndProc,0,0,hInstance,
(HICON)::LoadImage(NULL,L"D3TK.ico",IMAGE_ICON,0,0,LR_DEFAULTSIZE | LR_LOADFROMFILE),//ico图标
LoadCursor(NULL,IDC_ARROW),//鼠标样式
(HBRUSH)GetStockObject(GRAY_BRUSH),//笔刷样式
NULL,
L"Win32_Demo" //窗口类名称
};
if (!RegisterClassEx(&wndClass))
{
return -1;
}
HWND hwnd = CreateWindow(
L"Win32_Demo", //窗口类名称
WINDOW_TITLE, //窗口标题
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
WINDOW_WIDTH, //宽度
WINDOW_HEIGHT, //高度
NULL, NULL, hInstance, NULL
);
//MoveWindow(hwnd, 200, 100, WINDOW_WIDTH, WINDOW_HEIGHT, true);
//移动窗口位置
ShowWindow(hwnd, nShowCmd);
//第二个参数换成SW_SHOWMAXIMIZED全屏显示
UpdateWindow(hwnd);
if (!Init(hwnd))
{
MessageBox(hwnd, L"窗口创建失败", L"错误", 0);
return FALSE;
}
//【消息循环】/
MSG msg = { 0 };
while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))//收到消息时转发消息
{
TranslateMessage(&msg);//转换
DispatchMessage(&msg);//发送
}
else {//没消息时按周期循环重绘窗口
g_tNow = GetTickCount64();
if (g_tNow - g_tPre >= T)
{
Paint(hwnd);
}
}
}
UnregisterClass(L"Win32_Demo", hInstance);//收到退出窗口消息,注销窗口类
return 0;
}
//【回调】/
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
PAINTSTRUCT paintstruct;
switch (message)
{
case WM_PAINT://收到重绘消息
g_hdc = BeginPaint(hwnd, &paintstruct);//获取设备句柄
Paint(hwnd);//绘制窗口
EndPaint(hwnd, &paintstruct);//结束绘制
ValidateRect(hwnd, NULL);//更新窗口
break;
case WM_KEYDOWN://按键消息
if (wparam == VK_ESCAPE)//ESC键
{
DestroyWindow(hwnd);
break;
}
break;
case WM_DESTROY:
CleanUp(hwnd);
PostQuitMessage(0);
break;
default://其他消息由系统默认处理
return DefWindowProc(hwnd, message, wparam, lparam);
}
return 0;
}
//【初始化】/
BOOL Init(HWND hwnd)
{
HBITMAP None;
g_hdc = GetDC(hwnd);//设备DC
g_mdc = CreateCompatibleDC(g_hdc);//内存DC
g_bufdc = CreateCompatibleDC(g_hdc);//缓存DC
None = CreateCompatibleBitmap(g_hdc, WINDOW_WIDTH, WINDOW_HEIGHT);
SelectObject(g_mdc, None);
Paint(hwnd);
return TRUE;
}
//【绘图】/
VOID Paint(HWND hwnd)
{
//置顶窗口
SetForegroundWindow(hwnd);
//文字输出
//字体创建(局部变量时才能修改字体大小,就很迷惑)
HFONT YaHei = CreateFont(50, 0, 0, 0, 0, 0, 0, 0, UNICODE, 0, 0, 0, 0, L"微软雅黑");
wchar_t text0[] = L"测试";
SetBkMode(g_mdc, TRANSPARENT);//设置文字背景透明
//输出文字
SelectObject(g_mdc, YaHei);
SetTextColor(g_mdc, RGB(0, 255, ColorOfNumber));//设置文字前景色
TextOut(g_mdc, 200, 400, text0, wcslen(text0));
//字体颜色循环
ColorOfNumber += 1;
if (ColorOfNumber > 255)
{
ColorOfNumber = 0;
}
//释放字体
DeleteObject(YaHei);
//从内存DC绘图到DC
BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY);
}
//【资源释放函数】/
BOOL CleanUp(HWND hwnd)
{
//释放资源
ReleaseDC(hwnd, g_hdc);
DeleteDC(g_mdc);
DeleteDC(g_bufdc);
return TRUE;
}
因为要用C++弄个示例程序,参考的代码是MFC写的,一个项目里一堆.cpp,里面全是各种class,互相之间又各种纠缠不清,看了半天脑子里全是"这个类是干嘛的、为什么写在这个文件里、它在哪被调用了、里面的这堆参数又都是什么玩意...",黑人问号.jpg
面向对象可能确实很牛逼,写出来的东西换个人来看也是真的看不懂
之前已经用python20行代码就实现了功能,然而说客户关心过程要求C++,这才就个窗口屁功能都没实现都一百多行了,人生苦短,我想用python