求教学习emwin的方法

求教学习emwin的方法,第1张

初学emWin的准备工作及其快速上手

俗话说万事开头难,学习一门新的知识,难的往往不是知识本身,而是如何快速上手,需要什么资料和开发环境。一旦上手后,深入的学习就相对容易些了。

本章节就起到这样的作用,主要说明初学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 切换小工具的选中状态


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8086749.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存