ucGUI做的一个TreeView这样的控件!

用ucGUI做了一个TreeView这样的控件!我用的版本里没有TreeView这个控件,所以自己做了一个.

这个做得比较难看呀!

个人头脑比较简单,所以做的思路也比较简单! 所以后面的代码也很简单

主要如下

一个节点放在一个窗体里,比如从根节点开始,有子节点的话,就创建一个窗体,它的父窗体就是父节点所在的窗体,就是和树一样的嵌套在一起的,这样主要可以方便的运行ucGUI的消息过程,比如节点展开,收起时,对长,宽的处理就会很方便.


我做的效果像这样的,哎,太难看了,程序员做界面还是不行呀, (因为是在嵌入式设备上,没有截图功能,就拍了一张,右边的tab Page也是自定义的,没有UGGUI自带的):



代码如下(我没有单独编译,如果少了什么定义的宏,自己根据定义自己搞一下),有兴趣的可以看一下。

//==========================头文件========================//
typedef struct TreeNode_struct TreeNode;

struct TreeNode_struct{
	int NodeID;       //结点ID
	char *NodeName;   //结点名称
};

static TreeNode MainTreeNode[]={
	{1,"设备1"},
	{2,"设备2"},
	{3,"设备3"},
	{4,"设备4"},
	{5,"设备5"},
};

WM_HWIN CreateTreeView(int x,int y,int xs,int ys,WM_HWIN hParent);

//添加一个子结点
WM_HWIN addTreeNode(WM_HWIN hParent,TreeNode *NodeInfo,int Root);


//=============================代码文件===============================//
#include "CreateTreeView.h"
#include "BUTTON.h"
#include "TEXT.h"
#include "SCROLLBAR.h"

#include "string.h"

#define WindowsBackgroundColor 0x6A4935
#define NodeHeight 20        //节点收起时高度
#define WM_USER_SUBNODESIZE WM_USER + 102

static void _cbMain(WM_MESSAGE *pMsg);

//节点回调
static void _cbTreeNode(WM_MESSAGE *pMsg);
//节点展开按钮回调
static void _cbNodeExpendButton(WM_MESSAGE *pMsg);
//节点按钮回调
static void _cbNodeButton(WM_MESSAGE *pMsg);
//展开节点
static void ExpendNode(WM_HWIN hwin,int flag);

WM_CALLBACK *_cbbtndefault,*_cbSCROLLBARDefault;

WM_HWIN CreateTreeView(int x,int y,int xs,int ys,WM_HWIN hParent){
	WIDGET_SetDefaultEffect_None();
	BUTTON_SetDefaultFont(FontHZText);
	BUTTON_SetDefaultTextColor(GUI_WHITE,0);
	BUTTON_SetDefaultBkColor(WindowsBackgroundColor,0);

	WM_HWIN hwin = WM_CreateWindowAsChild(x,y,xs,ys,hParent,WM_CF_SHOW,_cbMain,0);
	return hwin;
}

static void _cbMain(WM_MESSAGE *pMsg){
	switch(pMsg->MsgId){
		case WM_PAINT:
			GUI_SetBkColor(0x6A4935);
			GUI_Clear();
			break;
		case WM_USER_Change_SCROLLBAR:
		{
			WM_HWIN hwin,SHwin,SVwin;
			int Height=0,Width=0;
			SHwin = WM_GetScrollbarH(WM_GetParent(pMsg->hWin));
			SVwin = WM_GetScrollbarV(WM_GetParent(pMsg->hWin));
			hwin = WM_GetFirstChild(pMsg->hWin);
			while(WM_IsWindow(hwin)){
				if(WidthNodeName)*10,NodeHeight,NodeHwin,2,WM_CF_SHOW|GUI_TA_LEFT|GUI_TA_VCENTER);
		WM_SetCallback(bhwin,_cbNodeExpendButton);
		_cbbtndefault = WM_SetCallback(btexthwin,_cbNodeButton);
		//BUTTON_setbo
		BUTTON_SetTextAlign(btexthwin,GUI_TA_LEFT|GUI_TA_VCENTER);
		BUTTON_SetText(btexthwin,NodeInfo->NodeName);
		BUTTON_SetFocussable(btexthwin,0);
		BUTTON_SetFocussable(bhwin,0);
		if(Root == 0)
		{
			WM_HWIN Parentbhwin = WM_GetFirstChild(hParent);
			while(WM_IsWindow(Parentbhwin)){
				if(WM_GetId(Parentbhwin) == 1)
				{
					BUTTON_SetText(Parentbhwin,"+");  //显示父节点的展开按钮,创建时是隐藏的
					WM_ShowWin(Parentbhwin);
					break;
				}
				Parentbhwin = WM_GetNextSibling(Parentbhwin);
			}
		}
		return NodeHwin;
	}
}

//节点回调
static void _cbTreeNode(WM_MESSAGE *pMsg){
	WM_MESSAGE Msg;
	WM_HWIN Nexthwin;
	int Xs,Ys;
	switch(pMsg->MsgId)
	{
		case WM_USER_SUBNODESIZE:
			//改变节点的高度(子节点展开或收起时发送来的消息)
			Ys = WM_GetYSize(pMsg->hWin) + pMsg->Data.v;
			WM_SetYSize(pMsg->hWin,Ys);

			//如果子节点的宽度改变,大于父节点了,需要改变父节点宽度
			if(WM_GetXSize(pMsg->hWin)hWinSrc) + 20)
			{
				Xs = WM_GetXSize(pMsg->hWinSrc) + 20;
				WM_SetXSize(pMsg->hWin,Xs);  
			}
			//改变后面兄弟节点Y位置
			Nexthwin = WM_GetNextSibling(pMsg->hWin);
			while(WM_IsWindow(Nexthwin)){
				if(WM_GetId(Nexthwin) == 0)
					WM_MoveTo(Nexthwin,WM_GetWinOrgX(Nexthwin),WM_GetWinOrgY(Nexthwin) + pMsg->Data.v);
				Nexthwin = WM_GetNextSibling(Nexthwin);
			}

			Msg.hWin = WM_GetParent(pMsg->hWin);
			Msg.MsgId = WM_USER_SUBNODESIZE;
			Msg.Data.v = pMsg->Data.v;
			//改变父节点
			WM_SendMessage(Msg.hWin,&Msg);
			//设置设置滚动条
			WM_SendMessageNoPara(WM_GetParent(pMsg->hWin),WM_USER_Change_SCROLLBAR);
			break;	
		case WM_PAINT:
		{
			int dy;
			GUI_SetBkColor(WindowsBackgroundColor);
			GUI_Clear();
			/*if(!WM_IsWindow(WM_GetNextSibling(WM_GetParent(pMsg->hWin))))
			{
				dy = 10;
			}else
			{
				dy = 0;
			}
			GUI_SetColor(GUI_GRAY);
			GUI_DrawLine(4,0,4,WM_GetWinSizeY(pMsg->hWin)-dy);
			GUI_DrawLine(5,9,20,9);
			*/
			break;
		}
		default:
			WM_DefaultProc(pMsg);
	}
}

//节点展开按钮回调
static void _cbNodeExpendButton(WM_MESSAGE *pMsg)
{
	switch(pMsg->MsgId)
	{
		case WM_PAINT:
			GUI_Clear();
			break;
		case WM_PID_STATE_CHANGED:
		{
			WM_PID_STATE_CHANGED_INFO *PID_STATE_CHANGED_INFO;
			PID_STATE_CHANGED_INFO = (WM_PID_STATE_CHANGED_INFO *)pMsg->Data.p;
			if(PID_STATE_CHANGED_INFO->State > 0)
			{	
				if(WM_GetWinSizeY(WM_GetParent(pMsg->hWin)) == NodeHeight )
				{
					BUTTON_SetText(pMsg->hWin,"-");
					ExpendNode(WM_GetParent(pMsg->hWin),1);
				}else
				{
					BUTTON_SetText(pMsg->hWin,"+");
					ExpendNode(WM_GetParent(pMsg->hWin),0);
				}
			}
			break;
		}
	}
	_cbbtndefault(pMsg);
}

//节点按钮回调
static void _cbNodeButton(WM_MESSAGE *pMsg)
{
	switch(pMsg->MsgId)
	{
		case WM_PAINT:
			GUI_SetBkColor(WindowsBackgroundColor);
			GUI_Clear();
			break;
		case WM_NOTIFY_PARENT:
		{
			int Id = pMsg->hWinSrc;
			if(pMsg->Data.v == WM_NOTIFICATION_RELEASED)
			{
				;
			}
			break;
		}
		case WM_PID_STATE_CHANGED:
		{
			WM_PID_STATE_CHANGED_INFO *PID_STATE_CHANGED_INFO;
			PID_STATE_CHANGED_INFO = (WM_PID_STATE_CHANGED_INFO *)pMsg->Data.p;
			if(PID_STATE_CHANGED_INFO->State > 0)
			{
				//ExpendNode(WM_GetParent(pMsg->hWin),);	
			}
			break;
		}
	}
	_cbbtndefault(pMsg);
}

static void _cbSCHandle(WM_MESSAGE *pMsg){
	switch(pMsg->MsgId)
	{
		case WM_PAINT:
			GUI_SetBkColor(WindowsBackgroundColor);
			GUI_Clear();
			break;
	}
	_cbSCROLLBARDefault(pMsg);
}

static void ExpendNode(WM_HWIN hParent,int flag){
	WM_HWIN hwin;
	WM_MESSAGE Msg;
	int i=0,chHeight=0;
	hwin = WM_GetFirstChild(hParent);
	while(WM_IsWindow(hwin))
	{
		if(WM_GetId(hwin)==0)
		{
			i++;
			if(flag==1){
				Msg.hWin = hParent;
				Msg.Data.v = WM_GetWinSizeY(hwin);
				chHeight += WM_GetWinSizeY(hwin);
				Msg.hWinSrc = hwin;
				Msg.MsgId = WM_USER_SUBNODESIZE;
				WM_SendMessage(hParent,&Msg);
				WM_MoveTo(hwin,WM_GetWinOrgX(hwin),WM_GetWinOrgY(hParent) + WM_GetWinSizeY(hParent) - WM_GetWinSizeY(hwin));
				WM_ShowWin(hwin);
			}else
			{
				Msg.hWin = hParent;
				Msg.hWinSrc = hwin;
				Msg.Data.v = -WM_GetWinSizeY(hwin);
				chHeight += -WM_GetWinSizeY(hwin);
				Msg.MsgId = WM_USER_SUBNODESIZE;		
				WM_SendMessage(hParent,&Msg);
				WM_HideWin(hwin);
			}
		}
		hwin = WM_GetNextSibling(hwin);
	}
	if(flag == 0)
	{
		//WM_SetXSize(hParent,
		WM_SetYSize(hParent,NodeHeight);
	}

}




你可能感兴趣的:(C/C++,ucGUI)