当前位置:   article > 正文

深入浅出CChart 每日一课——快乐高四第五十课 新石器时代,轻装上阵之EasyX窗口绘图_easyx和cchart

easyx和cchart

这一课继续介绍了在控制台程序中绘图,不过控制台窗口稍有变化,是EasyX库生成的控制台窗口。

根据EasyX官方主页的说明,EasyX 是针对 C++ 的图形库,可以帮助C/C++初学者快速上手图形和游戏编程。

根据笨笨的理解,EasyX实际上就是一个在控制台上绘图的C++图形库,可以帮助C/C++初学者避开繁杂的Windows程序架构。

EasyX的控制台和普通的控制台有所不同,据说是BGI兼容的。BGI,Borland Graphis Interface,宝兰图形界面。宝兰公司,好悠远的回忆!

这一课的代码和上一节课差不多,这里直接给出全部代码。在这之前,当然还需要从EasyX官网上下载并安装EasyX。

  1. #include <graphics.h>
  2. #include "Chart.h"
  3. #if defined(_UNICODE) || defined(UNICODE)
  4. # pragma comment(lib,"CChartu.lib")
  5. #else
  6. # pragma comment(lib,"CChart.lib")
  7. #endif
  8. using namespace NsCChart;
  9. #include <math.h>
  10. CChart chart;
  11. // 绘图函数
  12. void MyDraw()
  13. {
  14. HDC hDC = GetImageHDC();
  15. RECT rt = {0, getheight()/2, getwidth(), getheight()};
  16. chart.OnDraw(hDC, rt);
  17. }
  18. int main(int argc, char* argv[])
  19. {
  20. HWND hWnd = initgraph(640, 480, EW_DBLCLKS);
  21. double pi = 4.0*atan(1.0);
  22. int len=1080;
  23. for(int i=0; i<len; ++i)
  24. {
  25. chart.AddPoint2D(i, 1.4*sin(2.0*pi*i/360));
  26. }
  27. chart.SetTitle(_T("在EasyX中使用CChart"));
  28. chart.SetBkgndColor(RGB(0, 0, 0));
  29. chart.SetTitleColor(RGB(245, 245, 245));
  30. outtextxy(0, 0, _T("在EasyX窗口中绘图"));
  31. MyDraw();
  32. ExMessage em;
  33. WPARAM wParam;
  34. LPARAM lParam;
  35. bool loop = true;
  36. while(loop)
  37. {
  38. getmessage(&em, EM_MOUSE | EM_KEY);
  39. if(em.ch == 'c' || em.ch == 'C')loop = false;
  40. wParam = em.wParam;
  41. if(em.message == WM_MOUSEWHEEL)wParam = em.wheel;
  42. lParam = em.x + (em.y<<16);
  43. if(chart.OnEvent(hWnd, em.message, wParam, lParam))
  44. MyDraw();
  45. }
  46. closegraph();
  47. return 0;
  48. }

效果如图。

下面略做解释。

这一句话是引入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提供的一个库函数,用这个函数才能获得正确的设备上下文。

消息处理的代码如下。

  1. ExMessage em;
  2. bool loop = true;
  3. WPARAM wParam;
  4. LPARAM lParam;
  5. while(loop)
  6. {
  7. getmessage(&em, EM_MOUSE | EM_KEY);
  8. if(em.ch == 'c' || em.ch == 'C')loop = false;
  9. wParam = em.wParam;
  10. if(em.message == WM_MOUSEWHEEL)wParam = em.wheel;
  11. lParam = em.x + (em.y<<16);
  12. if(chart.OnEvent(hWnd, em.message, wParam, lParam))
  13. MyDraw();
  14. }

EasyX库已经包装实现了与Win32兼容的窗口消息,因此消息处理比上一课简单多了。

注意到这里仍然用c键退出死循环。

ExMessage结构里本来已经提供了wParam参数和lParam参数,但对于鼠标消息,这两个参数经测试似乎有所不对。这里就直接计算了这两个参数。lParam参数直接用鼠标的坐标重新计算,另外在鼠标滚轮的情况下,ExMessage结构里面的wParam参数只有一个滚轮方向,这里用wheel参数替代就正确了。

总的说来,EasyX库对控制台窗口进行了一些包装处理,用起来比原始的控制台窗口还是方便多了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/94040
推荐阅读
相关标签
  

闽ICP备14008679号