搜索
查看: 811|回复: 0
打印 上一主题 下一主题

[原创] 控制台能够做得更多

[复制链接]
跳转到指定楼层
楼主
发表于 2016-9-17 10:41:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 4399APPLE 于 2016-9-17 13:11 编辑

好吧不要歧视控制台了
不要再以为控制台只能够输出字符了
Wake up该醒了
控制台也是一个窗口,也具有HWND和DC之类!
你以为控制台就只能做这些吗?
---------------------------------------
要介绍的是如何在Win32控制台里面画图
这次就用一个在窗口里面飞舞的长方形为例子
长方形里面写上一句Hello, World!
---------------------------------------
首先画图之前需要把那个闪烁的光标给炸掉
  1. CONSOLE_CURSOR_INFO cciCursor;
  2. HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

  3. if(GetConsoleCursorInfo(hStdOut, &cciCursor))
  4. {
  5.     cciCursor.bVisible = FALSE;
  6.     SetConsoleCursorInfo(hStdOut, &cciCursor);
  7. }
复制代码
就不解释了,问度娘去
画图肯定需要句柄
所以先写上这么几句话:
  1. char title[512];
  2. HWND hWnd;

  3. GetConsoleTitle(title, 512);
  4. hWnd = FindWindow(NULL, title);
复制代码
应该不用解释什么了吧
GetConsoleTitle用于获取控制台标题
用FindWindow寻找对应标题的窗口
还需要获取DC(绘图句柄)
  1. HDC hDC;

  2. hDC = GetDC(hWnd);
复制代码
要注意这里不是一般的Win32程序,这里不是WM_PAINT
所以绝对不能够用BeginPaint(呸其实可以用)
用了GetDC来代替
然后需要获取整个控制台大小,后面会用到
  1. RECT size;

  2. GetClientRect(hWnd, &size);
复制代码
最后把字体和画笔加载完成(好麻烦)
  1. HFONT  hFont;
  2. HBRUSH hBrush;

  3. hFont  = CreateFont      (48, 0, 0, 0, FW_BOLD, 0, 0, 0, 0, 0, 0, 0, 0, "Lucida Console");
  4. hBrush = CreateSolidBrush((COLORREF)0x00FFFFFF);
  5. system("color F0");
复制代码
最后一行有点投机取巧了
用了system来设置颜色,当然你也可以画一个大的填充矩形(画笔是全白的)
还需要一个主循环来绘制图片:
  1. while(1)
  2. {
  3. }
复制代码

***以下程序在主循环里面***
用x, y, d, g分别表示当前X坐标,当前Y坐标,每次循环增加的量,以及当前状态
  1. int x, y, d, g;

  2. x = 30, y = 10, d = 4, g = 3;
复制代码
用一个RECT来把痕迹擦除掉
  1. RECT rect;

  2. rect.left   = x;
  3. rect.top    = y;
  4. rect.right  = x + 380 + d + 1;
  5. rect.bottom = y + 60  + d + 1;
复制代码
里面的Magic Number事算出来的QaQ
就这么将就吧QaQ
然后擦除痕迹就一句话
  1. FillRect(hDC, &rect, hBrush);
复制代码
终于到了画字符的时候了
也是TextOut一句话
  1. TextOut(hDC, x + 10, y + 10, "Hello, World!", 13);
复制代码
最后的13是字符串"Hello, World!"的长度(话说13不是B吗)
画出外面的直线
  1. MoveToEx(hDC, x + 5, y + 5, NULL);
  2. LineTo(hDC, x + 380, y +  5);
  3. LineTo(hDC, x + 380, y + 60);
  4. LineTo(hDC, x +   5, y + 60);
  5. LineTo(hDC, x +   5, y +  5);
复制代码
等待一会儿,否则就会闪瞎狗眼
  1. Sleep(15);
复制代码
然后就剩下一点了
碰撞检测。也不是很难,switch一堆就好,自己理解吧
  1. switch(g)
  2. {
  3. case 0:
  4.     if(y > d)
  5.         y -= d;
  6.     else
  7.         g = 2;

  8.     if(x > d)
  9.         x -= d;
  10.     else
  11.         g = 1;
  12.     break;//↖
  13. case 1:
  14.     if(y > d)
  15.         y -= d;
  16.     else
  17.         g = 3;

  18.     if(x < size.right - 380 - d)
  19.         x += d;
  20.     else
  21.         g = 0;
  22.     break;//↗
  23. case 2:
  24.     if(y < size.bottom - 60 - d)
  25.         y += d;
  26.     else
  27.         g = 0;

  28.     if(x > d)
  29.         x -= d;
  30.     else
  31.         g = 3;
  32.     break;//↙
  33. case 3:
  34.     if(y < size.bottom - 60 - d)
  35.         y += d;
  36.     else
  37.         g = 1;

  38.     if(x < size.right - 380 - d)
  39.         x += d;
  40.     else
  41.         g = 2;
  42.     break;//↘
  43. default:
  44.     break;
  45. }
复制代码
***以下程序在主循环外面***
收拾一下残局,处理一下
  1. DeleteObject(hBrush);
  2. DeleteObject(hFont);
  3. ReleaseDC(hWnd, hDC);
  4. system("color 07");
  5. system("cls");
复制代码
完成了QaQ

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表