⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 button.c

📁 好记星的控件,包括button,list,对文件操作
💻 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 + -