俗话说万事开头难,学习一门新的知识,难的往往不是知识本身,而是如何快速上手,需要什么资料和开发环境。一旦上手后,深入的学习就相对容易些了。
本章节就起到这样的作用,主要说明初学emWin需要做的准备工作。
2.1 初学者重要提示
2.2 开发环境
2.3 emWin参考资料
2.4. emWin的调试工具emWinSPY
2.5总结
2.1 初学者重要提示
我们的第一版emWin教程已经发布2年多了,经常有初学者会反映学习emWin很长时间了,一直还没有入门,最主要的原因在于学习方法上,对于初学者来说,要优先掌握以下三点:
1、学会emWin相关资源的获取方法,做到心中有数,要不心里老是没底。
2、学习emWin模拟器的使用。利用模拟器做前期的界面调试非常方便,可以大大降低界面的设计时间。另外就是学习模拟器中配套的大量参考例子的运行方法,这些参考例子极具参考价值。
3、学习GUIBuilder和uCGUIBuilder两款界面创建小工具的使用。通过这两个小工具,使得界面创建和排版布局变得很容易,一定程度上加快了界面的创建。
掌握了这三点后,一定要做大量实例的练习,因为实战才是学好emWin的最佳捷径,待有一定基础后,使用中只需查阅手册即可。另外,初学时不要一上来就研究emWin的底层驱动接口,比较影响初学的积极性,搞得后面越来越没有兴趣去研究了。
2.2 开发环境
1、模拟器开发环境推荐使用VC6.0,其它的VS2008,VS2010,VS2013也可以,其余的VS版本未做测试。
2、IDE:支持两种IDE开发环境,MDK和IAR
(1)MDK4.7X或者MDK5.XX均可,MDK4.7X以下的版本不行,因为低版本不支持STM32F429。
(2)IAR固定使用IAR7.5版本,由于IAR向下兼容性稍差,其它版本未做支持。
3、调试器使用J ,U 或者S 均可
4、配套开发板是安的:S V6开发板,MCU是S 。
2.3 emWin参考资料
2.3.1 S官方的英文版emWin用户手册
当前版本是emWin5.34(如果官方升级了新版本,大家使用最新版本即可,手册都是向下兼容的)。
2.3.2 周立功翻译的emWin5.12中文版用户手册
虽然中文版的版本有些低,但是对于初学者来说,这个版本已经够用了。大家可以在电子论坛进行下载。待emWin入门后,要逐渐的适应英文版的手册,5.12版本的中文版已经不够用了,很多新发布的控件都没有介绍。
2.3 emWin参考资料
2.3.1 S官方的英文版emWin用户手册
当前版本是emWin5.34(如果官方升级了新版本,大家使用最新版本即可,手册都是向下兼容的)。
2.3.2 周立功翻译的emWin5.12中文版用户手册
虽然中文版的版本有些低,但是对于初学者来说,这个版本已经够用了。大家可以在电子论坛进行下载 。待emWin入门后,要逐渐的适应英文版的手册,5.12版本的中文版已经不够用了,很多新发布的控件都没有介绍。
2.3.3 emWin模拟器的下载
emWin模拟器当前版本是emWin5.32。另外注意,下载模拟器是需要用户注册了S官网的账号后才可以下载。
细心的读者会发现手册是5.34版本,但是模拟器怎么是5.32版本?这是没有问题的,因为官网没有及时更新。另外本教程模拟器的使用是以5.32版本为基础的,如果官方升级了新版,并且模拟器做了修改,我们论坛进行了备份,下载地址:http://bbs.armfly.com/read.php?tid=23481 。
2.3.4 用于STM32的emWin软件包下载
用于STM32系列芯片的emWin软件包主要存放于STM32CubeF里面,所以要下载emWin软件包就需要下载STM32CubeF(ST官网资料需要用户注册账号才可以下载)。
1、用于STM32F1xx系列的的emWin软件包存放在STM32CubeF1里面
ST官网地址链接(这是个超链接)
2、用于STM32F4xx系列的的emWin软件包存放在STM32CubeF4里面
ST官网地址链接(这是个超链接)
3、用于STM32F7xx系列的的emWin软件包存放在STM32CubeF7里面
ST官方地址链接(这是个超链接)
对于上面的三个链接地址来说,STM32CubeF都是位于相应网页的最末端:
下面以STM32CubeF4 V1.13.0为例,打开路径:STM32Cube_FW_F4_V1.13.0\Middlewares\ST\StemWin可以看到如下文件,这些文件就是emWin软件包的内容:
2.4 emWin的调试工具emWinSPY
emWinSPY是一款比较实用的emWin调试软件。
emWinSPY是从5.2x版本才开始有的,但这个版本仅支持网口调试。网口调试有些麻烦,我们不考虑这种调试方式。到了emWin5.32版本开始支持JLINK调试了,但是测试发现emWin5.32版本无法使用emWinSPY,缺少函数定义,编译后会出现如下问题:
根据以往的经验(比如emWin多点触摸功能首次发布时也是缺少函数定义,待升级了几个版本后,可以正常使用了),估计会在后面的emWin版本中将这个功能开放出来,下面是emWinSPY的显示效果:
2.5 总结
本章节就为大家讲解这么多,建议初学者花些时间对emWin的用户手册了解一下,随着以后的学习最好可以达到熟练查看这个手册的程度。
1)打开工程目录下的"Exe\GUISimulationDebug.exe"即可看到效果。(2)看完教程000~005就基本会用emWin做项目,其他章节可以需要时再参考。(1)使用GUIBuilder V5.30创建如下页面并保存为C文件FramewinDLG.c,然后添加到脱机模拟仿真平台CodeBlocks的emwin工程:
(2)用BmpCvt.exe(可在”软件/资料下载”栏目下载)将48×48的图标PNG文件转成C文件并添加到CodeBlocks工程:
(3)在生成的FramewinDLG.c文件中需要更改图标的大小为64×64:
(4)在WM_INIT_DIALOG消息中(窗口初始化时程序跑到这里)添加ICONVIEW控件的初始化代码:
......
hItem = WM_GetDialogItem(pMsg->hWin, ID_ICONVIEW_0)
ICONVIEW_SetIconAlign(hItem, ICONVIEW_IA_TOP)
ICONVIEW_SetTextColor(hItem, ICONVIEW_CI_UNSEL, GUI_BLUE)
ICONVIEW_SetTextColor(hItem, ICONVIEW_CI_SEL, GUI_GREEN)
ICONVIEW_SetFrame(hItem, GUI_COORD_X, 0)//设置图标到IconView边框的间距
ICONVIEW_SetFrame(hItem, GUI_COORD_Y, 0)
ICONVIEW_SetSpace(hItem, GUI_COORD_X, (280-64*4)/3)//设置图标和图标之间的间距
ICONVIEW_SetSpace(hItem, GUI_COORD_Y, (140-64*2)/1)
ICONVIEW_SetFont(hItem, GUI_FONT_16_1)
ICONVIEW_AddBitmapItem(hItem, &bm01, "neqee")//添加图标项
ICONVIEW_AddBitmapItem(hItem, &bm02, "SOS")
ICONVIEW_AddBitmapItem(hItem, &bm03, "Phone")
ICONVIEW_AddBitmapItem(hItem, &bm04, "Camera")
ICONVIEW_AddBitmapItem(hItem, &bm05, "Email")
ICONVIEW_AddBitmapItem(hItem, &bm06, "NoteBook")
ICONVIEW_AddBitmapItem(hItem, &bm07, "JTV")
ICONVIEW_AddBitmapItem(hItem, &bm08, "Dollar")
......
(5) WM_NOTIFY_PARENT消息中( *** 作屏幕时程序跑到这里)添加点击提示程序:
switch(ICONVIEW_GetSel(WM_GetDialogItem(pMsg->hWin, ID_ICONVIEW_0)))
{
case 0: TEXT_SetText(WM_GetDialogItem(pMsg->hWin, ID_TEXT_0), "neqee")break
case 1: TEXT_SetText(WM_GetDialogItem(pMsg->hWin, ID_TEXT_0), "SOS")break
case 2: TEXT_SetText(WM_GetDialogItem(pMsg->hWin, ID_TEXT_0), "Phone")break
case 3: TEXT_SetText(WM_GetDialogItem(pMsg->hWin, ID_TEXT_0), "Camera")break
case 4: TEXT_SetText(WM_GetDialogItem(pMsg->hWin, ID_TEXT_0), "Email")break
case 5: TEXT_SetText(WM_GetDialogItem(pMsg->hWin, ID_TEXT_0), "NoteBook")break
case 6: TEXT_SetText(WM_GetDialogItem(pMsg->hWin, ID_TEXT_0), "JTV")break
case 7: TEXT_SetText(WM_GetDialogItem(pMsg->hWin, ID_TEXT_0), "Dollar")break
//case 8: TEXT_SetText(WM_GetDialogItem(pMsg->hWin, ID_TEXT_0), "Jobbet")break
}
(6)编译运行:
复选框是选择各种不同选项的最常用控件之一。用户可选中或取消选中复选框,并且可一次选中任意个框。使用键盘界面时,被聚焦的复选框的状态可使用<SPACE>键切换。禁用的框显示为灰色,如下图所示,其中描述了每种可能的复选框的外观:
开启皮肤色后显示效果如下:
41.2 官方WIDGET_CheckBox实例
官方的这个例子做的很好,充分的演示了复选框的各个状态。这个例子在模拟器中的位置:
41.2 源代码如下(主要看WIDGET_Checkbox中的代码):
#include <stddef.h>
#include "GUI.h"
#include "DIALOG.h"
#include "Main.h"
/*********************************************************************
*
* Static data
*
**********************************************************************
*/
//
// Dialog resource
//
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {(1)
{ FRAMEWIN_CreateIndirect, "Check box sample", 0, 10, 10, 300, 220, FRAMEWIN_CF_MOVEABLE},
{ TEXT_CreateIndirect, "Enabled:", 0, 5, 10, 120, 0 },
{ CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK0, 5, 30, 120, 0 },
{ CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK1, 5, 60, 120, 0 },
{ CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK2, 5, 90, 120, 20 },
{ CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK3, 5, 125, 120, 26 },
{ TEXT_CreateIndirect, "Disabled:", 0, 150, 10, 120, 0 },
{ CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK4, 150, 30, 120, 0 },
{ CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK5, 150, 60, 120, 0 },
{ CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK6, 150, 90, 120, 26 },
{ CHECKBOX_CreateIndirect, 0, GUI_ID_CHECK7, 150, 125, 120, 26 },
{ BUTTON_CreateIndirect, "OK", GUI_ID_OK, 10, 170, 60, 20 },
{ BUTTON_CreateIndirect, "Cancel", GUI_ID_CANCEL, 225, 170, 60, 20 },
}
//
// Check box text
//
static const char * _apLabel[] = {(2)
"Default",
"3 States",
"Box XL",
"Box XXL"
}
/*********************************************************************
*
* Static code
*
**********************************************************************
*/
/*********************************************************************
*
* _cbCallback
*/
static void _cbCallback(WM_MESSAGE * pMsg) {
WM_HWIN hDlg
WM_HWIN hItem
int i
int NCode
int Id
hDlg = pMsg->hWin
switch (pMsg->MsgId) {
case WM_INIT_DIALOG:
WM_GetDialogItem(hDlg, GUI_ID_CHECK0)
for (i = 0i <8i++) {(3)
int Index = i % 4
hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK0 + i)// Get the handle of the desired checkbox
CHECKBOX_SetText(hItem, _apLabel[Index])// Set the check box text(4)
switch (Index) {
case 1:(5)
//
// Set the number of possible states to 3
//
CHECKBOX_SetNumStates(hItem, 3)(6)
//
// Use user defined bitmaps for the third state
//(7)
CHECKBOX_SetImage(hItem, &_abmBar[0], CHECKBOX_BI_INACTIV_3STATE)// Used if widget is disabled
CHECKBOX_SetImage(hItem, &_abmBar[1], CHECKBOX_BI_ACTIV_3STATE)// Used if widget is enabled
CHECKBOX_SetState(hItem, 2)(8)
break
case 2:(9)
CHECKBOX_SetState(hItem, 1)
//
// Use user defined bitmaps for the 'checked' state
//
CHECKBOX_SetImage(hItem, &_abmXL[0], CHECKBOX_BI_INACTIV_CHECKED)// Used if widget is disabled
CHECKBOX_SetImage(hItem, &_abmXL[1], CHECKBOX_BI_ACTIV_CHECKED)// Used if widget is enabled
CHECKBOX_SetFont(hItem, &GUI_FontComic18B_ASCII)
break
case 3:(10)
CHECKBOX_SetState(hItem, 1)
//
// Use user defined bitmaps for the 'checked' state
//
CHECKBOX_SetImage(hItem, &_abmXXL[0], CHECKBOX_BI_INACTIV_CHECKED)// Used if widget is disabled
CHECKBOX_SetImage(hItem, &_abmXXL[1], CHECKBOX_BI_ACTIV_CHECKED)// Used if widget is enabled
CHECKBOX_SetFont(hItem, &GUI_FontComic24B_ASCII)
break
}
//
// Disable all check boxes shown on the right side of the dialog
//
if (i >= 4) {(11)
WM_DisableWindow(hItem)
}
}
break
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc)// Id of widget
NCode = pMsg->Data.v// Notification code
switch (NCode) {
case WM_NOTIFICATION_RELEASED: // React only if released
if (Id == GUI_ID_OK) { // OK Button
GUI_EndDialog(hDlg, 0)
}
if (Id == GUI_ID_CANCEL) { // Cancel Button
GUI_EndDialog(hDlg, 1)
}
break
}
break
default:
WM_DefaultProc(pMsg)
}
}
/*********************************************************************
*
* Public code
*
**********************************************************************
*/
/*********************************************************************
*
* MainTask
*/
void MainTask(void) {
#if GUI_SUPPORT_MEMDEV
WM_SetCreateFlags(WM_CF_MEMDEV)
#endif
GUI_Init()
WM_SetDesktopColor(GUI_BLACK)
while (1) {
GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0)
GUI_Delay(500)
}
}
41.1.1 复选框支持的通知代码
以下事件是复选框控件作为WM_NOTIFY_PARENT消息的一部分发送给其父窗口的:
消息 描述
WM_NOTIFICATION_CLICKED 复选框已被点击。
WM_NOTIFICATION_RELEASED 复选框已被释放。
WM_NOTIFICATION_MOVED_OUT 复选框已被点击,且指针已移出复选框并且没有释放。
WM_NOTIFICATION_VALUE_CHANGED 复选框的状态已改变。
41.1.2 按钮支持键盘反应
如果控件具有输入焦点,则它将对下列各键做出反应:
按键 反应
GUI_KEY_SPACE 切换小工具的选中状态
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)