#include "DIALOG_Intern.h" /* Req. for Create indirect data structure */
#include "WIDGET.h"
#include <stdint.h>
#include "..\GUI\Include\GRAPH_Private.h"
#define DEMO_Widget_ID 0x34455854 /* DEMO_Widget */
#define DEMO_Widget_INIT_ID(p) p->DebugId = DEMO_Widget_ID
typedef struct {
WIDGET Widget//第一项必须窗口 控件WM管理器使用
GUI_COLOR aBkColor[2]//根据需要添加 本控件 的两项颜色值 分别为上图的 背景黑色 和白色
GUI_COLOR RECT_Color//上图外框的蓝色
WM_HMEM hpText//未用到
WM_HMEM ahDrawObj[1]//未用到
int size_base//中间最短一条的长度
GRAPH_PROPS Props//盗用其他控件的 颜色, 绘外框的时候使用
uint16_t Sta_MAX//控件的最大条数
uint16_t State//当前显示的 信息
#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL
int DebugId
#endif
} DEMO_Widget_Obj
GUI_HMEM Create_demowidget(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int WinFlags, int ExFlags, int Id)
void Set_demowidget_Sta(GUI_HMEM hObj,int state)
void Set_demowidget_Sta_MAX(GUI_HMEM hObj,int MAX)
void Set_demowidget_Base(GUI_HMEM hObj,int base)
下面是 .c
#include "demowidget.h"
//这个函数负责显示 控件的外观 主要是调用一下 GUI 2D 绘图函数或者 有必要的话显示文本
void _Paint(DEMO_Widget_Obj *pObj,GUI_HMEM hObj,GUI_RECT * pRectInvalid)
{
GUI_RECT RectClient
int i,size_x
GUI_RECT rClient, rInside,Rect={0,0,0,0},Rect1={0,0,0,0},Rect2={0,0,0,0}
GUI_GetClientRect(&RectClient);
rClient = RectClient
Rect=rClient
GUI_Clear()
GUI_SetBkColor(pObj->Props.aColor[1])
GUI_SetColor(pObj->Props.aColor[2])
GUI_DrawRectEx(&Rect)
GUI__ReduceRect(&Rect, &Rect, 1)
GUI_DrawRectEx(&Rect)
Rect=rClient
GUI__ReduceRect(&rClient, &rClient, 3)
LCD_SetBkColor (pObj->aBkColor[0])
LCD_SetColor (pObj->RECT_Color)
size_x=(rClient.x1-pObj->size_base+1)/2/pObj->Sta_MAX
Rect.x0=rClient.x0+pObj->Sta_MAX*size_x
Rect.x1=rClient.x1-pObj->Sta_MAX*size_x
Rect.y1=(rClient.y1/2)+rClient.y1/(pObj->Sta_MAX*2+1)/2-1
Rect.y0=(rClient.y1/2)-rClient.y1/(pObj->Sta_MAX*2+1)/2
GUI__ReduceRect(&Rect1,&Rect,0)
GUI__ReduceRect(&Rect2,&Rect,0)
GUI_DrawRectEx(&Rect)
for(i=0i<pObj->Sta_MAXi++)
{
Rect1.x0+=-size_x
Rect1.x1+=+size_x
Rect1.y0+=-rClient.y1/(pObj->Sta_MAX)/2
Rect1.y1+=-rClient.y1/(pObj->Sta_MAX)/2
Rect2.x0+=-size_x
Rect2.x1+=+size_x
Rect2.y0+=+rClient.y1/(pObj->Sta_MAX)/2
Rect2.y1+=+rClient.y1/(pObj->Sta_MAX)/2
GUI_DrawRectEx(&Rect1)
GUI_DrawRectEx(&Rect2)
}
LCD_SetColor(GUI_GREEN)
LCD_SetBkColor (pObj->aBkColor[0])
GUI__ReduceRect(&Rect1,&Rect,1)
GUI__ReduceRect(&Rect2,&Rect,1)
GUI_FillRectEx(&Rect1)
for(i=0i<pObj->Statei++)
{
LCD_SetColor((255-((255/pObj->Sta_MAX)*i)<<8)|((255/pObj->Sta_MAX*i)))
Rect1.x0+=-size_x
Rect1.x1+=+size_x
Rect1.y0+=-rClient.y1/(pObj->Sta_MAX)/2
Rect1.y1+=-rClient.y1/(pObj->Sta_MAX)/2
Rect2.x0+=-size_x
Rect2.x1+=+size_x
Rect2.y0+=+rClient.y1/(pObj->Sta_MAX)/2
Rect2.y1+=+rClient.y1/(pObj->Sta_MAX)/2
GUI_FillRectEx(&Rect1)
GUI_FillRectEx(&Rect2)
}
LCD_SetColor(pObj->aBkColor[1])
for(i<pObj->Sta_MAXi++)
{
Rect1.x0+=-size_x
Rect1.x1+=+size_x
Rect1.y0+=-rClient.y1/(pObj->Sta_MAX)/2
Rect1.y1+=-rClient.y1/(pObj->Sta_MAX)/2
Rect2.x0+=-size_x
Rect2.x1+=+size_x
Rect2.y0+=+rClient.y1/(pObj->Sta_MAX)/2
Rect2.y1+=+rClient.y1/(pObj->Sta_MAX)/2
GUI_FillRectEx(&Rect1)
GUI_FillRectEx(&Rect2)
}
}
static void _Delete(DEMO_Widget_Obj* pObj) {
GUI_ALLOC_FreePtrArray(pObj->ahDrawObj, GUI_COUNTOF(pObj->ahDrawObj))
}
void DEMO_Widget_callback(WM_MESSAGE*pMsg)
{
GUI_HMEM hObj=pMsg->hWin
DEMO_Widget_Obj * pObj
if (WIDGET_HandleActive(hObj, pMsg) == 0) {
return
}
pObj= (DEMO_Widget_Obj *)GUI_ALLOC_h2p(hObj)
switch(pMsg->MsgId)
{
case WM_PAINT://响应重绘命令,显示自己 WM管理器在需要显示的时候自动发送。
_Paint(pObj, hObj,(GUI_RECT*)pMsg->Data.p)
return
case WM_DELETE:
_Delete(pObj)
break/* No return here ... WM_DefaultProc needs to be called */
//删除控件 这里不能return 因为需要WM_DefaultProc 迭代删除子控件
}
WM_DefaultProc(pMsg)
}
GUI_HMEM Create_demowidget(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int WinFlags, int ExFlags, int Id)
{
GUI_HMEM hObj
GUI_USE_PARA(ExFlags)
/* Create the window */
WM_LOCK()
hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent, WinFlags, DEMO_Widget_callback,
sizeof(DEMO_Widget_Obj) - sizeof(WM_Obj))
//创建一个Window 小工具的灵魂, 靠它小工具才受WM管理器管理 各种WM管理器的功能才得以使用
//这里需要注意 设置了N个字节的 userdata ,userdata 和创建的Window 实际使用的内存是连续的
//
if(hObj)
{
DEMO_Widget_Obj * pObj = (DEMO_Widget_Obj *)GUI_ALLOC_h2p(hObj)
//将Window 句柄转换为DEMO_Widget_Obj 类型的指针 这里的转换关系 需要 仔细思考!
//上面提到userdata 和创建的Window 实际使用的内存是连续的 实际上 Window 实际使用的内存就是 WIDGET
//这也是为什么一开始 说 DEMO_Widget_Obj 的第一项必须是 WIDGET
WIDGET__Init(&pObj->Widget, Id, WIDGET_STATE_FOCUSSABLE)
DEMO_Widget_INIT_ID(pObj)//下面是设置一些默认属性
pObj->aBkColor[0]=GUI_BLACK
pObj->aBkColor[1]=GUI_WHITE
pObj->RECT_Color=GUI_BLUE
pObj->Sta_MAX=40
pObj->State=0
pObj->size_base=5
pObj->State=0
pObj->Props = GRAPH__DefaultProps
}
else
{
GUI_DEBUG_ERROROUT_IF(hObj==0, "DEMO_Widget_Create failed")
}
WM_UNLOCK()
return hObj
}
//下面的函数都由应用程序 运行过程中调用,
//按照格式改属性然后 使用WM_InvalidateWindow 告诉 WM管理器 控件需要重绘就OK了
void Set_demowidget_Sta(GUI_HMEM hObj,int state)
{
DEMO_Widget_Obj * pObj
if(hObj)
{
pObj= (DEMO_Widget_Obj *)GUI_ALLOC_h2p(hObj)/* Don't use use WIDGET_H2P because WIDGET_INIT_ID() has not be called at this point */
}
else
{
return
}
WM_LOCK()
if(state<=pObj->Sta_MAX)
pObj->State=state
WM_InvalidateWindow(hObj)
WM_UNLOCK()
}
void Set_demowidget_Sta_MAX(GUI_HMEM hObj,int MAX)
{
DEMO_Widget_Obj * pObj
if(hObj)
{
pObj= (DEMO_Widget_Obj *)GUI_ALLOC_h2p(hObj)/* Don't use use WIDGET_H2P because WIDGET_INIT_ID() has not be called at this point */
}
else
{
return
}
WM_LOCK()
pObj->Sta_MAX=MAX
WM_InvalidateWindow(hObj)
WM_UNLOCK()
}
void Set_demowidget_Base(GUI_HMEM hObj,int base)
{
DEMO_Widget_Obj * pObj
if(hObj)
{
pObj= (DEMO_Widget_Obj *)GUI_ALLOC_h2p(hObj)/* Don't use use WIDGET_H2P because WIDGET_INIT_ID() has not be called at this point */
}
else
{
return
}
WM_LOCK()
pObj->size_base=base
WM_InvalidateWindow(hObj)
WM_UNLOCK()
}
手机屏幕黑屏无法点亮,建议您尝试以下 *** 作:通话状态下屏幕黑屏,可擦拭下距离感应器位置,防止被遮挡,或长按电源键强制重启开机。重启后在拨号键盘输入*#*#6484#*#*进入硬件检测模式,校准距离感应器,如果您在这里只能测试不能校准,请点击右上角--辅助工具--距离感应器测试进行校准。部分机型采用了超声算法距离感应器,因此通话时晃动手机可能会导致手机黑屏,属于正常现象。
使用过程中出现黑屏,可尝试反复多次按动电源键,查看是否可以点亮屏幕;如果锁屏后再次点亮屏幕可以看到锁屏界面,但解锁后依旧黑屏,较大可能为当前正在使用的软件异常导致,可以长按电源键10S强制重启手机。
手机直接黑屏,无法进行任何 *** 作,可尝试插入充电线,充电30分钟后,重新开机看是否显示正常。若长按电源键10S以上也无任何反应,建议您申请售后或前往维修网点处理。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)