用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);
}
}