深入浅出CChart 每日一课——快乐高四第五十九课 殊途同归,炫彩界面库之C代码风格

上节课介绍了CChart在炫彩界面库中的应用,其中炫彩界面库采用的是C++模板。本节课继续介绍炫彩界面库的C语言模板下怎么使用CChart。

在C语言下使用CChart,和C++下差别不是很大。笨笨在XCChart.h里面重新封装了两个宏命令。

消息响应函数定义宏:

XC_CChart_DecEleEventC(hWindowM, chartM, IDS)

第一个参数是HWINDOW变量,也就是炫彩主窗口变量。

第二个参数是一个CChart变量,需要用户提前放置好。

第三个参数是绘图所用元素的ID,用字符串表示,例如L”ID_PICTURE_1”。

消息注册宏:

XC_CChart_RegEleEventC(hWindowM, IDS)

第一个参数是HWINDOW变量,也就是炫彩主窗口变量。

第二个参数是绘图所用元素的ID,用字符串表示,例如L”ID_PICTURE_1”。

和C++下的宏很接近。为简便,宏命令包装的具体内容在本节课的最后给出,这里先介绍使用方法。

1、界面布局xml不用新建,复制上一课的即可。。

2、新建一个VC6的Win32 Application空工程LessonA59,注意是空工程。

3、拷贝炫彩界面库文件xcgui.h、XCGUI.lib、XCGUI.dll到LessonA58文件夹,拷贝CChart库文件Chart.h、Chart.lib、Chart.dll、Chartu.lib、Chartu.dll到LessonA59文件夹。

4、拷贝XCChart.h。

5、新建一个LessonA59.cpp并加入到工程,从炫彩界面库的说明书中,拷贝一个以c语言方式加载界面布局文件的模板,并在抬头加上#include <windows.h>。如果不好找,直接从下面复制拷贝。

//包含炫彩界面库文件
#inlcude <windows.h>
#pragma comment(lib, "XCGUI.lib")
#include "xcgui.h"

HWINDOW  hWindow=NULL;

//事件响应
int CALLBACK My_EventBtnClick(BOOL *pbHandled)
{
    //弹出消息框
    MessageBox(XWnd_GetHWND(hWindow),L"你点击了按钮",L"提示",MB_OK);
     *pbHandled=TRUE; //对该事件进行拦截,如果不需要拦截可以去掉该行代码
    return 0;    //事件的返回值
}

int APIENTRY wWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine, int nCmdShow)
{
    XInitXCGUI(); //初始化
    hWindow=XWnd_Create(0,0,300,200,L"炫彩界面库-窗口");//创建窗口
    if(hWindow)
    {
        HELE hButton=XBtn_Create(20,60,80,25,L"按钮",hWindow);//创建按钮
        XEle_RegEventC(hButton,XE_BNCLICK,My_EventBtnClick);//注册按钮点击事件

        XWnd_AdjustLayout(hWindow);  //调整布局,如果没有使用布局功能,可以不调用此函数
        XWnd_ShowWindow(hWindow,SW_SHOW);//显示窗口

        XRunXCGUI(); //运行
    }
    XExitXCGUI(); //释放资源
    return 0;
}

这个文件相当简短。

默认添加的按钮用不上,我们直接删掉。

删除按钮创建代码及其消息响应函数,最后的代码更简短了。

//包含炫彩界面库文件
#inlcude <windows.h>
#pragma comment(lib, "XCGUI.lib")
#include "xcgui.h"

HWINDOW  hWindow=NULL;

int APIENTRY wWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine, int nCmdShow)
{
    XInitXCGUI(); //初始化
    hWindow=XWnd_Create(0,0,300,200,L"炫彩界面库-窗口");//创建窗口
    if(hWindow)
    {
        XWnd_AdjustLayout(hWindow);  //调整布局,如果没有使用布局功能,可以不调用此函数
        XWnd_ShowWindow(hWindow,SW_SHOW);//显示窗口

        XRunXCGUI(); //运行
    }
    XExitXCGUI(); //释放资源
    return 0;
}

仅仅寥寥几行。

6、写入正确的xml布局文件路径。

因为我们要从xml文件中读取界面,首先删除这一行代码:

hWindow=XWnd_Create(0,0,300,200,L"炫彩界面库-窗口");//创建窗口

修改为:

XC_LoadResource(L".\\Simple\\resource.res");
HXCGUI hXCGUI=XC_LoadLayout(L".\\Simple\\main.xml");
hWindow = (HWINDOW)hXCGUI;

7、添加CChart支持

#include "XCChart.h"

8、添加一个CChart变量

CChart chart;

这是一个全局变量,这句话放置在模板文件的HWINDOW hWindow=NULL;之后即可。

9、定义消息响应函数

XC_CChart_DecEleEventC(hWindow, chart, L"ID_PICTURE_1");

这句话放置在上一句话CChart chart;之后即可。

10、注册消息响应函数

XC_CChart_RegEleEventC(hWindow, L"ID_PICTURE_1");

这句话只要在Init()函数里面即可,位置没有特定要求。这里我们把它放置XWnd_ShowWindow(hWindow,SW_SHOW);这一行之后。

11、DirectUI修正

XC_CChart_EleMsgRepair(hWindow, chart, L"ID_PICTURE_1");

到此为止,CChart的支撑代码已经完成,下面添加数据。上一课我们画的饼图,这一课画柱图。

12、添加数据。

在Init()里面添加如下代码。

        chart.SetType(kTypeStem);
		double data[6] ={1, 3, 5, 2, 4, 6};
		chart.AddStems(data, 6, _T("序列1"));
		chart.SetTitle(_T("炫彩界面库画柱图"));

运行结果如图。

 

这节课结束。

在最后,给出本节课宏命令封装的内容,以便大家在没有本节课源码的情况下自行处理。

消息注册命令

#define XC_CChart_RegEleEventC(hWindowM, IDS) {\
	HELE hMyPanel = (HELE)XC_GetObjectByIDName(hWindowM, IDS);\
	XEle_RegEventC(hMyPanel, XE_PAINT, OnEleDraw);\
	XEle_RegEventC(hMyPanel, XE_LBUTTONDOWN, OnEleLButtonDown);\
	XEle_RegEventC(hMyPanel, XE_LBUTTONUP, OnEleLButtonUp);\
	XEle_RegEventC(hMyPanel, XE_LBUTTONDBCLICK, OnEleLButtonDblClk);\
	XEle_RegEventC(hMyPanel, XE_RBUTTONDOWN, OnEleRButtonDown);\
	XEle_RegEventC(hMyPanel, XE_MOUSEMOVE, OnEleMouseMove);\
	XEle_RegEventC(hMyPanel, XE_MOUSEWHEEL, OnEleMouseWheel);\
	XEle_RegEventC(hMyPanel, XE_KEYDOWN, OnEleKeyDown);\
	XEle_EnableEvent_XE_MOUSEWHEEL(hMyPanel, TRUE);\
	}\

消息响应函数定义命令

#define XC_CChart_DecEleEventC(hWindowM, chartM, IDS)\
	int CALLBACK OnEleDraw(HDRAW hDraw, BOOL *pbHandled)\
	{\
		RECT rect;\
		HELE hMyPanel = (HELE)XC_GetObjectByIDName(hWindowM, IDS);\
		XEle_GetClientRect(hMyPanel, &rect);\
		HDC hDC = XDraw_GetHDC(hDraw);\
		XEle_DrawEle(hMyPanel, hDraw);\
		if(XC_IsEnableD2D())\
		{\
			chartM.OnDraw(hDC, rect);\
		}\
			else\
		{\
			chartM.OnDraw(hDC, rect);\
		}\
		\
		*pbHandled=TRUE;\
		return 0;\
	}\
	int CALLBACK OnEleLButtonDown(UINT nFlags, POINT *pPt, BOOL *pbHandled)\
	{\
		HWND hWnd = XWnd_GetHWND(hWindowM);\
		if(chartM.OnLButtonDown(hWnd, *pPt, 0))\
		{\
			XWnd_Redraw(hWindowM);\
		}\
		*pbHandled = FALSE;\
		return 0;\
	}\
	int CALLBACK OnEleLButtonUp(UINT flags, POINT *pPt, BOOL *pbHandled)\
	{\
		HWND hWnd = XWnd_GetHWND(hWindowM);\
		if(chartM.OnLButtonUp(hWnd, *pPt, 0))\
		{\
			XWnd_Redraw(hWindowM);\
		}\
		*pbHandled = FALSE;\
		return 0;\
	}\
	int CALLBACK OnEleLButtonDblClk(UINT nFlags, POINT *pPt, BOOL *pbHandled)\
	{\
		HWND hWnd = XWnd_GetHWND(hWindowM);\
		if(chartM.OnLButtonDblClk(hWnd, *pPt, 0))\
		{\
			XWnd_Redraw(hWindowM);\
		}\
		*pbHandled = FALSE;\
		return 0;\
	}\
	int CALLBACK OnEleRButtonDown(UINT nFlags, POINT *pPt, BOOL *pbHandled)\
	{\
		HELE hMyPanel = (HELE)XC_GetObjectByIDName(hWindowM, IDS);\
		XEle_PointClientToWndClient(hMyPanel, pPt);\
		\
		HWND hWnd = XWnd_GetHWND(hWindowM);\
		ClientToScreen(hWnd, pPt);\
		if(chartM.OnContextMenu(NULL, hWnd, *pPt))\
		{\
			XWnd_Redraw(hWindowM);\
		}\
		*pbHandled = FALSE;\
		return 0;\
	}\
	int CALLBACK OnEleMouseMove(UINT nFlags, POINT *pPt, BOOL *pbHandled)\
	{\
		HWND hWnd = XWnd_GetHWND(hWindowM);\
		if(chartM.OnMouseMove(hWnd, *pPt, 0))\
		{\
			XWnd_Redraw(hWindowM);\
		}\
		*pbHandled = FALSE;\
		return 0;\
	}\
	int CALLBACK OnEleMouseWheel(UINT nFlags,POINT *pPt,BOOL *pbHandled)\
	{\
		HWND hWnd = XWnd_GetHWND(hWindowM);\
		if(chartM.OnMouseWheel(hWnd, *pPt, 0))\
		{\
			XWnd_Redraw(hWindowM);\
		}\
		*pbHandled = FALSE;\
		return 0;\
	}\
	int CALLBACK OnEleKeyDown(WPARAM wParam, LPARAM lParam, BOOL *pbHandled)\
	{\
		HWND hWnd = XWnd_GetHWND(hWindowM);\
		UINT	key = (UINT)wParam;\
		if(chartM.OnKeyDown(hWnd, key))\
		{\
			XWnd_Redraw(hWindowM);\
		}\
		*pbHandled = FALSE;\
		return 0;\
	}\

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值