如何使用stemwin 控件3维效果

如何使用stemwin 控件3维效果,第1张

#include "WM.h"

#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以上也无任何反应,建议您申请售后或前往维修网点处理。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11928281.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存