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

📄 control.c

📁 ucos-II+移植到arm+s3c2410的全套代码
💻 C
📖 第 1 页 / 共 3 页
字号:

	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;
		if(i+pListCtrl->CurrentHead>=pListCtrl->ListNum)
			break;
		if(i+pListCtrl->CurrentHead==pListCtrl->CurrentSel)	//文本被选中
			TextOutRect(pdc, &textRect, pListCtrl->pListText[i+pListCtrl->CurrentHead],
				TRUE, pListCtrl->FontSize|FONT_BLACKBK,TEXTOUT_MID_Y);
		else
			TextOutRect(pdc,&textRect, pListCtrl->pListText[i+pListCtrl->CurrentHead],
				TRUE, pListCtrl->FontSize,TEXTOUT_MID_Y);
	}

}

void DrawListCtrl(PListCtrl pListCtrl)
{
	structRECT rect;
	PDC pdc;

	pdc=GetCtrlParentDC((POS_Ctrl)pListCtrl);
	if(!pdc)
		return;

	//清空列表框的显示区域
	FillRect2(pdc,&pListCtrl->ListCtrlRect,GRAPH_MODE_NORMAL,COLOR_WHITE);

	CopyRect(&rect, &pListCtrl->ListCtrlRect);

	switch(pListCtrl->style){
	case CTRL_STYLE_DBFRAME:
		Draw3DRect2(pdc, &rect, RGB(192,192,192), RGB(0,0,0));
		InflateRect(&rect, -1,-1);
		Draw3DRect2(pdc, &rect, RGB(192,192,192), RGB(0,0,0));
		InflateRect(&rect, -1,-1);
		Draw3DRect2(pdc, &rect, RGB(128,128,128), RGB(0,0,0));
		InflateRect(&rect, -1,-1);
		Draw3DRect2(pdc, &rect, RGB(255,255,255), RGB(255,255,255));
		InflateRect(&rect, -1,-1);
		Draw3DRect2(pdc, &rect, RGB(128,128,128), RGB(192,192,192));
		InflateRect(&rect, -1,-1);
		Draw3DRect2(pdc, &rect, RGB(0,0,0), RGB(192,192,192));
		break;
	case CTRL_STYLE_FRAME:
		DrawRectFrame2(pdc,&rect);
		break;
	case CTRL_STYLE_3DUPFRAME:
		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));
		break;
	case CTRL_STYLE_3DDOWNFRAME:
		Draw3DRect2(pdc, &rect, RGB(0,0,0),RGB(192,192,192));
		InflateRect(&rect, -1,-1);
		Draw3DRect2(pdc, &rect, RGB(128,128,128), RGB(192,192,192));
		break;
	case CTRL_STYLE_NOFRAME:
		break;
	}
	InflateRect(&rect, -1,-1);

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

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

	ListCtrlDrawClient(pListCtrl, pdc);
	ListCtrlDrawRollBar(pListCtrl, pdc);

	ReleaseCtrlParentDC((POS_Ctrl)pListCtrl);
}

void ListCtrlOnTchScr(PListCtrl pListCtrl, int x, int y, U32 tchaction)
{
	int sel;
	POSMSG pMsg;
	if(IsInRect(&pListCtrl->ClientRect,x,y)){
		//在客户区域内单击,改变列表框的选择
		PDC pdc;
		sel=(y-pListCtrl->ClientRect.top)/OSFontSize[pListCtrl->FontSize];
		if(pListCtrl->CurrentHead+sel+1>pListCtrl->ListNum)
			return;

		pdc=GetCtrlParentDC((POS_Ctrl)pListCtrl);
		pListCtrl->CurrentSel=pListCtrl->CurrentHead+sel;
		ListCtrlDrawClient(pListCtrl,pdc);
		ReleaseCtrlParentDC((POS_Ctrl)pListCtrl);

		switch(tchaction){
		case TCHSCR_ACTION_CLICK:
			pMsg=OSCreateMessage((POS_Ctrl)pListCtrl->parentWnd, OSM_LISTCTRL_SELCHANGE, pListCtrl->CtrlID, pListCtrl->CurrentSel);
			SendMessage(pMsg);
			break;
		case TCHSCR_ACTION_DBCLICK:
			pMsg=OSCreateMessage((POS_Ctrl)pListCtrl->parentWnd, OSM_LISTCTRL_SELDBCLICK, pListCtrl->CtrlID, pListCtrl->CurrentSel);
			SendMessage(pMsg);
			break;
		}
		return;
	}
	if(IsInRect(&pListCtrl->ListCtrlRollRect,x,y)){
		//在滚动条区域内
		int rolltop,rollbottom;
		structRECT rect;
		PDC pdc;
		rolltop=pListCtrl->ListCtrlRollRect.top;
		rollbottom=pListCtrl->ListCtrlRollRect.bottom;
		if(y<rolltop+ROLLBUTTON_WIDTH && tchaction!=TCHSCR_ACTION_MOVE){
			//向上移动一格
			rect.left=pListCtrl->ListCtrlRollRect.left;
			rect.top=pListCtrl->ListCtrlRollRect.top;
			rect.right=pListCtrl->ListCtrlRollRect.right;
			rect.bottom=pListCtrl->ListCtrlRollRect.top+ROLLBUTTON_WIDTH;


			switch(tchaction){
			case TCHSCR_ACTION_UP:
				pListCtrl->CurrentHead=max(0,pListCtrl->CurrentHead-1);
				DrawListCtrl(pListCtrl);
				break;
			case TCHSCR_ACTION_DOWN:
				pdc=GetCtrlParentDC((POS_Ctrl)pListCtrl);

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

				ReleaseCtrlParentDC((POS_Ctrl)pListCtrl);
				break;

			}

			return;
		}
		if(y<rollbottom && y>rollbottom-ROLLBUTTON_WIDTH && tchaction!=TCHSCR_ACTION_MOVE){
			//向下移动一格
			rect.left=pListCtrl->ListCtrlRollRect.left;
			rect.top=pListCtrl->ListCtrlRollRect.bottom-ROLLBUTTON_WIDTH;
			rect.right=pListCtrl->ListCtrlRollRect.right;
			rect.bottom=pListCtrl->ListCtrlRollRect.bottom;


			switch(tchaction){
/*			case TCHSCR_ACTION_CLICK:
				pdc=GetCtrlParentDC((POS_Ctrl)pListCtrl);
				Draw3DRect2(pdc,&rect, RGB(0,0,0), RGB(192,192,192));
				InflateRect(&rect, -1, -1);
				Draw3DRect2(pdc,&rect, RGB(128,128,128),RGB(192,192,192));
				ReleaseCtrlParentDC((POS_Ctrl)pListCtrl);*/
			case TCHSCR_ACTION_UP:
				pListCtrl->CurrentHead=min(pListCtrl->CurrentHead+1,pListCtrl->ListNum-pListCtrl->ListShowNum);
				pListCtrl->CurrentHead=max(0,pListCtrl->CurrentHead);
				DrawListCtrl(pListCtrl);
				break;
			case TCHSCR_ACTION_DOWN:
				pdc=GetCtrlParentDC((POS_Ctrl)pListCtrl);
				Draw3DRect2(pdc,&rect, RGB(0,0,0), RGB(192,192,192));
				InflateRect(&rect, -1, -1);
				Draw3DRect2(pdc,&rect, RGB(128,128,128),RGB(192,192,192));
				ReleaseCtrlParentDC((POS_Ctrl)pListCtrl);
				break;

			}
			return;
		}
		if(IsInRect(&pListCtrl->RollBlockRect, x, y)|| tchaction==TCHSCR_ACTION_MOVE ){	//拖动滑块
			int head,preCurhead=pListCtrl->CurrentHead,
				length1=GetRectHeight(&pListCtrl->ListCtrlRollRect)
					-ROLLBUTTON_WIDTH*2-GetRectHeight(&pListCtrl->RollBlockRect),
				freenum=pListCtrl->ListNum-pListCtrl->ListShowNum;
			static int oldy;
			if(freenum>0 && tchaction==TCHSCR_ACTION_MOVE){	//拖动滑块
				head=(y-oldy)*freenum/length1;
				preCurhead=min(preCurhead+head,freenum);
				preCurhead=max(0,preCurhead);
				if(preCurhead!=pListCtrl->CurrentHead){
					oldy=y;
					pListCtrl->CurrentHead=preCurhead;
					DrawListCtrl(pListCtrl);
				}
			}
			else if(tchaction==TCHSCR_ACTION_DOWN){
				oldy=y;
			}
			return;
		}
		if(y<pListCtrl->RollBlockRect.top && tchaction==TCHSCR_ACTION_CLICK){//向上翻页
			int preCurhead=pListCtrl->CurrentHead;
			preCurhead=max(preCurhead-pListCtrl->ListShowNum,0);
			if(preCurhead!=pListCtrl->CurrentHead){
				pListCtrl->CurrentHead=preCurhead;
				DrawListCtrl(pListCtrl);
			}
			return;
		}
		if(y>pListCtrl->RollBlockRect.bottom && tchaction==TCHSCR_ACTION_CLICK){//向下翻页
			int preCurhead=pListCtrl->CurrentHead;
			preCurhead=min(preCurhead+pListCtrl->ListShowNum,pListCtrl->ListNum-pListCtrl->ListShowNum);
			preCurhead=max(0,preCurhead);
			if(preCurhead!=pListCtrl->CurrentHead){
				pListCtrl->CurrentHead=preCurhead;
				DrawListCtrl(pListCtrl);
			}
		}
	}
}

void ListCtrlSelMove(PListCtrl pListCtrl, int moveNum, U8 Redraw)	//列表框高亮度条移,正数下移,负数上移
{
	POSMSG pMsg;
	int oldsel=pListCtrl->CurrentSel;

	if(moveNum<0){	//向上滚动
		if(pListCtrl->CurrentSel+moveNum>=pListCtrl->CurrentHead)
			pListCtrl->CurrentSel+=moveNum;
		else{
			pListCtrl->CurrentSel=max(pListCtrl->CurrentSel+moveNum,0);
			pListCtrl->CurrentHead=pListCtrl->CurrentSel;
		}
	}
	else{ //向下滚动
		if(pListCtrl->CurrentSel+moveNum<pListCtrl->CurrentHead+pListCtrl->ListShowNum 
			&& pListCtrl->CurrentSel+moveNum<(pListCtrl->ListNum-1))
			pListCtrl->CurrentSel+=moveNum;
		else{
			pListCtrl->CurrentSel=min(pListCtrl->CurrentSel+moveNum,pListCtrl->ListNum-1);
			pListCtrl->CurrentHead=max(pListCtrl->CurrentSel-pListCtrl->ListShowNum+1,0);
		}
	}
	if(oldsel==pListCtrl->CurrentSel)
		return;

	if(Redraw)
		DrawListCtrl(pListCtrl);
	//发送列表框选择改变消息
	pMsg=OSCreateMessage((POS_Ctrl)pListCtrl->parentWnd,OSM_LISTCTRL_SELCHANGE, pListCtrl->CtrlID, pListCtrl->CurrentSel);
	SendMessage(pMsg);
}

void ListCtrlOnKey(PListCtrl pListCtrl, int nkey, int fnkey)
{
	switch(nkey){
	case '8'|KEY_DOWN:	//move up
		ListCtrlSelMove(pListCtrl,-1,TRUE);
		return;
	case '2'|KEY_DOWN:	//move down
		ListCtrlSelMove(pListCtrl,1,TRUE);
		return;
	}

}


void OSListCtrlOnMessage(PListCtrl pListCtrl, POSMSG pMsg)
{
	switch(pMsg->Message){
	case OSM_TOUCH_SCREEN:
		ListCtrlOnTchScr(pListCtrl, (S16)(pMsg->WParam&0xffff), (S16)(pMsg->WParam>>16), pMsg->LParam);
		break;
	case OSM_KEY:
		if(IsCtrlFocus((POS_Ctrl)pListCtrl))
			ListCtrlOnKey(pListCtrl, pMsg->WParam,pMsg->LParam);
		break;
	}
}

char TextDefKeyTable[]={0,0,0,'\b','7','8','9',0,'4','5','6','1','2','3',0,'0','.'};

PTextCtrl CreateTextCtrl(U32 CtrlID, structRECT* prect,  U32 FontSize, U32 style,char* KeyTable, PWnd parentWnd)
{
	PTextCtrl pTextCtrl;

	pTextCtrl=(PTextCtrl)CreateOSCtrl(CtrlID,CTRLTYPE_TEXTCTRL,prect, FontSize,style, parentWnd);
	pTextCtrl->bIsEdit=FALSE;
	pTextCtrl->text[0]=NULL;

	if(KeyTable)
		pTextCtrl->KeyTable=KeyTable;
	else
		pTextCtrl->KeyTable=TextDefKeyTable;

	return pTextCtrl;
}

void DestoryTextCtrl(PTextCtrl pTextCtrl)
{
	PList pList=GetCtrlList(pTextCtrl->parentWnd, pTextCtrl->CtrlID);
	DeleteListNode(pList);
	OSMemPut(pCtrlMem, (void*)pTextCtrl);
}

void SetTextCtrlText(PTextCtrl pTextCtrl, U16 *pch, U8 IsRedraw)
{
	UstrCpy(pTextCtrl->text, pch);

	if(IsRedraw /*&& pTextCtrl->CtrlID==GetWndCtrlFocus(pTextCtrl->parentWnd)*/)
		DrawTextCtrl(pTextCtrl);
}

U16* GetTextCtrlText(PTextCtrl pTextCtrl)
{
	return pTextCtrl->text;
}

void DrawTextCtrl(PTextCtrl pTextCtrl)
{
	structRECT rect;
	PDC pdc;
	pdc=GetCtrlParentDC((POS_Ctrl)pTextCtrl);
	if(!pdc)
		return;

	//清空列表框的显示区域
	FillRect2(pdc, &pTextCtrl->TextCtrlRect,GRAPH_MODE_NORMAL, COLOR_WHITE);

	CopyRect(&rect, &pTextCtrl->TextCtrlRect);
	if(GetWndCtrlFocus(pTextCtrl->parentWnd)==pTextCtrl->CtrlID){	//当前的控件为焦点
		switch(pTextCtrl->style){
		case CTRL_STYLE_DBFRAME:
			Draw3DRect2(pdc, &rect, RGB(192,192,192), RGB(0,0,0));
			InflateRect(&rect, -1,-1);
			Draw3DRect2(pdc, &rect, RGB(192,192,192), RGB(0,0,0));
			InflateRect(&rect, -1,-1);
			Draw3DRect2(pdc, &rect, RGB(128,128,128), RGB(0,0,0));
			InflateRect(&rect, -1,-1);
			Draw3DRect2(pdc, &rect, RGB(255,255,255), RGB(255,255,255));
			InflateRect(&rect, -1,-1);
			Draw3DRect2(pdc, &rect, RGB(128,128,128), RGB(192,192,192));
			InflateRect(&rect, -1,-1);
			Draw3DRect2(pdc, &rect, RGB(0,0,0), RGB(192,192,192));
			break;
		case CTRL_STYLE_FRAME:
			Draw3DRect2(pdc, &rect, RGB(0,0,0), RGB(0,0,0));
			break;
		case CTRL_STYLE_3DUPFRAME:
			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));
			InflateRect(&rect, -1,-1);
			Draw3DRect2(pdc, &rect, RGB(128,128,128), RGB(192,192,192));
			break;
		case CTRL_STYLE_3DDOWNFRAME:
			Draw3DRect2(pdc, &rect, RGB(0,0,0),RGB(192,192,192));
			InflateRect(&rect, -1,-1);
			Draw3DRect2(pdc, &rect, RGB(128,128,128), RGB(192,192,192));
			InflateRect(&rect, -1,-1);
			Draw3DRect2(pdc, &rect, RGB(128,128,128), RGB(192,192,192));
			break;
		case CTRL_STYLE_NOFRAME:
			break;
		}
	}
	else{
		switch(pTextCtrl->style){
		case CTRL_STYLE_DBFRAME:
			Draw3DRect2(pdc, &rect, RGB(192,192,192), RGB(0,0,0));
			InflateRect(&rect, -1,-1);
			Draw3DRect2(pdc, &rect, RGB(192,192,192), RGB(0,0,0));
			InflateRect(&rect, -1,-1);
			Draw3DRect2(pdc, &rect, RGB(128,128,128), RGB(0,0,0));
			break;
		case CTRL_STYLE_FRAME:
			Draw3DRect2(pdc, &rect, RGB(128,128,128), RGB(128,128,128));
			break;
		case CTRL_STYLE_3DUPFRAME:
			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));
			break;
		case CTRL_STYLE_3DDOWNFRAME:
			Draw3DRect2(pdc, &rect, RGB(0,0,0),RGB(192,192,192));
			InflateRect(&rect, -1,-1);
			Draw3DRect2(pdc, &rect, RGB(128,128,128), RGB(192,192,192));
			break;
		case CTRL_STYLE_NOFRAME:
			break;
		}
	}
	InflateRect(&rect, -1,-1);

	if(pTextCtrl->bIsEdit)	//文本框处于编辑状态
		TextOutRect(pdc, &rect, pTextCtrl->text, TRUE, 
			pTextCtrl->FontSize|FONT_BLACKBK,TEXTOUT_MID_Y);
	else
		TextOutRect(pdc, &rect, pTextCtrl->text, TRUE,
			pTextCtrl->FontSize,TEXTOUT_MID_Y);

	ReleaseCtrlParentDC((POS_Ctrl)pTextCtrl);
}

void AppendChar2TextCtrl(PTextCtrl pTextCtrl, U16 ch, U8 IsReDraw)
{
	int i;
	for(i=0;pTextCtrl->text[i];i++){
		if(i>39)
			return;
	}

	pTextCtrl->text[i++]=ch;
	pTextCtrl->text[i]=0;

	if(IsReDraw)
		DrawTextCtrl(pTextCtrl);
}

void TextCtrlDeleteChar(PTextCtrl pTextCtrl,U8 IsReDraw)
{
	int i;
	for(i=0;pTextCtrl->text[i];i++){
		if(i>39)
			return;
	}
	if(i==0)

⌨️ 快捷键说明

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