STM32-EMWIN FRAMEWINコントロール(19)

EMWI

序文

フレームウィンドウは、PCアプリケーションと同様のウィンドウの外観をアプリケーションに提供します。これらのウィンドウは、周囲のフレーム、タイトルバー、およびユーザー領域で構成されます。タイトルバーの色は、ウィンドウがアクティブかどうかを示すために変化します。

1.FRAMEWINコントロールの概要

FRAMEWINコントロールの外観を図に示し
ここに画像の説明を挿入
ます。最大化、最小化、閉じるボタンなど、事前定義されたボタンをタイトルバーにアタッチすることもできます。
ここに画像の説明を挿入
ここに画像の説明を挿入
フレームウィンドウは、実際にはメインウィンドウとサブウィンドウの2種類のウィンドウで構成されています。 -window、サブウィンドウが呼び出されますクライアントウィンドウの場合、コールバック関数を処理するときにこれに注意することが重要です。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 小工具的额外数据

3.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)、メッセージMSG_CHANGE_MAIN_TEXTをバックグラウンドウィンドウWM_HBKWINに送信します。
(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()を呼び出して、frame_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()を呼び出してフレームを閉じます。
ここに画像の説明を挿入
フレームの「閉じる」、「最大化」、「最小化」ボタンをクリックして、フレームの変化を確認します

おすすめ

転載: blog.csdn.net/qq_51963216/article/details/124070274
おすすめ