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

📄 control.c

📁 S3C44B0X全套培训资料及源代码 e008s3c44b0x
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "..\ucos-ii\includes.h"               /* uC/OS interface */#include "..\ucos-ii\add\OSaddition.h"#include "..\inc\drv\tchScr.h"#include "..\inc\maro.h"#define ROLLBUTTON_WIDTH		16OS_MEM *pCtrlMem;INT8U CtrlMemPart[OSCtrlMemSize][OSCtrlblkSize];List OSCtrl;	//系统控件的链表,表头保留U32 OSCtrlFocusID=NULL;		//输入焦点的控件IDPDC pOSDC;	//系统的桌面DCOS_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){		Uart_Printf("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;}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;	for(i=0;i<pListCtrl->ListShowNum;i++){		SetRect(&textRect, pListCtrl->ClientRect.left, 			pListCtrl->ClientRect.top+i*OSFontSize[pListCtrl->FontSize],			pListCtrl->ClientRect.right,pListCtrl->ClientRect.top+(i+1)*OSFontSize[pListCtrl->FontSize]);		if(textRect.bottom>pListCtrl->ListCtrlRect.bottom)			break;

⌨️ 快捷键说明

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