📄 uimenuw.c
字号:
/******************************************************************/
/* Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved. */
/*******************************************************************
File : uimenuw.c
Desc : 菜单类窗口
Author : GUI Develop Group.lzj
Date : 2007-08-10
Notes :
$Log: uimenuw.c,v $
Revision 1.2 2008/06/19 04:43:21 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.10 2007/10/30 12:05:10 Lingzhaojun
修改按键映射
Revision 1.9 2007/10/15 02:58:09 Lingzhaojun
添加GUI控件注释
Revision 1.8 2007/10/09 01:05:11 Zhaojun
no message
Revision 1.7 2007/10/08 04:02:23 Lingzhaojun
去除GUI的VC编译警告
Revision 1.6 2007/10/08 02:04:27 Lingzhaojun
GUI添加自动注释
20070903 lzj 增加动态修改菜单的消息
20070904 lzj 增加对资源管理器型菜单(菜单内容不是ID)的支持
20070911 Lingzj 增加对资源管理器型,文件列表型的支持
20070911 Lingzj 支持unicode,char型菜单条显示,
20070912 Lingzj 增加菜单删除功能
*********************************************************************/
#include "uimenuw.h"
#include "uilistw.h"
#include "uiscrollbar.h"
/*----------------------------------------------------------------------
Name : MenuWinAddItem
Desc : 菜单类添加菜单条目
Params: wParam 添加的条目数,lParam 添加的条目
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 MenuWinAddItem(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_MENU *WmenuObj = (W_MENU *)win->Data;
UINT32 i;
UINT32 number = wParam;
MenuItem*Menu = NULL;
FileListItem *FileList = NULL;
if (win->style&WES_MenuFileList) //文件列表,资源管理器型菜单,文字使用char显示
{
UINT32 *p = NULL;
WCHAR *Q = NULL;
UINT16 len, i = 0;
FileList = (FileListItem*)lParam;
for (i = 0;i < number;i++)
{
if (win->style&WES_Unicode) //unicode
{
len = GetUnicodeLen((WCHAR*)FileList->pText);
p = MALLOC(sizeof(FileListItem) + (len + 1) * 2);
Q = Unicodestrcat((WCHAR*)(p + sizeof(FileListItem)), (WCHAR*)(FileList->pText));
*Q = 0x0a;
*(Q--) = 0x0d;
}
else
{
len = RKstrlen((char*)FileList->pText) + 1;
p = MALLOC(sizeof(FileListItem) + len);
memcpy8((UINT8*)(p + sizeof(FileListItem)), (UINT8*)(FileList->pText), len);
}
//FileList->pText=p+sizeof(FileListItem);
memcpy(p, FileList, sizeof(FileListItem));
((FileListItem*)p)->pText = p + sizeof(FileListItem);
FileList++;
ListAddItem(WmenuObj->MenuList, (FileListItem*)p);
}
WmenuObj->CurrItem = (FileListItem*)ListGetItem(WmenuObj->MenuList, 0);
}
else
{ //普通菜单,文字使用ID显示
for (i = 0;i < number;i++)
{
Menu = MALLOC(sizeof(MenuItem));
if (!Menu)return FALSE;
memcpy(Menu, (MenuItem*)lParam, (sizeof(MenuItem)));
ListAddItem(WmenuObj->MenuList, Menu);
((MenuItem*)lParam)++;
}
WmenuObj->CurrItem = (MenuItem*)ListGetItem(WmenuObj->MenuList, 0);
}
WmenuObj->MaxItemIndex = WmenuObj->MaxItemIndex + number;
WindowInvalidateWindow(win);
return TRUE;
}
/*----------------------------------------------------------------------
Name : MenuWinDeleteItem
Desc : 菜单类删除一个条目内容
Params: wParam: 条目Index,从0开始
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 MenuWinDeleteItem(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_MENU *WmenuObj = (W_MENU *)win->Data;
UINT16 Index = wParam;
ListDeleteItem(WmenuObj->MenuList, Index);
WmenuObj->MaxItemIndex--;
WindowInvalidateWindow(win);
return TRUE;
}
/*----------------------------------------------------------------------
Name : MenuWinChangeItem
Desc : 菜单类改变菜单一个条目内容
Params: wParam: 条目Index lParam:新的内容
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 MenuWinChangeItem(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_MENU *WmenuObj = (W_MENU *)win->Data;
UINT16 Index = wParam;
MenuItem*Menu = (MenuItem*)lParam;
MenuItem *OldItem = NULL;
FileListItem *FileItem = (FileListItem*)lParam;
FileListItem *OldFile = NULL;
if (win->style&WES_MenuFileList) //资源管理器,文件列表型
{
UINT32 *p = NULL;
WCHAR *Q = NULL;
UINT16 len;
ListDeleteItem(WmenuObj->MenuList, Index);
if (win->style&WES_Unicode) //unicode
{
len = GetUnicodeLen((WCHAR*)FileItem->pText);
p = MALLOC(sizeof(FileListItem) + (len + 1) * 2);
Q = Unicodestrcat((WCHAR*)(p + sizeof(FileListItem)), (WCHAR*)FileItem->pText);
*Q = 0x0a;
*(Q--) = 0x0d;
}
else
{
len = RKstrlen((char*)FileItem->pText);
p = MALLOC(sizeof(FileListItem) + len + 2);
memcpy8((UINT8*)(p + sizeof(FileListItem)), (UINT8*)FileItem->pText, len);
}
//FileItem->pText=p+sizeof(FileListItem);
memcpy(p, FileItem, sizeof(FileListItem));
((FileListItem*)p)->pText = p + sizeof(FileListItem);
ListInsertItem(WmenuObj->MenuList, p, Index);
}
/*
if(win->style&WES_MenuFileList) //资源管理器,文件列表型
{
OldFile=(FileListItem*)ListGetItem(WmenuObj->MenuList,Index);
OldFile->ICON=FileItem->ICON;
OldFile->pText=FileItem->pText;
}*/
else
{ //普通型
OldItem = (MenuItem*)ListGetItem(WmenuObj->MenuList, Index);
OldItem->ICON = Menu->ICON;
OldItem->Text = Menu->Text;
}
WindowInvalidateWindow(win);
return TRUE;
}
/*----------------------------------------------------------------------
Name : MenuWinGetMaxItem
Desc : 菜单窗获取Item总数目
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 MenuWinGetMaxItem(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_MENU *WMenuObj = (W_MENU *)win->Data;
return WMenuObj->MaxItemIndex;
}
/*----------------------------------------------------------------------
Name : ListWinDeleteAll
Desc : 窗口删除所有Item
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 MenuWinDeleteAll(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_MENU *WMenuObj = (W_MENU *)win->Data;
UINT16 Index = wParam;
for (Index = 1;Index <= WMenuObj->MaxItemIndex;Index++)
{
ListDeleteItem(WMenuObj->MenuList, 0);
}
WMenuObj->MaxItemIndex = 0;
WindowInvalidateWindow(win);
return TRUE;
}
/*----------------------------------------------------------------------
Name : MenuWinKey
Desc : 菜单类对按键消息的响应
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 MenuWinKey(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_MENU *WmenuObj = (W_MENU *)win->Data;
UINT16 keyPress = (INT16U)((wParam) >> 16);
UINT16 KEY_EV = (INT16U)(wParam);
if (keyPress)
return FALSE;
switch (KEY_EV)
{
case KE_DN_RELEASE:
case KE_NEXT_RELEASE:
case KE_DN_LONGP:
case KE_NEXT_LONGP:
if (WmenuObj->CurrItemIndex < WmenuObj->MaxItemIndex - 1)
{
WmenuObj->CurrItemIndex++;
if (WmenuObj->CurrItemDispLine < WmenuObj->WinFullLine)
WmenuObj->CurrItemDispLine++;
}
else
{
WmenuObj->CurrItemIndex = 0;
WmenuObj->CurrItemDispLine = 1;
}
if (win->style&WES_MenuWithScroll)
WinSendCommand(win, EV_ScrollSet);
WindowInvalidateWindow(win);
break;
case KE_PREV_RELEASE:
case KE_UP_RELEASE:
case KE_UP_LONGP:
case KE_PREV_LONGP:
if (WmenuObj->CurrItemIndex > 0)
{
WmenuObj->CurrItemIndex--;
if (WmenuObj->CurrItemDispLine > 1)
WmenuObj->CurrItemDispLine--;
}
else
{
WmenuObj->CurrItemIndex = WmenuObj->MaxItemIndex - 1;
WmenuObj->CurrItemDispLine = MinAB(WmenuObj->WinFullLine, WmenuObj->MaxItemIndex);
}
if (win->style&WES_MenuWithScroll)
WinSendCommand(win, EV_ScrollSet);
WindowInvalidateWindow(win);
break;
case KE_PLAY_RELEASE:
WinSendCommand(win, EV_MenuSelect);
break;
case KE_RETURN_RELEASE:
case KE_EXIT_RELEASE:
WindowDestroy(win);
break;
default:
break;
}
/*向窗口发送command消息,交付用户处理*/
//return WinSendCommand(win, KEY_EV);
return TRUE;
}
/*----------------------------------------------------------------------
Name : MenuWinTouch
Desc : 菜单类对触摸屏的响应
Params:
Return: 处理结果
Author: Lingzj
Date : 070830
----------------------------------------------------------------------*/
UINT32 MenuWinTouch(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
W_MENU *WmenuObj = (W_MENU *)win->Data;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -