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

这一课继续介绍了在控制台程序中绘图,不过控制台窗口稍有变化,是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库对控制台窗口进行了一些包装处理,用起来比原始的控制台窗口还是方便多了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值