当前位置: 代码迷 >> 综合 >> STM32——EMWIN FRAMEWIN 控件(十九)
  详细解决方案

STM32——EMWIN FRAMEWIN 控件(十九)

热度:38   发布时间:2023-11-21 19:09:23.0

EMWIN

文章目录

  • EMWIN
  • 前言
  • 一、 FRAMEWIN 控件简介
  • 二、 FRAMEWIN 控件 API 函数
  • 三、FRAMEWIN 控件演示例程

前言

框架窗口为我们的应用提供一个 类似 PC 应用程序的窗口外观,这些窗口由周围框架、标题栏和用户区组成,标题栏的颜色改变以显示窗口是否激活。

一、 FRAMEWIN 控件简介

FRAMEWIN 控件的外观如图所示:
在这里插入图片描述
我们也可以将预定义的按钮附加到标题栏中,比如最大化、最小化和关闭按钮
在这里插入图片描述
在这里插入图片描述
框架窗口实际上由 2 种窗口组成:主窗口和子窗口,子窗口称为客户端窗口,处理回调函数时意识到此点非常重要:存在具有 2 种不同回调函数的 2 种窗口。创建子窗口时,这些子窗口通常作为客户端窗口的子窗口而创建;它们的父窗口因此是客户端窗口。
在这里插入图片描述

二、 FRAMEWIN 控件 API 函数

FRAMEWIN_AddButton() 在标题栏中添加一个按钮。
FRAMEWIN_AddCloseButton() 在标题栏中添加一个“关闭”按钮。
FRAMEWIN_AddMaxButton() 在标题栏中添加一个“最大化”按钮。
FRAMEWIN_AddMenu() 向框架窗口添加一个“菜单”按钮。
FRAMEWIN_AddMinButton() 在标题栏中添加一个“最小化”按钮。
FRAMEWIN_Create() 创建一个 FRAMEWIN 小工具。
FRAMEWIN_CreateAsChild() 创建一个 FRAMEWIN 小工具作为子窗口。
FRAMEWIN_CreateEx() 创建一个 FRAMEWIN 小工具。
FRAMEWIN_CreateIndirect() 从资源表项创建 FRAMEWIN 小工具。
FRAMEWIN_CreateUser()
使用额外字节作为用户数据创建一个 FRAMEWIN 小
工具
FRAMEWIN_GetActive() 返回框架窗口是否处于激活状态。
FRAMEWIN_GetBarColor() 返回标题栏的颜色。
FRAMEWIN_GetBorderSize() 返回边框的尺寸。
FRAMEWIN_GetDefaultBarColor() 返回标题栏的默认颜色。
FRAMEWIN_GetDefaultBorderSize() 返回默认的边框尺寸。
FRAMEWIN_GetDefaultClientColor() 返回客户区的默认颜色。
FRAMEWIN_GetDefaultFont() 返回标题栏使用的默认字体
FRAMEWIN_GetDefaultTextColor() 返回标题的默认文本颜色。
FRAMEWIN_GetDefaultTitleHeight() 返回标题栏的默认尺寸。
FRAMEWIN_GetFont() 返回标题文本所用的字体。
FRAMEWIN_GetText() 返回标题文本。
FRAMEWIN_GetTextAlign() 返回标题文本的对齐方式。
FRAMEWIN_GetTitleHeight() 返回标题栏的高度。
FRAMEWIN_GetUserData() 检索用 FRAMEWIN_SetUserData()设置的数据。
FRAMEWIN_IsMinimized() 返回表示框架窗口是否最小化的值。
FRAMEWIN_IsMaximized() 返回表示框架窗口是否最大化的值。
FRAMEWIN_Maximize() 将框架窗口放大到父窗口的尺寸。
FRAMEWIN_Minimize() 隐藏框架窗口的客户区。
FRAMEWIN_OwnerDraw() 用于绘制标题栏的默认函数。
FRAMEWIN_Restore() 恢复最小化或最大化的框架窗口。
FRAMEWIN_SetActive() 设置框架窗口的状态。(弃用)
FRAMEWIN_SetBarColor() 设置标题栏的颜色。
FRAMEWIN_SetBorderSize() 设置框架窗口的边框尺寸。
FRAMEWIN_SetClientColor() 设置客户区的颜色。
FRAMEWIN_SetDefaultBarColor() 设置标题栏的默认颜色。
FRAMEWIN_SetDefaultBorderSize() 设置默认的边框尺寸。
FRAMEWIN_SetDefaultClientColor() 设置客户区的默认颜色。
FRAMEWIN_SetDefaultFont() 设置标题栏使用的默认字体。
FRAMEWIN_SetDefaultTextColor() 设置标题的默认文本颜色。
FRAMEWIN_SetDefaultTitleHeight() 设置标题栏的默认高度。
FRAMEWIN_SetFont() 选择标题文本所用的字体。
FRAMEWIN_SetMoveable() 将框架窗口设置为可移动/不可移动状态。
FRAMEWIN_SetOwnerDraw() 启用要自画的框架窗口。
FRAMEWIN_SetResizeable() 将框架窗口设置为可缩放状态。
FRAMEWIN_SetText() 设置标题文本。
FRAMEWIN_SetTextAlign() 设置标题文本的对齐方式。
FRAMEWIN_SetTextColor() 设置标题文本的颜色。
FRAMEWIN_SetTextColorEx() 设置标题文本的颜色。
FRAMEWIN_SetTitleHeight() 设置标题栏的高度。
FRAMEWIN_SetTitleVis() 设置标题栏的可见性标记。
FRAMEWIN_SetUserData() 设置 FRAMEWIN 小工具的额外数据

三、FRAMEWIN 控件演示例程

#include "myframewin.h"
#include "GUI.h"
#include "FRAMEWIN.h"
#include "string.h"
#define SPEED 1200
#define MSG_CHANGE_MAIN_TEXT (WM_USER+0) (1)
static FRAMEWIN_Handle hFrame;
static WM_CALLBACK* _pcbOldFrame;
static char _acMainText[100];
static int LockClose=1;
//改变背景窗口中显示的字符
static void _ChangeMainText(char* pStr,int Delay) (2)
{
    
WM_MESSAGE Message;
Message.MsgId=MSG_CHANGE_MAIN_TEXT; (3)
Message.Data.p=pStr;
GUI_Delay(Delay);
WM_SendMessage(WM_HBKWIN,&Message); (4)
WM_InvalidateWindow(WM_HBKWIN);
GUI_Delay(Delay/3);
}
//子窗口回调函数
static void _cbChild(WM_MESSAGE *pMsg) (5)
{
    
WM_HWIN hWin=(FRAMEWIN_Handle)(pMsg->hWin);
switch(pMsg->MsgId)
{
    
case WM_PAINT:
GUI_SetBkColor(GUI_WHITE);
GUI_SetColor(GUI_BLACK);
GUI_SetFont(&GUI_FontComic24B_ASCII);
GUI_SetTextAlign(GUI_TA_HCENTER|GUI_TA_VCENTER);
GUI_Clear();
GUI_DispStringHCenterAt("Clientwindow",WM_GetWindowSizeX(hWin)/2,\
WM_GetWindowSizeY(hWin)/2);
break;
default:
WM_DefaultProc(pMsg);
} }
//FrameWin 控件回调函数
static void _cbFrame(WM_MESSAGE *pMsg) (6)
{
    
switch(pMsg->MsgId)
{
    
case WM_NOTIFY_PARENT:
if(pMsg->Data.v==WM_NOTIFICATION_RELEASED)
{
    
int Id=WM_GetId(pMsg->hWinSrc);
if(Id==GUI_ID_CLOSE) (7)
{
    
if(_LockClose) return; (8)
_hFrame = 0;` } }
break;
}
if(_pcbOldFrame) (*_pcbOldFrame)(pMsg);
}
//背景窗口 WM_HBKWIN 回调函数
static void _cbBkWindow(WM_MESSAGE* pMsg)
{
    
switch(pMsg->MsgId)
{
    
case MSG_CHANGE_MAIN_TEXT: (9)
strcpy(_acMainText,pMsg->Data.p); (10)
WM_InvalidateWindow(pMsg->hWin); (11)
break;
case WM_PAINT:
GUI_SetBkColor(GUI_BLACK);
GUI_Clear();
GUI_SetColor(GUI_WHITE);
GUI_SetFont(&GUI_Font24_ASCII);
GUI_DispStringHCenterAt("WIDGET_FrameWin - Sample",160,5);
GUI_SetFont(&GUI_Font8x16);
GUI_DispStringHCenterAt(_acMainText,160,40); (12)
GUI_SetFont(&GUI_Font6x8);
GUI_DispStringHCenterAt("The function FRAMEWIN_Create creates both the\n""frame window and the client window.", 160, 190);
break;
default:
WM_DefaultProc(pMsg);
} }
static void _DemoFramewin(void)
{
    
int i;
char acInfoText[]="-- sec to play with window";
WM_HWIN hChild;
//为背景设置回调函数
WM_SetCallback(WM_HBKWIN,_cbBkWindow);
//创建一个框架窗口
_ChangeMainText("FRAMEWIN_Create",SPEED);
_hFrame = FRAMEWIN_Create("Frame window",0,WM_CF_SHOW,30,60,260,125);
FRAMEWIN_SetTitleHeight(_hFrame,20);
FRAMEWIN_SetFont(_hFrame,&GUI_Font16B_ASCII);
//为框架窗口设置回调函数
_pcbOldFrame=WM_SetCallback(_hFrame,_cbFrame);
//获取子窗口的句柄
hChild=WM_GetClientWindow(_hFrame);
//设置子窗口的回调函数
WM_SetCallback(hChild,_cbChild);
//设置框架窗口为可移动的
FRAMEWIN_SetMoveable(_hFrame,1);
//给框架窗口创建几个按钮
FRAMEWIN_AddCloseButton(_hFrame,FRAMEWIN_BUTTON_RIGHT,0);
FRAMEWIN_AddMaxButton(_hFrame,FRAMEWIN_BUTTON_RIGHT,2);
FRAMEWIN_AddMinButton(_hFrame,FRAMEWIN_BUTTON_RIGHT,2);
//修改框架窗口的属性
_ChangeMainText("FRAMEWIN_SetActive",SPEED); (13)
FRAMEWIN_SetActive(_hFrame,1); (14)
_ChangeMainText("FRAMEWIN_SetFont",SPEED);
FRAMEWIN_SetFont(_hFrame,&GUI_Font24_ASCII); (15)
FRAMEWIN_SetTitleHeight(_hFrame,25); (16)
_ChangeMainText("FRAMEWIN_SetTextColor",SPEED);
FRAMEWIN_SetTextColor(_hFrame,GUI_YELLOW); (17)
_ChangeMainText("FRAMEWIN_SetTextAlign",SPEED);
FRAMEWIN_SetTextAlign(_hFrame,GUI_TA_HCENTER); (18)
_ChangeMainText("FRAMEWIN_Minimize",SPEED);
FRAMEWIN_Minimize(_hFrame); (19)
_ChangeMainText("FRAMEWIN_Maxmize",SPEED);
FRAMEWIN_Maximize(_hFrame); (20)
_ChangeMainText("FRAMEWIN_Restore",SPEED);
FRAMEWIN_Restore(_hFrame);
_ChangeMainText("FRAMEWIN_SetTitleVis",SPEED); (21)
for(i=0;i<5;i++)
{
    
FRAMEWIN_SetTitleVis(_hFrame,0); (22)
GUI_Delay(200);
FRAMEWIN_SetTitleVis(_hFrame,1); (23)
GUI_Delay(200);
}
_LockClose=0;
for(i=250;(i>0)&& _hFrame;i--) {
    
acInfoText[0]='0'+((i+9)/100);
acInfoText[1]='0'+(((i+9)/10)%10);
_ChangeMainText(acInfoText,0);
GUI_Delay(100);
}
if(_hFrame) (24) {
    
_ChangeMainText("FRAMEWIN_Delete",SPEED);
FRAMEWIN_Delete(_hFrame); (25)
}else
{
    
_ChangeMainText("",50);
} }
void FrameWin_Demo(void)
{
    
WM_EnableMemdev(WM_HBKWIN);
while(1)
{
    
_DemoFramewin();
} }

(1)、MSG_CHANGE_MAIN_TEXT 为用户自定义消息,用于改变要显示的字符串。
(2)、函数_ChangeMainText()主要是组建消息 MSG_CHANGE_MAIN_TEXT,并且将其发
送给背景窗口 WM_HBKWIN。
(3)、消息ID为MSG_CHANGE_MAIN_TEXT,并且将要传递的消息的首地址传递给Data.p。
(4)、向背景窗口 WM_HBKWIN 发送消息 MSG_CHANGE_MAIN_TEXT。
(5)、FrameWin 控件子窗口的回调函数。
(6)、FrameWin 控件回调函数。
(7)、点击了 FrameWin 的“关闭”按钮。
(8)、如果 FrameWin 已经关闭了的话就直接返回,否则的话将_hFrame 置 0,标记框架已经关闭了。
(9)、背景窗口 WM_HBKWIN 收到消息 MSG_CHANGE_MAIN_TEXT。
(10)、将消息 MSG_CHANGE_MAIN_TEXT 中要显示的字符串拷贝到数组_acMainText中。
(11)、使目标窗口无效化,这里也就是 WM_HBKWIN。
(12)、显示数组_acMainText 中的字符串。
(13)、调用函数_ChangeMainText(),目的就是在背景窗口中显示指定的字符串。
(14)、调用函数 FRAMEWIN_SetActive()激活框架_hFrame。
(15)、调用函数 FRAMEWIN_SetFont()设置_hFrame 的字体为 GUI_Font24_ASCII。
(16)、调用函数 FRAMEWIN_SetTitleHeight()设置框架标题栏的高度为 25。
(17)、调用函数 FRAMEWIN_SetTextColor()设置框架的文本颜色为 GUI_YELLOW。
(18)、调用函数 FRAMEWIN_SetTextAlign()设置框架文本的对齐方式。
(19)、调用函数 FRAMEWIN_Minimize()设置框架最小化。
(20)、调用函数 FRAMEWIN_Maximize()设置框架最大化。
(21)、调用函数 FRAMEWIN_Restore()恢复到原来的尺寸和位置。
(22)、调用函数 FRAMEWIN_SetTitleVis()设置框架标题栏不可见。
(23)、调用函数 FRAMEWIN_SetTitleVis()设置框架标题栏可见。
(24)、如果_hFrame 为 1 的话说明没有框架,那么在这里就删除掉框架窗口。
(25)、调用函数 FRAMEWIN_Delete()关闭框架。
在这里插入图片描述
点击框架中的“关闭”,“最大化”和“最小化”按钮来观察框架的变化