📄 button.c
字号:
/****************************************************************************/
/* */
/* Copyright (C) 2006 SHENZHEN MEIJIN CO.LTD */
/* */
/* FILE NAME: Button.c */
/* MODULE NAME: Button 控件模块 */
/* DESCRIPTION: Button 控件源程序 */
/* */
/****************************************************************************/
/* DTAE AUTHOR VERSION REMARKS */
/* =========== ========== ========= ======================================*/
/* 2006-Jan-12 Wangchengju V1.0 create */
/****************************************************************************/
//#ifdef PRJ_ED135 //low cost machine with touchpanel
#include "Kernel.h"
//#define TXTBTNGAP 3
/****************************************************************************/
/* FUNCTION: ButtonHandleEvent */
/* DESCRIPTION:MButton的消息处理函数 */
/* INPUTS: pButton : Button句柄 */
/* pEvent : 指向MEvent结构的指针 */
/* OUTPUTS: NONE */
/* RETURN: 该函数返回值根据不同的意义而不同 */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* MaYing 06-01-2001 Created initial version 1.0 */
/* Qiwei 10-25-2002 彩色控件支持 */
/****************************************************************************/
INT ButtonHandleEvent(APGUI_STRUCT_MODEL *pGui, UINT uEvent, UINT uParam)
{
MButton *pButton;
UINT8 dcDrawMode;
UINT16 wPenStyle;
UINT uIconWidth;
UINT uIconHeight;
BOOL bRetFlag;
bRetFlag = FALSE;
pButton = (MButton*)pGui;
switch( uEvent)
{
// 笔点按下消息
case EVENT_PENDOWN:
if (!((pButton->btStatus & BT_STATUS_VISIBLE)
&& (pButton->btStatus & BT_STATUS_ENABLE)))
{
break;
}
if (DotInArea(GET_PEN_X(uParam), GET_PEN_Y(uParam), pButton->nX,
pButton->nY, pButton->uWidth,pButton->uHeight))
{
MsgSend2((APGUI_STRUCT_MODEL* )pButton,EVENT_COMMAND,CM_BUTTON_PRESS);
bRetFlag = TRUE;
}
break;
case EVENT_PENUP:
if (!((pButton->btStatus & BT_STATUS_VISIBLE)
&& (pButton->btStatus & BT_STATUS_ENABLE)))
{
break;
}
if(pButton->btStatus & BT_STATUS_PENABLE)
{
MsgSend2((APGUI_STRUCT_MODEL* )pButton,EVENT_COMMAND,CM_BUTTON_RELEASE);
bRetFlag = TRUE;
}
break;
case EVENT_PENMOVE:
if (!((pButton->btStatus & BT_STATUS_VISIBLE)
&& (pButton->btStatus & BT_STATUS_ENABLE)))
{
break;
}
if (DotInArea(GET_PEN_X(uParam), GET_PEN_Y(uParam), pButton->nX,
pButton->nY, pButton->uWidth,pButton->uHeight))
{
if (pButton->btStatus & BT_STATUS_PENABLE)
{
if (!(pButton->btStatus & BT_STATUS_DOWN))
{
pButton->btStatus |= BT_STATUS_DOWN;
MsgSend2((APGUI_STRUCT_MODEL* )pButton,EVENT_DRAW,0 );
}
}
}
else
{
if (pButton->btStatus & BT_STATUS_PENABLE)
{
if (pButton->btStatus & BT_STATUS_DOWN)
{
pButton->btStatus &= ~BT_STATUS_DOWN;
MsgSend2((APGUI_STRUCT_MODEL* )pButton,EVENT_DRAW,0 );
}
}
}
bRetFlag = TRUE;
break;
case EVENT_INITIALIZE:
pButton->btStatus = (BT_STATUS_VISIBLE|BT_STATUS_ENABLE);
bRetFlag = TRUE;
break;
case EVENT_EXIT:
break;
case EVENT_DESTROY:
break;
case EVENT_DRAW:
if( pButton->btType ==BT_TYPE_TEXT )
{
if(!(pButton->btStatus & BT_STATUS_VISIBLE)){
break;
}
// 单色方式
GraphDisableRefresh();
if (pButton->btStatus & BT_STATUS_ENABLE)
{
GraphDrawBorder(pButton->nX, pButton->nY, pButton->uWidth, pButton->uHeight,
OF_BOUND_FRAME);
// 透明方式写上文本
dcDrawMode = GraphGetDrawMode( );
GraphSetDrawMode( DRMODE_TRANSPARENT);
GraphDrawAlignText(pButton->nX, pButton->nY,pButton->uWidth , pButton->uHeight ,
pButton->pButtonResId->btTextID, OF_ALIGN_CENTER);
GraphSetDrawMode( dcDrawMode);
if ((pButton->btStatus & BT_STATUS_DOWN) &&(!(pButton->btStyle &BT_NOINVERT_TEXT) ) )
{
GraphInvertRect(pButton->nX+1,pButton->nY+1, pButton->nX+pButton->uWidth-2,
pButton->nY+pButton->uHeight-2);
}
//增加一个选中状态
else if ((pButton->btStatus& BT_STATUS_ACTIVE)
&&(pButton->btStyle & BT_ACTIVE_ENABLE) )
{
wPenStyle = GraphGetPenStyle( );
GraphSetPenStyle( PS_DOT);
GraphDrawLine(pButton->nX+2, pButton->nY+2, pButton->nX+pButton->uWidth - 3, pButton->nY+2);
GraphDrawLine(pButton->nX+pButton->uWidth - 3, pButton->nY+2,pButton->nX+pButton->uWidth - 3, pButton->nY+pButton->uHeight-3);
GraphSetPenStyle( wPenStyle);
}
}
else // DISABLE状态
{
wPenStyle = GraphGetPenStyle( );
GraphSetPenStyle( PS_DOT);
GraphDrawBorder(pButton->nX, pButton->nY, pButton->uWidth, pButton->uHeight,
OF_BOUND_FRAME);
GraphSetPenStyle( wPenStyle);
dcDrawMode = GraphGetDrawMode( );
GraphSetDrawMode( DRMODE_SRCSHADOW);
GraphDrawAlignText(pButton->nX, pButton->nY,pButton->uWidth , pButton->uHeight ,
pButton->pButtonResId->btTextID, OF_ALIGN_CENTER);
//
GraphSetDrawMode( dcDrawMode);
}
GraphEnableRefresh();
}
else if(pButton->btType ==BT_TYPE_ICON)
{
INT uX,uY;
if (!(pButton->btStatus & BT_STATUS_VISIBLE))
{
break;
}
GraphDisableRefresh();
//画边框,非使能状态下画虚线
if (pButton->btStyle & BT_BORDER_ICON)
{
if (!(pButton->btStatus & BT_STATUS_ENABLE))
{
wPenStyle = GraphGetPenStyle( );
GraphSetPenStyle( PS_DOT);
}
GraphDrawBorder(pButton->nX, pButton->nY, pButton->uWidth, pButton->uHeight,
OF_BOUND_FRAME);
if (!(pButton->btStatus & BT_STATUS_ENABLE))
{
GraphSetPenStyle( wPenStyle);
}
}
//计算位置,使图片正中绘制
GraphGetIconSize(&uIconWidth, &uIconHeight,
pButton->pButtonResId->btIconID->btIconDnID);
uX = (int)(pButton->uWidth - uIconWidth) / 2;
uY = (int)(pButton->uHeight - uIconHeight) / 2;
if ((pButton->btStatus & BT_STATUS_DOWN)
&& (pButton->pButtonResId->btIconID->btIconDnID!= NULL))
{
GraphDrawIcon( pButton->nX+uX, pButton->nY+uY, 0, 0,
pButton->pButtonResId->btIconID->btIconDnID);
}
else
{
GraphDrawIcon(pButton->nX+uX, pButton->nY+uY, 0, 0,
pButton->pButtonResId->btIconID->btIconUpID);
}
//非使能状态
if (!(pButton->btStatus & BT_STATUS_ENABLE))
{
dcDrawMode = GraphGetDrawMode( );
GraphSetDrawMode( DRMODE_SRCSHADOW);
GraphClearRect(pButton->nX+uX, pButton->nY+uY,
pButton->nX+uX + uIconWidth - 1,pButton->nY+uY + uIconHeight - 1);
GraphSetDrawMode( dcDrawMode);
}
//增加一个选中状态
else if ((pButton->btStatus & BT_STATUS_ACTIVE)
&& (pButton->btStyle & BT_ACTIVE_ENABLE))
{
wPenStyle = GraphGetPenStyle( );
GraphSetPenStyle( PS_DOT);
GraphDrawLine(pButton->nX+2, pButton->nY+2, pButton->nX+pButton->uWidth - 3, pButton->nY+2);
GraphDrawLine(pButton->nX+2, pButton->nY+2, pButton->nX+2, pButton->nY+pButton->uHeight - 3);
GraphDrawLine(pButton->nX+2, pButton->nY+pButton->uHeight - 3,pButton->nX+pButton->uWidth - 3, pButton->nY+pButton->uHeight - 3);
GraphDrawLine(pButton->nX+pButton->uWidth - 3, pButton->nY+2,pButton->nX+pButton->uWidth - 3, pButton->nY+pButton->uHeight-3);
GraphSetPenStyle( wPenStyle);
}
GraphEnableRefresh();
}
bRetFlag = TRUE;
break;
case EVENT_TIMER:
if ( uParam != BT_TIMER_ID )
break; //not button timer id
if (!((pButton->btStatus & BT_STATUS_VISIBLE)
&& (pButton->btStatus & BT_STATUS_ENABLE) ))
break;
if( (pButton->btStyle & BT_REPEAT_BUTTON) && (pButton->btStatus & BT_STATUS_DOWN))
{
MsgPost((APGUI_STRUCT_MODEL* )NULL,EVENT_COMMAND, (UINT)pButton->btCommand);
}
bRetFlag = TRUE;
break;
case EVENT_COMMAND:
switch(uParam)
{
case CM_BUTTON_PRESS:
pButton->btStatus |= BT_STATUS_DOWN | BT_STATUS_PENABLE;
MsgSend2((APGUI_STRUCT_MODEL* )pButton,EVENT_DRAW,0);
if((pButton->btStatus & BT_STATUS_VISIBLE)
&& (pButton->btStatus & BT_STATUS_ENABLE))
{
MsgPost((APGUI_STRUCT_MODEL* )NULL,EVENT_BUTTONDOWN, pButton->btCommand);
bRetFlag = TRUE;
}
if((pButton->btStyle & BT_REPEAT_BUTTON)&& (pButton->btTimer==NULL)){
pButton->btTimer = TimerCreateTimer(BT_TIMER_ID,BT_TIMER_LEN);
MsgPost((APGUI_STRUCT_MODEL* )NULL,EVENT_COMMAND, (UINT)pButton->btCommand);
}
bRetFlag = TRUE;
break;
case CM_BUTTON_RELEASE:
pButton->btStatus &= ~BT_STATUS_PENABLE;
if((pButton->btStyle & BT_REPEAT_BUTTON)&& pButton->btTimer){
TimerDestroyTimer(pButton->btTimer);
pButton->btTimer = NULL;
}
if (pButton->btStatus & BT_STATUS_DOWN)
{
pButton->btStatus &= ~BT_STATUS_DOWN;
MsgSend2((APGUI_STRUCT_MODEL* )pButton, EVENT_DRAW, 0);
if(!(pButton->btStyle & BT_REPEAT_BUTTON)){
MsgPost((APGUI_STRUCT_MODEL* )NULL,EVENT_COMMAND, (UINT)pButton->btCommand);
}
}
bRetFlag = TRUE;
break;
case CM_BUTTON_ACTIVE:
if (!(pButton->btStatus & BT_STATUS_ACTIVE))
{
pButton->btStatus |= BT_STATUS_ACTIVE;
if (pButton->btStyle & BT_ACTIVE_ENABLE)
{
MsgSend2((APGUI_STRUCT_MODEL* )pButton, EVENT_DRAW, 0);
}
}
bRetFlag = TRUE;
break;
case CM_BUTTON_INACTIVE:
if (pButton->btStatus & BT_STATUS_ACTIVE)
{
pButton->btStatus &= ~BT_STATUS_ACTIVE;
if (pButton->btStyle & BT_ACTIVE_ENABLE)
{
MsgSend2((APGUI_STRUCT_MODEL* )pButton, EVENT_DRAW, 0);
}
}
bRetFlag = TRUE;
break;
default:
break;
}
break;
case EVENT_KEY:
if ((pButton->btStatus & BT_STATUS_VISIBLE)
&& (pButton->btStatus & BT_STATUS_ENABLE)
&& ( (UINT16)uParam == pButton->btShortKey))
{
if (!(pButton->btStyle & BT_REPEAT_BUTTON))
{
//按下键时要显示按下状态
pButton->btStatus |= BT_STATUS_DOWN | BT_STATUS_PENABLE;
MsgSend2((APGUI_STRUCT_MODEL* )pButton,EVENT_DRAW,0);
//发送命令消息
//MsgPost((APGUI_STRUCT_MODEL* )NULL,EVENT_COMMAND, (UINT)pButton->btCommand);
}
else
{
MsgSend2((APGUI_STRUCT_MODEL* )pButton,EVENT_COMMAND,CM_BUTTON_PRESS);
}
bRetFlag = TRUE;
}
break;
/* case EVENT_KEYREPEAT:
if (!((pButton->btStatus & BT_STATUS_VISIBLE)
&& (pButton->btStatus & BT_STATUS_ENABLE)
&& ((UINT16)uParam == pButton->btShortKey)) )
break;
//if( (pButton->btStyle & BT_REPEAT_BUTTON) && (pButton->btStatus & BT_STATUS_DOWN))
{
MsgPost((APGUI_STRUCT_MODEL* )NULL,EVENT_COMMAND, (UINT)pButton->btCommand);
}
bRetFlag = TRUE;
break;
*/
case EVENT_KEYUP:
if((pButton->btStatus & BT_STATUS_VISIBLE)
&& (pButton->btStatus & BT_STATUS_ENABLE)
&& (pButton->btStatus & BT_STATUS_PENABLE)
//&&(pButton->btStyle & BT_REPEAT_BUTTON)
&& ( (UINT16)uParam == pButton->btShortKey))
{
MsgSend2((APGUI_STRUCT_MODEL* )pButton,EVENT_COMMAND, CM_BUTTON_RELEASE);
bRetFlag = TRUE;
}
break;
default:
break;
}
if( bRetFlag) //处理返回1,否则返回0,表示未处理!
return 1;
return 0;
}
//#endif //PRJ_ED135 //low cost machine with touchpanel
/****************************************************************************/
/* FUNCTION: ButtonSetVisable */
/* DESCRIPTION:设置Button的Visable属性 */
/* INPUTS: pButton : Button句柄 */
/* isVisable : 是否设置visable属性 */
/* OUTPUTS: NONE */
/* RETURN: 该函数返回值根据不同的意义而不同 */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* Liang Ruhui 09-20-2007 Created initial version 1.0 */
/****************************************************************************/
INT ButtonSetVisable(MButton *pButton,BOOL isVisable)
{
if(!isVisable){
pButton->btStatus &= ~BT_STATUS_VISIBLE;
}
else{
pButton->btStatus |= BT_STATUS_VISIBLE;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -