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