📄 uiguage.c
字号:
/******************************************************************/
/* Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved. */
/*******************************************************************
File : uiguage.h
Desc : 进度条,指示条
Author : GUI Develop Group.lzj
Date : 2007-08-10
Notes :
$Log: uiguage.c,v $
Revision 1.2 2008/06/19 04:43:20 Administrator
代码整理!
Revision 1.1.1.1 2008/05/07 04:15:08 Administrator
no message
Revision 1.1.1.1 2008/03/06 13:29:09 Lingzhaojun
no message
Revision 1.8 2007/12/03 07:25:43 Hanjiang
音量进度条显示的数字直接调用系统全局变量,原用百分比计算会有误差,数字变化不连续
Revision 1.7 2007/11/27 09:04:32 Lingzhaojun
修改音量显示不准确
Revision 1.6 2007/10/30 11:42:36 Chenmeiyou
修正了EQ滑动条问题
Revision 1.5 2007/10/15 02:58:09 Lingzhaojun
添加GUI控件注释
Revision 1.4 2007/10/08 04:02:23 Lingzhaojun
去除GUI的VC编译警告
Revision 1.3 2007/10/08 02:04:27 Lingzhaojun
GUI添加自动注释
20070807。 试验对垂直,水平指示条的兼容
*********************************************************************/
#include "uiguage.h"
extern WINDOW_PROCREG WinBmpProcMap[];
extern PWINDOW gGuiDspCurrUpdateWindow;
/*时间型进度表图片*/
WinPicDescp GuagePicListTime[] =
{
{Icon_GuageBack, BID_TimeGuageBack, 20, 200},
{Icon_GuagePassed, BID_TimeGuage174_314_224, 21, 201},
{Icon_Guage, BID_Guage, 8 + 30, 200 + 5},
EndWinPicDescp()
};
/*垂直型EQ条图片*/
WinPicDescp GuagePicListEQ[] =
{
{Icon_GuageBack, BID_EQback, 220, 20},
{Icon_Guage, BID_EQSelect, 220, 20},
EndWinPicDescp()
};
/*音量型图片*/
WinPicDescp GuagePicListVol[] =
{
{Icon_GuageBack, BID_MusicVol10_180, 220, 20},
{Icon_GuagePassed, BID_MusicVolBack , 220, 20},
EndWinPicDescp()
};
/*----------------------------------------------------------------------
Name : GuageWinSetPic
Desc : 进度条设置图片
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 GuageWinSetPic(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_Guage*WguageObj = (W_Guage *)win->Data;
UINT16*pID = lParam;
IconType Type = wParam;
IMAGE_BMPDATA BmpSize;
PicDescp *Bmp = (PicDescp*)lParam;
//Type=Type&0x0000FFFF;
PROCHANDLE procHandle = GuiDspGetWindowResProc(gGuiDspCurrUpdateWindow , win->id);
switch (Type)
{
case Icon_GuageBack:
WguageObj->IconBackground.BmpID = Bmp->BmpID;
WguageObj->IconBackground.X = Bmp->X;
WguageObj->IconBackground.Y = Bmp->Y;
GetBmpHeadWidth(procHandle, WguageObj->IconBackground.BmpID, &BmpSize);
WguageObj->IconPassedH = BmpSize.h;
WguageObj->IconPassedW = BmpSize.w;
WguageObj->IconPassed.X = WguageObj->IconBackground.X;
WguageObj->IconPassed.Y = WguageObj->IconBackground.Y;
break;
case Icon_GuagePassed:
WguageObj->IconPassed.BmpID = Bmp->BmpID;
WguageObj->IconPassed.X = Bmp->X;
WguageObj->IconPassed.Y = Bmp->Y;
GetBmpHeadWidth(procHandle, WguageObj->IconPassed.BmpID, &BmpSize);
WguageObj->IconPassedH = BmpSize.h;
WguageObj->IconPassedW = BmpSize.w;
break;
case Icon_Guage:
WguageObj->Iconguage.BmpID = Bmp->BmpID;
WguageObj->Iconguage.X = Bmp->X;
WguageObj->Iconguage.Y = Bmp->Y;
break;
default:
break;
}
WindowInvalidateWindow(win);
return TRUE;
}
/*----------------------------------------------------------------------
Name : GuageWinPaint
Desc : 进度条画屏,集中处理所有画图操作
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 GuageWinPaint(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_Guage*WguageObj = (W_Guage *)win->Data;
UHRECT srcRect;
DispMode TranspLevel = WinGetTranStyle(win->style);
if (!(WIN_NEEDPAIT(win)))
return TRUE;
/*先画背景*/
//DrawPicture(WguageObj->IconBackground);
DrawBmpIdEx(WguageObj->IconBackground.X, WguageObj->IconBackground.Y, WguageObj->IconBackground.BmpID, NULL, TranspLevel);
srcRect.x = 0;
srcRect.y = 0;
if (win->style&WES_GuageApeak) //垂直型指示条
{
srcRect.w = WguageObj->IconPassedW;
srcRect.h = (WguageObj->IconPassedH - 6) * WguageObj->percent / MaxGuage;//cmy:要减去滑动块的厚度
WguageObj->Iconguage.Y = srcRect.h + win->y;
}
else
{
if (win->style&WES_GuageVol) //音量进度条的图标左右都未靠齐
srcRect.w = 26 + (WguageObj->IconPassedW - 47) * WguageObj->percent / MaxGuage;
else
srcRect.w = WguageObj->IconPassedW * WguageObj->percent / MaxGuage;
srcRect.h = WguageObj->IconPassedH;
WguageObj->Iconguage.X = srcRect.w + win->x;
}
/*画逝去填充部分*/
if (win->style&WES_GuageFill)
DrawBmpIdEx(WguageObj->IconPassed.X, WguageObj->IconPassed.Y, WguageObj->IconPassed.BmpID, &srcRect, TranspLevel);
/*画进度点滑块*/
if (win->style&WES_GuageSlider)
{
//DrawPicture(WguageObj->Iconguage);
DrawBmpIdEx(WguageObj->Iconguage.X, WguageObj->Iconguage.Y, WguageObj->Iconguage.BmpID, NULL, TranspLevel);
}
/*音量数值*/
if (win->style&WES_GuageVol)
{
ColorDesc color = {COLOR_WHITE, COLOR_RED, DSPM_Normal};
char zero[] = "00"; //huangsl, for 0结束符.
zero[0] += (char)gpSysConfig->OutputVolume / 10;
zero[1] += (char)gpSysConfig->OutputVolume % 10;
DrawStringAsiiEx((UINT16)(win->x + win->w - 8) , (UINT16)(win->y + 2) , 20 , zero, Font16X16 , &color , 0);
}
WIN_CLEARPAIT(win);
return TRUE;
}
/*----------------------------------------------------------------------
Name : GuageWinTouch
Desc : 进度条对触摸屏的响应
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 GuageWinTouch(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_Guage*WguageObj = (W_Guage *)win->Data;
PUHPOINT touchPoint = (PUHPOINT)lParam;
UINT16 percent;
if (wParam == TM_STATE_DOWN)
{
if (win->style&WES_GuageApeak) //垂直型指示条
{
if (touchPoint->y > (WguageObj->IconPassed.Y + WguageObj->IconPassedH))
touchPoint->y = WguageObj->IconPassed.Y + WguageObj->IconPassedH;
if (touchPoint->y < WguageObj->IconPassed.Y)
touchPoint->y = WguageObj->IconPassed.Y;
percent = (touchPoint->y - WguageObj->IconPassed.Y) * MaxGuage / WguageObj->IconPassedH;
}
else
{
if (touchPoint->x > (WguageObj->IconPassed.X + WguageObj->IconPassedW))
touchPoint->x = WguageObj->IconPassed.X + WguageObj->IconPassedW;
if (touchPoint->x < WguageObj->IconPassed.X)
touchPoint->x = WguageObj->IconPassed.X;
percent = (touchPoint->x - WguageObj->IconPassed.X) * MaxGuage / WguageObj->IconPassedW;
}
/*重新设置进度*/
WindowSendMessage(win, WM_GuageUpdate, percent, NULL);
WinSendCommand(win, EV_TouchPress); //向父窗口发送comman消息
}
return TRUE;
}
/*----------------------------------------------------------------------
Name : GuageWinKey
Desc : 进度条对按键的响应
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 GuageWinKey(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
UINT16 keyPress = (UINT16)((wParam) >> 16);
UINT16 KEY_EV = (UINT16)(wParam);
if (keyPress)
return FALSE;
switch (KEY_EV)
{
case KE_EXIT_RELEASE:
case KE_RETURN_RELEASE:
case KE_MENU_RELEASE:
//for example
WindowDestroy(win->Parent);
break;
}
return TRUE;
}
/*----------------------------------------------------------------------
Name : GuageWinTick
Desc : 进度条Tick消息,目前未用
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 GuageWinTick(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
/* W_Guage*WguageObj=(W_Guage *)win->Data;
if(Ts<999)
Ts=Ts+25;
else
WindowDestroy(win);
//WindowSendMessage( win, WM_GuageUpdate, Ts, NULL);
*/
return TRUE;
}
/*----------------------------------------------------------------------
Name : GuageWinSetpolar
Desc : 设置进度滑块两级的坐标,
Params: 使用wParam参数设置,
高位为终点X坐标,低16位为起点X坐标
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 GuageWinSetpolar(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_Guage*WguageObj = (W_Guage *)win->Data;
WguageObj->endpoint = wParam >> 16;
WguageObj->startpoint = wParam & 0x00ff;
return TRUE;
}
/*----------------------------------------------------------------------
Name : GuageWinSetPermillage
Desc : 进度条更新进度千分比指示,wParam为更新的进度(最大为1000)
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 GuageWinSetPermillage(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_Guage*WguageObj = (W_Guage *)win->Data;
if (wParam > MaxGuage) wParam = MaxGuage;
WguageObj->percent = wParam;
if (win->style&WES_GuageEQ)
WindowInvalidateWindow(win->Parent);
else
WindowInvalidateWindow(win);
return TRUE;
}
/*----------------------------------------------------------------------
Name : GuageWinCreat
Desc : 进度条创建消息
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 GuageWinCreat(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_Guage*WguageObj = NULL;
UINT16 i;
WguageObj = MallocClass(W_Guage);
if (NULL == WguageObj)
return FALSE;
WguageObj->IconBackground.BmpID = win->BmpID; /*进度条背景图片*/
WguageObj->IconBackground.X = win->x;
WguageObj->IconBackground.Y = win->y;
WguageObj->IconPassed.BmpID = 0; /*进度逝去区填充图标*/
WguageObj->Iconguage.BmpID = 0; /*进度条块*/
WguageObj->percent = 382; /*当前进度千分比*/
//WguageObj->lastPosition=0; /*保存了上一次进度条位置*/
//WguageObj->startpoint=0; /*起点位置*/
//WguageObj->endpoint=300-2; /*终点位置*/
win->Data = WguageObj;
if (win->style&WES_GuageTime) /*时间型进度条*/
{
i = 0;
GuagePicListTime[0].pic.X = win->x;
GuagePicListTime[0].pic.Y = win->y;
GuagePicListTime[1].pic.X = win->x + 1;
GuagePicListTime[1].pic.Y = win->y + 1;
GuagePicListTime[2].pic.X = win->x + 1;
GuagePicListTime[2].pic.Y = win->y;
while (GuagePicListTime[i].IconType != IconMax)
{
GuageWinSetPic(win, GuagePicListTime[i].IconType, &(GuagePicListTime[i].pic));
i++;
}
}
if (win->style&WES_GuageEQ) /*EQ型指示条*/
{
i = 0;
GuagePicListEQ[0].pic.X = win->x;
GuagePicListEQ[0].pic.Y = win->y;
GuagePicListEQ[1].pic.X = win->x;
GuagePicListEQ[1].pic.Y = win->y;
while (GuagePicListEQ[i].IconType != IconMax)
{
GuageWinSetPic(win, GuagePicListEQ[i].IconType, &(GuagePicListEQ[i].pic));
i++;
}
}
if (win->style&WES_GuageVol) /*音量型指示条*/
{
win->style |= WES_GuageFill;
i = 0;
GuagePicListVol[0].pic.X = win->x;
GuagePicListVol[0].pic.Y = win->y;
GuagePicListVol[1].pic.X = win->x;
GuagePicListVol[1].pic.Y = win->y;
while (GuagePicListVol[i].IconType != IconMax)
{
GuageWinSetPic(win, GuagePicListVol[i].IconType, &(GuagePicListVol[i].pic));
i++;
}
}
return TRUE;
}
/*----------------------------------------------------------------------
Name : GuageWinDestroy
Desc : 进度条关闭
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 GuageWinDestroy(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_Guage*WguageObj = (W_Guage *)win->Data;
FreeClass(WguageObj);
return TRUE;
}
/*----------------------------------------------------------------------
Name : GuageWinGetPercent
Desc : 获取进度条当前地千分比,通常当触摸屏重设了进度后由父窗口调用
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 GuageWinGetPercent(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_Guage*WguageObj = (W_Guage *)win->Data;
return WguageObj->percent;
}
/*进度条基本类消息描述表*/
BEGIN_CHILDMESSAGE_MAP(WinGuageProcMap , CW_TYPE_Guage)
ON_MESSAGE(WM_PAINT , GuageWinPaint)
ON_MESSAGE(WM_DESTROY , GuageWinDestroy)
ON_MESSAGE(WM_CREATE, GuageWinCreat)
ON_MESSAGE(WM_GuageUpdate, GuageWinSetPermillage) /*设置进度条的位置(千分比)*/
ON_MESSAGE(WM_GetPercent, GuageWinGetPercent) /*获取进度条的位置(千分比)*/
ON_MESSAGE(WM_TOUCH, GuageWinTouch)
ON_MESSAGE(WM_SetPic, GuageWinSetPic)
ON_MESSAGE(WM_KEY, GuageWinKey)
END_MESSAGE_MAP()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -