本帖最后由 4399APPLE 于 2016-9-17 13:11 编辑
好吧不要歧视控制台了
不要再以为控制台只能够输出字符了
Wake up该醒了
控制台也是一个窗口,也具有HWND和DC之类!
你以为控制台就只能做这些吗?
---------------------------------------
要介绍的是如何在Win32控制台里面画图
这次就用一个在窗口里面飞舞的长方形为例子
长方形里面写上一句Hello, World!
---------------------------------------
首先画图之前需要把那个闪烁的光标给炸掉- CONSOLE_CURSOR_INFO cciCursor;
- HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
- if(GetConsoleCursorInfo(hStdOut, &cciCursor))
- {
- cciCursor.bVisible = FALSE;
- SetConsoleCursorInfo(hStdOut, &cciCursor);
- }
复制代码 就不解释了,问度娘去
画图肯定需要句柄
所以先写上这么几句话:- char title[512];
- HWND hWnd;
- GetConsoleTitle(title, 512);
- hWnd = FindWindow(NULL, title);
复制代码 应该不用解释什么了吧
GetConsoleTitle用于获取控制台标题
用FindWindow寻找对应标题的窗口
还需要获取DC(绘图句柄)- HDC hDC;
- hDC = GetDC(hWnd);
复制代码 要注意这里不是一般的Win32程序,这里不是WM_PAINT
所以绝对不能够用BeginPaint(呸其实可以用)
用了GetDC来代替
然后需要获取整个控制台大小,后面会用到- RECT size;
- GetClientRect(hWnd, &size);
复制代码 最后把字体和画笔加载完成(好麻烦)- HFONT hFont;
- HBRUSH hBrush;
- hFont = CreateFont (48, 0, 0, 0, FW_BOLD, 0, 0, 0, 0, 0, 0, 0, 0, "Lucida Console");
- hBrush = CreateSolidBrush((COLORREF)0x00FFFFFF);
- system("color F0");
复制代码 最后一行有点投机取巧了
用了system来设置颜色,当然你也可以画一个大的填充矩形(画笔是全白的)
还需要一个主循环来绘制图片:
***以下程序在主循环里面***
用x, y, d, g分别表示当前X坐标,当前Y坐标,每次循环增加的量,以及当前状态- int x, y, d, g;
- x = 30, y = 10, d = 4, g = 3;
复制代码 用一个RECT来把痕迹擦除掉- RECT rect;
- rect.left = x;
- rect.top = y;
- rect.right = x + 380 + d + 1;
- rect.bottom = y + 60 + d + 1;
复制代码 里面的Magic Number事算出来的QaQ
就这么将就吧QaQ
然后擦除痕迹就一句话- FillRect(hDC, &rect, hBrush);
复制代码 终于到了画字符的时候了
也是TextOut一句话- TextOut(hDC, x + 10, y + 10, "Hello, World!", 13);
复制代码 最后的13是字符串"Hello, World!"的长度(话说13不是B吗)
画出外面的直线- MoveToEx(hDC, x + 5, y + 5, NULL);
- LineTo(hDC, x + 380, y + 5);
- LineTo(hDC, x + 380, y + 60);
- LineTo(hDC, x + 5, y + 60);
- LineTo(hDC, x + 5, y + 5);
复制代码 等待一会儿,否则就会闪瞎狗眼然后就剩下一点了
碰撞检测。也不是很难,switch一堆就好,自己理解吧- switch(g)
- {
- case 0:
- if(y > d)
- y -= d;
- else
- g = 2;
- if(x > d)
- x -= d;
- else
- g = 1;
- break;//↖
- case 1:
- if(y > d)
- y -= d;
- else
- g = 3;
- if(x < size.right - 380 - d)
- x += d;
- else
- g = 0;
- break;//↗
- case 2:
- if(y < size.bottom - 60 - d)
- y += d;
- else
- g = 0;
- if(x > d)
- x -= d;
- else
- g = 3;
- break;//↙
- case 3:
- if(y < size.bottom - 60 - d)
- y += d;
- else
- g = 1;
- if(x < size.right - 380 - d)
- x += d;
- else
- g = 2;
- break;//↘
- default:
- break;
- }
复制代码 ***以下程序在主循环外面***
收拾一下残局,处理一下- DeleteObject(hBrush);
- DeleteObject(hFont);
- ReleaseDC(hWnd, hDC);
- system("color 07");
- system("cls");
复制代码 完成了QaQ
|