📄 control.c
字号:
#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 + -