📄 uibutton.c
字号:
/******************************************************************/
/* Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved. */
/*******************************************************************
File : uibutton.c
Desc : 按钮控件
Author : GUI Develop Group.lzj
Date : 2007-08-03
Notes :
$Log: uibutton.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/12 14:38:35 Lingzhaojun
no message
Revision 1.2 2007/12/10 07:16:12 Shenfuming
修改RM970的BUG单中的第31个BUG:确定,取消按钮在未选中时看不清
Revision 1.1.1.1 2007/12/01 01:30:13 Lingzhaojun
no message
Revision 1.5 2007/11/06 07:37:04 Lingzhaojun
提交gui相关改动
Revision 1.4 2007/10/15 02:58:09 Lingzhaojun
添加GUI控件注释
Revision 1.3 2007/10/08 02:04:27 Lingzhaojun
GUI添加自动注释
20070805 添加焦点处理 lzj
20070807 添加对触摸屏的支持 lzj
*********************************************************************/
#include "uibutton.h"
/*----------------------------------------------------------------------
Name : ButtonboxSetPic
Desc : 设置按钮控件的图片,包括按下去时的图片和获取到焦点后的图片
Params: wParam为图片类型
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 ButtonboxSetPic(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_Button *WButObj = (W_Button*)win->Data;
UINT16*pID = lParam;
IconType Type = wParam;
switch (Type)
{
case Icon_Button:
WButObj->IconReady.BmpID = *pID;
break;
case Icon_ButtonPress:
WButObj->IconPress.BmpID = *pID;
break;
case Icon_ButtonFocus:
WButObj->IconFocus.BmpID = *pID;
break;
}
WindowInvalidateWindow(win);
return TRUE;
}
/*----------------------------------------------------------------------
Name : ButtonboxSetTxt
Desc : 设置按钮的文本,wParam参数为文本ID
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 ButtonboxSetTxt(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_Button *WButObj = (W_Button*)win->Data;
WButObj->TxtID = wParam;
WindowInvalidateWindow(win);
return TRUE;
}
/*----------------------------------------------------------------------
Name : ButtonboxPaint
Desc : 按钮画屏消息
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 ButtonboxPaint(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_Button *WButObj = (W_Button*)win->Data;
DispMode TranspLevel = WinGetTranStyle(win->style);
ColorDesc Black = {COLOR_WHITE, COLOR_BLACK, DSPM_Transp};
WCHAR caption[100];
INT16U strPixLen, x, y, ft;
UINT32 Len;
if (!(WIN_NEEDPAIT(win)))
return TRUE;
switch (WButObj->State)
{
case ButStatePress:
//DrawPicture(WButObj->IconPress);
DrawBmpIdEx(WButObj->IconPress.X, WButObj->IconPress.Y, WButObj->IconPress.BmpID, NULL, TranspLevel);
break;
case ButStateFocus:
//DrawPicture(WButObj->IconFocus);
DrawBmpIdEx(WButObj->IconFocus.X, WButObj->IconFocus.Y, WButObj->IconFocus.BmpID, NULL, TranspLevel);
break;
case ButStateReady:
//DrawPicture(WButObj->IconReady);
DrawBmpIdEx(WButObj->IconReady.X, WButObj->IconReady.Y, WButObj->IconReady.BmpID, NULL, TranspLevel);
break;
}
if (win->style&BlackWord)
{
Len = ResApiGetStringIDString(GuiDspGetWindowResProc(win , WButObj->TxtID) , WButObj->TxtID , caption , 100);
strPixLen = MeasureStringPixLen(caption , Font12X12);
ft = (UINT16)Font12X12;
x = win->x + (win->w - strPixLen) / 2;
y = win->y + (win->h - ft) / 2;
DrawStringIdEx(x, y, win->w, WButObj->TxtID, Font12X12, &Black, 0);
}
else
{
TxtBox(win, WButObj->TxtID, Font12X12, CenterStyle);
}
WIN_CLEARPAIT(win);
return TRUE;
}
/*----------------------------------------------------------------------
Name : ButtonboxKey
Desc : 按钮按键消息,发送给上级窗口以command
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 ButtonboxKey(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_Button *WButObj = (W_Button*)win->Data;
UINT16 keyPress = (UINT16)((wParam) >> 16);
UINT16 KEY_EV = (UINT16)(wParam);
if (keyPress)
return FALSE;
if (KEY_EV == WButObj->Shortcutkey) //该按钮的快捷键
return WinSendCommand(win, WButObj->Event);
switch (KEY_EV)
{
case KE_PLAY_RELEASE:
case KE_MENU_RELEASE:
if (WButObj->State == ButStateFocus) //按钮是否聚焦
return WinSendCommand(win, WButObj->Event);
default:
return WindowSendMessage(win->Parent, WM_KEY, wParam, lParam);
}
return TRUE;
}
/*----------------------------------------------------------------------
Name : ButtonboxTouch
Desc : 按钮触摸按键消息,发送给上级窗口以command
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
INT32U ButtonboxTouch(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_Button *WButObj = (W_Button*)win->Data;
if (wParam == TM_STATE_DOWN)
{
WButObj->State = ButStatePress;
}
else if (wParam == TM_STATE_UP)
{
WButObj->State = ButStateFocus;
WinSendCommand(win, WButObj->Event);
}
WindowInvalidateWindow(win);
return TRUE;
}
/*----------------------------------------------------------------------
Name : ButtonboxSetFocus
Desc : 按钮聚焦,更新图片
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 ButtonboxSetFocus(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_Button *WButObj = (W_Button*)win->Data;
WButObj->State = ButStateFocus;
WindowInvalidateWindow(win);
return TRUE;
return FALSE;
}
/*----------------------------------------------------------------------
Name : ButtonboxLostFocus
Desc : 按钮失去焦点,更新按钮图片
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 ButtonboxLostFocus(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_Button *WButObj = (W_Button*)win->Data;
WButObj->State = ButStateReady;
WindowInvalidateWindow(win);
return TRUE;
}
/*----------------------------------------------------------------------
Name : ButtonboxRegistEvent
Desc : 注册该按钮所要触发的事件,当按钮按下时,该事件会被发送到父窗口
Params: wParam:按钮的快捷键
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 ButtonboxRegistEvent(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_Button *WButObj = (W_Button*)win->Data;
WButObj->Shortcutkey = wParam;
return TRUE;
}
/*----------------------------------------------------------------------
Name : PictureboxCreat
Desc : 按钮创建
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 ButtonboxCreat(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_Button *WButObj = NULL;
WButObj = MallocClass(W_Button);
if (WButObj)
{
WButObj->IconReady.BmpID = win->BmpID; /*按钮普通状态图片*/
WButObj->IconPress.BmpID = win->BmpID + 1; /*按钮按住时的图片*/
WButObj->IconFocus.BmpID = win->BmpID + 2; /*按钮获取到焦点后的图片*/
WButObj->TxtID = win->CaptionID; /*按钮的文本*/
WButObj->State = ButStateReady; /*按钮的状态*/
WButObj->IconFocus.X = win->x;
WButObj->IconFocus.Y = win->y;
WButObj->IconPress.X = win->x;
WButObj->IconPress.Y = win->y;
WButObj->IconReady.X = win->x;
WButObj->IconReady.Y = win->y;
WButObj->Event = EV_ButtonPress; /*按钮注册的事件,按钮被激活后将该事件发送给父窗口*/
WButObj->Shortcutkey = EV_EmptyKey; /*注册的快捷键,该键按下去后按钮有效*/
win->style |= WS_TOUCHUP;
win->Data = WButObj;
}
return TRUE;
}
/*----------------------------------------------------------------------
Name : ButtonboxDestroy
Desc : 按钮窗口关闭
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 ButtonboxDestroy(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_Button *WButObj = (W_Button*)win->Data;
FreeClass(WButObj);
return TRUE;
}
/*图片框消息描述表*/
BEGIN_CHILDMESSAGE_MAP(WinButtonboxProcMap , CW_TYPE_Button) //CW_TYPE_USER
ON_MESSAGE(WM_PAINT , ButtonboxPaint)
ON_MESSAGE(WM_DESTROY , ButtonboxDestroy)
ON_MESSAGE(WM_CREATE, ButtonboxCreat)
ON_MESSAGE(WM_KEY, ButtonboxKey)
ON_MESSAGE(WM_SetPic, ButtonboxSetPic)
ON_MESSAGE(WM_SetTxt, ButtonboxSetTxt)
ON_MESSAGE(WM_TOUCH , ButtonboxTouch)
ON_MESSAGE(WM_SETFOCUS, ButtonboxSetFocus)
ON_MESSAGE(WM_KILLFOCUS, ButtonboxLostFocus)
ON_MESSAGE(WM_ButtonRegEvent, ButtonboxRegistEvent)
END_MESSAGE_MAP() // MUST BE NULL --USE WINDEFPROC.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -