赞
踩
这一课继续介绍了在控制台程序中绘图,不过控制台窗口稍有变化,是EasyX库生成的控制台窗口。
根据EasyX官方主页的说明,EasyX 是针对 C++ 的图形库,可以帮助C/C++初学者快速上手图形和游戏编程。
根据笨笨的理解,EasyX实际上就是一个在控制台上绘图的C++图形库,可以帮助C/C++初学者避开繁杂的Windows程序架构。
EasyX的控制台和普通的控制台有所不同,据说是BGI兼容的。BGI,Borland Graphis Interface,宝兰图形界面。宝兰公司,好悠远的回忆!
这一课的代码和上一节课差不多,这里直接给出全部代码。在这之前,当然还需要从EasyX官网上下载并安装EasyX。
- #include <graphics.h>
-
- #include "Chart.h"
- #if defined(_UNICODE) || defined(UNICODE)
- # pragma comment(lib,"CChartu.lib")
- #else
- # pragma comment(lib,"CChart.lib")
- #endif
- using namespace NsCChart;
-
- #include <math.h>
-
- CChart chart;
-
- // 绘图函数
- void MyDraw()
- {
- HDC hDC = GetImageHDC();
-
- RECT rt = {0, getheight()/2, getwidth(), getheight()};
- chart.OnDraw(hDC, rt);
- }
-
-
- int main(int argc, char* argv[])
- {
- HWND hWnd = initgraph(640, 480, EW_DBLCLKS);
-
- double pi = 4.0*atan(1.0);
- int len=1080;
- for(int i=0; i<len; ++i)
- {
- chart.AddPoint2D(i, 1.4*sin(2.0*pi*i/360));
- }
- chart.SetTitle(_T("在EasyX中使用CChart"));
- chart.SetBkgndColor(RGB(0, 0, 0));
- chart.SetTitleColor(RGB(245, 245, 245));
-
- outtextxy(0, 0, _T("在EasyX窗口中绘图"));
-
- MyDraw();
-
- ExMessage em;
- WPARAM wParam;
- LPARAM lParam;
- bool loop = true;
- while(loop)
- {
- getmessage(&em, EM_MOUSE | EM_KEY);
- if(em.ch == 'c' || em.ch == 'C')loop = false;
-
- wParam = em.wParam;
- if(em.message == WM_MOUSEWHEEL)wParam = em.wheel;
- lParam = em.x + (em.y<<16);
- if(chart.OnEvent(hWnd, em.message, wParam, lParam))
- MyDraw();
- }
-
- closegraph();
-
- return 0;
- }
效果如图。
下面略做解释。
这一句话是引入EasyX库。
#include <graphics.h>
在main()函数一开始,用下面这句话初始化一个640X480像素的控制台窗口。
HWND hWnd = initgraph(640, 480, EW_DBLCLKS);
注意第三个参数EW_DBLCLKS,这使得窗口能响应鼠标双击消息。
在MyDraw()这个函数一开始,用GetImageHDC()函数获得了绘图的设备上下文。
HDC hDC = GetImageHDC();
上一课是利用GetDC()获得的设备上下文,但在EasyX窗口上,对GetDC()获得的设备上下文绘图,图像会立马被黑背景覆盖,具体原因不明。GetImageHDC()是EasyX提供的一个库函数,用这个函数才能获得正确的设备上下文。
消息处理的代码如下。
- ExMessage em;
- bool loop = true;
- WPARAM wParam;
- LPARAM lParam;
- while(loop)
- {
- getmessage(&em, EM_MOUSE | EM_KEY);
- if(em.ch == 'c' || em.ch == 'C')loop = false;
-
- wParam = em.wParam;
- if(em.message == WM_MOUSEWHEEL)wParam = em.wheel;
- lParam = em.x + (em.y<<16);
- if(chart.OnEvent(hWnd, em.message, wParam, lParam))
- MyDraw();
- }
EasyX库已经包装实现了与Win32兼容的窗口消息,因此消息处理比上一课简单多了。
注意到这里仍然用c键退出死循环。
ExMessage结构里本来已经提供了wParam参数和lParam参数,但对于鼠标消息,这两个参数经测试似乎有所不对。这里就直接计算了这两个参数。lParam参数直接用鼠标的坐标重新计算,另外在鼠标滚轮的情况下,ExMessage结构里面的wParam参数只有一个滚轮方向,这里用wheel参数替代就正确了。
总的说来,EasyX库对控制台窗口进行了一些包装处理,用起来比原始的控制台窗口还是方便多了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。