概述
这一课继续介绍了在控制台程序中绘图,不过控制台窗口稍有变化,是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库对控制台窗口进行了一些包装处理,用起来比原始的控制台窗口还是方便多了。
最后
以上就是自由戒指为你收集整理的深入浅出CChart 每日一课——快乐高四第五十课 新石器时代,轻装上阵之EasyX窗口绘图的全部内容,希望文章能够帮你解决深入浅出CChart 每日一课——快乐高四第五十课 新石器时代,轻装上阵之EasyX窗口绘图所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复