⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 control.c

📁 ucos-II+移植到arm+s3c2410的全套代码
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "../ucos-ii/includes.h"               /* uC/OS interface */
#include "../ucos-ii/add/OSaddition.h"
#include "../inc/drv/tchScr.h"
#include "../inc/macro.h"
#include "../inc/sys/lib.h"
#include "Ustring.h"
#include <stdio.h>
#include <string.h>

#if USE_MINIGUI==0

#define ROLLBUTTON_WIDTH		16

OS_MEM *pCtrlMem;
INT8U CtrlMemPart[OSCtrlMemSize][OSCtrlblkSize];

List OSCtrl;	//系统控件的链表,表头保留
U32 OSCtrlFocusID=NULL;		//输入焦点的控件ID

PDC pOSDC;	//系统的桌面DC
OS_EVENT *OSDC_Ctrl_mem;                   //获得系统DC控制设备上下文
//    OSDC_Ctrl_mem=OSSemCreate(1);       
//    OSSemPend(OSDC_Ctrl_mem,0,&err);
//    OSSemPost(OSDC_Ctrl_mem);

extern int OSFontSize[4];
const char arrowpicture[4][7]={0xff,0xff,0xff, 0, 0xff,0xff,0xff,
							      0xff,0xff, 0,0,0,0xff,0xff,
							            0xff,0,0,0,0,0,0xff,
							                 0,0,0,0,0,0,0};
void OSListCtrlOnMessage(PListCtrl pListCtrl, POSMSG pMsg);
void OSSendAllListMessage(PList pOsCtrl,POSMSG pMsg);
void OSTextCtrlOnMessage(PTextCtrl pTextCtrl, POSMSG pMsg);
void OSButtonCtrlOnMessage(PButtonCtrl pButtonCtrl,POSMSG pMsg);
void OSWndOnMessage(PWnd pWnd, POSMSG pMsg);

void initOSCtrl()
{
	INT8U err;

	pCtrlMem=OSMemCreate(CtrlMemPart,OSCtrlMemSize, OSCtrlblkSize, &err);
	if(pCtrlMem==NULL){
		printk("Failed to Create Message quote");
		LCD_printf("Failed to Create Message quote");
	}
	
	OSCtrl.pNextList=NULL;
	OSCtrl.pPreList=NULL;
	OSCtrl.pData=NULL;

	pOSDC=CreateDC();

	OSDC_Ctrl_mem=OSSemCreate(1);
}

void ReDrawListOsCtrl(PList pOsCtrl)
{
	OS_Ctrl* pCtrl;
	while(pOsCtrl->pNextList!= NULL){
		pOsCtrl=pOsCtrl->pNextList;
		pCtrl=(OS_Ctrl*)pOsCtrl->pData;

		if(!(pCtrl->bVisible))
			continue;

		switch(pCtrl->CtrlType){
		case CTRLTYPE_LISTCTRL:
			DrawListCtrl((PListCtrl)pCtrl);
			break;
		case CTRLTYPE_TEXTCTRL:
			DrawTextCtrl((PTextCtrl)pCtrl);
			break;
		case CTRLTYPE_PICTURECTRL:
			DrawPictureCtrl((PPictureCtrl)pCtrl);
			break;
		case CTRLTYPE_WINDOW:
			DrawWindow((PWnd)pCtrl);
			break;
		case CTRLTYPE_BUTTONCTRL:
			DrawButton((PButtonCtrl)pCtrl);
			break;
		}
	}
}

void ReDrawOSCtrl()	//绘制所有的操作系统的控件
{
	ReDrawListOsCtrl(&OSCtrl);
}

OS_Ctrl* GetCtrlfromID(PWnd pWnd, U32 ctrlID)
{
	OS_Ctrl* pCtrl;
	PList pOsCtrl;
	if(pWnd)
		pOsCtrl=&pWnd->ChildWndList;
	else
		pOsCtrl=&OSCtrl;

	while(pOsCtrl->pNextList!= NULL){
		pOsCtrl=pOsCtrl->pNextList;
		pCtrl=(OS_Ctrl*)pOsCtrl->pData;
		if(pCtrl->CtrlID==ctrlID)
			return pCtrl;
	}
	return NULL;
}

U32 SetWndCtrlFocus(PWnd pWnd, U32 CtrlID)
{
	U32 preID;
	if(pWnd){
		preID=pWnd->FocusCtrlID;
		pWnd->FocusCtrlID=CtrlID;
		return preID;
	}
	preID=OSCtrlFocusID;
	OSCtrlFocusID=CtrlID;
	return preID;
}

U32 GetWndCtrlFocus(PWnd pWnd)
{
	if(pWnd)
		return pWnd->FocusCtrlID;

	return OSCtrlFocusID;
}

BOOLEAN IsCtrlFocus(POS_Ctrl pCtrl)
{
	return (GetWndCtrlFocus(pCtrl->parentWnd)==pCtrl->CtrlID);
}
	
PDC GetCtrlParentDC(POS_Ctrl pCtrl)
{
	INT8U err;
	if(pCtrl->parentWnd){
		if(pCtrl->parentWnd->bVisible==FALSE)
			return NULL;
		OSSemPend(pCtrl->parentWnd->WndDC_Ctrl_mem,0,&err);
		return pCtrl->parentWnd->pdc;
	}

	OSSemPend(OSDC_Ctrl_mem,0,&err);
	return pOSDC;
}

void ReleaseCtrlParentDC(POS_Ctrl pCtrl)
{
	if(pCtrl->parentWnd){
		OSSemPost(pCtrl->parentWnd->WndDC_Ctrl_mem);
		return;
	}
	OSSemPost(OSDC_Ctrl_mem);
}

void Client2Screen(PWnd pWnd, structRECT* prect)
{
	while(pWnd){
		RectOffSet(prect, pWnd->ClientRect.left, pWnd->ClientRect.top);
		pWnd=pWnd->parentWnd;
	}
}


OS_Ctrl* CreateOSCtrl(U32 CtrlID, U32 CtrlType, structRECT* prect, U32 FontSize, U32 style, PWnd parentWnd)
{
	INT8U err;
	OS_Ctrl* pCtrl;
	PList pListEnd;
	
	pCtrl=(OS_Ctrl*)OSMemGet(pCtrlMem,&err);

	pCtrl->CtrlType=CtrlType;
	pCtrl->CtrlID=CtrlID;
	CopyRect(&pCtrl->ListCtrlRect,prect);
	pCtrl->FontSize=FontSize;
	pCtrl->style=style;
	pCtrl->bVisible=TRUE;
	pCtrl->parentWnd=parentWnd;
	pCtrl->CtrlMsgCallBk=NULL;


	if(parentWnd){
		pListEnd=GetLastList(&parentWnd->ChildWndList);
	}
	else	{
		pListEnd=GetLastList(&OSCtrl);	//添加列表控件到系统控件的链表中
	}
	AddListNode(pListEnd, (void*)pCtrl);

	return pCtrl;
}

void SetCtrlMessageCallBk(POS_Ctrl pOSCtrl, U8 (*CtrlMsgCallBk)(void*))
{
	pOSCtrl->CtrlMsgCallBk=CtrlMsgCallBk;
}


void ShowCtrl(OS_Ctrl *pCtrl, U8 bVisible)
{
	pCtrl->bVisible=bVisible;
}

PList GetCtrlList(PWnd pwnd, U32 CtrlID)
{
	OS_Ctrl* pCtrl;
	PList pOsCtrl;

	if(!pwnd)
		pOsCtrl=&OSCtrl;
	else
		pOsCtrl=&pwnd->ChildWndList;

	while(pOsCtrl->pNextList!= NULL){
		pOsCtrl=pOsCtrl->pNextList;
		pCtrl=(OS_Ctrl*)pOsCtrl->pData;
		if(pCtrl->CtrlID==CtrlID)
			return pOsCtrl;
	}
	return NULL;
}


PListCtrl CreateListCtrl(U32 CtrlID, structRECT* prect, int MaxNum, U32 FontSize, U32 style, PWnd parentWnd)
{
	PListCtrl pListCtrl;
	int i;
	INT8U err;
	
	pListCtrl=(PListCtrl)CreateOSCtrl(CtrlID,CTRLTYPE_LISTCTRL,prect, FontSize,style,parentWnd);

	pListCtrl->ListMaxNum=MaxNum;
	pListCtrl->CurrentSel=0;
	pListCtrl->pListText=OSMemGet(pCtrlMem,&err);
	for(i=0;i<MaxNum;i++){
		pListCtrl->pListText[i]=(U16*)OSMemGet(pCtrlMem,&err);
	}
	pListCtrl->CurrentHead=0;
	pListCtrl->ListNum=0;
	pListCtrl->ListShowNum=(prect->bottom-prect->top)/OSFontSize[FontSize];

	return pListCtrl;
}

void DestoryListCtrl(PListCtrl plistCtrl)
{
	PList pList=GetCtrlList(plistCtrl->parentWnd, plistCtrl->CtrlID);
	DeleteListNode(pList);
	OSMemPut(pCtrlMem, (void*)plistCtrl);
}

U8 AddStringListCtrl(PListCtrl pListCtrl, U16 string[])
{
	int i;
	if(pListCtrl->ListNum+1>pListCtrl->ListMaxNum)
		return FALSE;

	for(i=0;i<OSCtrlblkSize/2 && string[i]!=0;i++)
		pListCtrl->pListText[pListCtrl->ListNum][i]=string[i];

	pListCtrl->pListText[pListCtrl->ListNum][i]=0;
	pListCtrl->ListNum++;
	return TRUE;
}

void ListCtrlReMoveAll(PListCtrl pListCtrl)
{
	pListCtrl->ListNum=0;
	pListCtrl->CurrentHead=0;
	pListCtrl->CurrentSel=0;
}

void ReLoadListCtrl(PListCtrl pListCtrl,U16* string[],int nstr)
{
	int i;

	ListCtrlReMoveAll(pListCtrl);
	for(i=0;i<nstr;i++)
		AddStringListCtrl(pListCtrl, string[i]);
}

void DrawRollArrow(PDC pdc,int x, int y, BOOLEAN bUp, BOOLEAN bEnable)
{
	int i,j;
	COLORREF color= RGB(0,0,0);
	if(!bEnable)
		color=RGB(192,192,192);

	if(bUp){
		for(j=0;j<4;j++){
			for(i=0;i<7;i++){
				if(arrowpicture[j][i])
					SetPixel(pdc, x+i, y+j, RGB(255,255,255));
				else
					SetPixel(pdc, x+i, y+j, color);
			}
		}
	}
	else{
		for(j=0;j<4;j++){
			for(i=0;i<7;i++){
				if(arrowpicture[j][i])
					SetPixel(pdc, x+i, y+6-j, RGB(255,255,255));
				else
					SetPixel(pdc, x+i, y+6-j, color);
			}
		}
	}
}

void OSSendAllListMessage(PList pOsCtrl,POSMSG pMsg)
{
	OS_Ctrl* pCtrl;
	while(pOsCtrl->pNextList!= NULL){
		pOsCtrl=pOsCtrl->pNextList;
		pCtrl=(OS_Ctrl*)pOsCtrl->pData;

		if(!(pCtrl->bVisible))
			continue;

		if(pCtrl->CtrlMsgCallBk){
			if((*pCtrl->CtrlMsgCallBk)(pMsg))
				continue;
		}

		switch(pCtrl->CtrlType){
		case CTRLTYPE_LISTCTRL:
			OSListCtrlOnMessage((PListCtrl) pCtrl, pMsg);
			break;
		case CTRLTYPE_TEXTCTRL:
			OSTextCtrlOnMessage((PTextCtrl) pCtrl, pMsg);
			break;
		case CTRLTYPE_PICTURECTRL:
			break;
		case CTRLTYPE_WINDOW:
			OSWndOnMessage((PWnd) pCtrl, pMsg);
			break;
		case CTRLTYPE_BUTTONCTRL:
			OSButtonCtrlOnMessage((PButtonCtrl) pCtrl, pMsg);
			break;
		}
	}
}

void OSOnSysMessage(void* pMsg)
{
	OS_Ctrl *pCtrl;
	if(((POSMSG)pMsg)->Message==OSM_TOUCH_SCREEN){
		pCtrl=GetCtrlfromID(NULL, GetWndCtrlFocus(NULL));
		if(pCtrl){
			if(pCtrl->CtrlType==CTRLTYPE_WINDOW){
				if((((PWnd)pCtrl)->style&WND_STYLE_MODE)==WND_STYLE_MODE){
					//焦点是有模式窗口,消息直接传递过去
					OSSendAllListMessage(&((PWnd)pCtrl)->ChildWndList, pMsg);
					return;
				}
			}
		}
	}
	OSSendAllListMessage(&OSCtrl, (POSMSG)pMsg);
}

//绘制列表框的滚动条
void ListCtrlDrawRollBar(PListCtrl pListCtrl, PDC pdc)
{
	structRECT rect;
	int length1,length2;


	rect.left=pListCtrl->ListCtrlRollRect.left;
	rect.top=pListCtrl->ListCtrlRollRect.top;
	rect.right=pListCtrl->ListCtrlRollRect.right;
	rect.bottom=pListCtrl->ListCtrlRollRect.top+ROLLBUTTON_WIDTH;

	length1=GetRectHeight(&pListCtrl->ListCtrlRollRect)-ROLLBUTTON_WIDTH*2;

	//绘制滚动条向上的箭头
	FillRect2(pdc, &rect, NULL, RGB(255,255,255));
	Draw3DRect2(pdc,&rect, RGB(192,192,192), RGB(0,0,0));
	InflateRect(&rect, -1, -1);
	Draw3DRect2(pdc,&rect, RGB(192,192,192), RGB(128,128,128));
	DrawRollArrow(pdc,rect.left+4,rect.top+4,TRUE,TRUE);
	
	//绘制滚动条中间
	rect.left-=1;
	rect.right+=1;
	rect.top=rect.bottom+1;
	rect.bottom=pListCtrl->ListCtrlRollRect.bottom-ROLLBUTTON_WIDTH-1;
	FillRect2(pdc, &rect, NULL, RGB(128,128,128));

	//绘制滚动条滑块
	rect.top+=pListCtrl->CurrentHead*length1/pListCtrl->ListNum;
	length2=pListCtrl->ListShowNum*length1/pListCtrl->ListNum;
	length2=min(length1,length2);
	length2=max(6,length2);
	rect.bottom=rect.top+length2;
	CopyRect(&pListCtrl->RollBlockRect, &rect);

	FillRect2(pdc, &rect, NULL, RGB(255,255,255));
	Draw3DRect2(pdc,&rect, RGB(192,192,192), RGB(0,0,0));
	InflateRect(&rect, -1, -1);
	Draw3DRect2(pdc,&rect, RGB(192,192,192), RGB(128,128,128));

	//绘制滚动条向下的箭头
	rect.left-=1;
	rect.right+=1;
	rect.top=pListCtrl->ListCtrlRollRect.bottom-ROLLBUTTON_WIDTH;
	rect.bottom=pListCtrl->ListCtrlRollRect.bottom;
	Draw3DRect2(pdc,&rect, RGB(192,192,192), RGB(0,0,0));
	InflateRect(&rect, -1, -1);
	Draw3DRect2(pdc,&rect, RGB(192,192,192), RGB(128,128,128));
	DrawRollArrow(pdc,rect.left+4,rect.top+4,FALSE,TRUE);

}

void ListCtrlDrawClient(PListCtrl pListCtrl, PDC pdc)
{
	structRECT textRect;
	int i;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -