minigui[基础篇][5]—— 控件与控件类

1.控件与控件类

控件

1.控件是主窗口的子窗口
2.这些子窗口的行为和主窗口一样,既能够接收键盘和鼠标等外部输入,也可以在自己的区域内进行输出――只是它们的所有活动被限制在主窗口中
3.控件也可以有子窗口

控件类

1.某个控件类创建控件之后,所有属于这个控件类的控件均会具有相同的行为和外观
2.用户自定义控件类(需要注册) 和 系统预定义控件类
3.控件是控件类的实例

系统预定义控件类

控件类类名称宏定义
静态框“static”CTRL_STATIC
按钮“button”CTRL_BUTTON
列表框“listbox”CTRL_LISTBOX
单行编辑框“sledit”CTRL_SLEDIT
多行编辑框“mledit”CTRL_MLEDIT
文本编辑框“textedit”CTRL_TEXTEDIT
组合框“combobox”CTRL_COMBOBOX
菜单按钮“menubutton”CTRL_MENUBUTTON
进度条“progressbar”CTRL_PROPRESSBAR
滑块“trackbar”CTRL_TRACKBAR
工具栏“newtoolbar”CTRL_NEWRTOOLBAR
属性表“propsheet”CTRL_PROPSHEET
滚动窗口控件“ScrollWnd”CTRL_SCROLLWND
滚动型控件“ScrollView”CTRL_SCROLLVIEW
树形控件“treeview”CTRL_TREEVIEW
列表型控件“listview”CTRL_LISTVIEW
月历“MonthCalendar”CTRL_MONTHCALENDAR
旋钮控件“SpinBox”CTRL_SPINBOX
酷工具栏“CoolBar”CTRL_COOLBAR
动画控件“Animation”CTRL_ANIMATION
网格控件“gridview”CTRL_GRIDVIEW
图标型控件“IconView”CTRL_ICONVIEW
滚动条控件“ScrollBar”CTRL_SCROLLBAR

2.创建预定义控件类的demo

在这里插入图片描述

#define IDC_STATIC1 100   //不同控件的id  子控件id在同一个父窗口需要不一样
#define IDC_STATIC2 150
#define IDC_BUTTON1 110
#define IDC_BUTTON2 120
#define IDC_EDIT1 130
#define IDC_EDIT2 140

//父对象是子窗口
hStaticWnd1 = CreateWindow (CTRL_STATIC,"This is a static control",WS_CHILD | SS_NOTIFY | SS_SIMPLE | WS_VISIBLE | WS_BORDER,IDC_STATIC1,10, 10, 180, 300, hWnd, 0);

/* 在 hStaticWnd1 中创建两个按钮控件 */
hButton1 = CreateWindow (CTRL_BUTTON,"Button1",WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE,
IDC_BUTTON1,20, 20, 80, 20, hStaticWnd1, 0);

hButton2 = CreateWindow (CTRL_BUTTON,"Button2",WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE,
IDC_BUTTON2,20, 50, 80, 20, hStaticWnd1, 0);

/* 在 hStaticWnd1 中创建一个编辑框控件 */
hEdit1 = CreateWindow (CTRL_EDIT,"Edit Box 1",WS_CHILD | WS_VISIBLE | WS_BORDER,
IDC_EDIT1,20, 80, 100, 24, hStaticWnd1, 0);

/* 在 hStaticWnd1 中创建一个静态框 hStaticWnd2 */
hStaticWnd2 = CreateWindow (CTRL_STATIC,"This is child static control",WS_CHILD | SS_NOTIFY | SS_SIMPLE | WS_VISIBLE | WS_BORDER,IDC_STATIC1,20, 110, 100, 50, hStaticWnd1, 0);
/* 在 hStaticWnd2 中创建一个编辑框 hEdit2,这时,hEdit2 是 hStaticWnd1 的孙窗口 */
hEdit2 = CreateWindow (CTRL_EDIT,"Edit Box 2",WS_CHILD | WS_VISIBLE | WS_BORDER,
IDC_EDIT2,0, 20, 100, 24, hStaticWnd2, 0);

3.子控件的通知消息

1.控件内部发生某种事件时,会通过通知消息通知其父窗口
2.针对控件的通知消息处理引入了 SetNotificationCallback 函数,该函数可以为控件设置一个通知消息的回调函数。当控件有通知消息时,将调用该函数,而不是发送通知消息到父窗口。新的应用程序应尽量使用这个函数来处理控件的通知消息

方式1:通过主窗口的MSG_COMMAND消息进行处理

switch (message) {
    case MSG_COMMAND:
        {
            int id = LOWORD(wParam);   //wParam = nc(某个子控件通知码) id(某个子控件id号)
            int nc = HIWORD(wParam);
            if (id == ID_MYEDIT && nc == EN_CHANGE) {
                /* 用户修改了子窗口 ID_MYEDIT 编辑框的内容,现在做进一步处理... */
            }
        }
        break;
}

方式2:通过自定义通知回调函数进行处理

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>

/* 定义对话框模板 */
static DLGTEMPLATE DlgBoxInputLen =
{
    WS_BORDER | WS_CAPTION,  //有边框 有菜单 
    WS_EX_NONE, //无扩展风格
    120, 150, 400, 160, //坐标和大小
    "请输入长度", //标题
    0, 0,
    4, NULL, //控件个数
    0
};

#define IDC_SIZE_MM 100
#define IDC_SIZE_INCH 110

/*
* 该对话框一共含有 4 个控件,分别用于显示提示信息、
* 用户输入框、显示转换后的长度值以及关闭程序用的“确定”按钮。
*/
static CTRLDATA CtrlInputLen [] =
{
    {
        CTRL_STATIC,
        WS_VISIBLE | SS_SIMPLE,
        10, 10, 380, 18,
        IDC_STATIC,
        "请输入长度(单位:毫米)",
        0
    },
    {
        CTRL_EDIT,
        WS_VISIBLE | WS_TABSTOP | WS_BORDER,
        10, 40, 380, 24,
        IDC_SIZE_MM,
        NULL,
        0
    },
    {
        CTRL_STATIC,
        WS_VISIBLE | SS_SIMPLE,
        10, 70, 380, 18,
        IDC_SIZE_INCH,
        "相当于 0.00 英寸",
        0
    },
    {
        CTRL_BUTTON,
        WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON,
        170, 100, 60, 25,
        IDOK,
        "确定",
        0
    }
};

/* 这是输入框的通知回调函数。*/
static void my_notif_proc (HWND hwnd, int id, int nc, DWORD add_data)
{
    /* 当输入框中的值发生变化时,取出值并转换成英寸显示在英寸框中。*/
    if (id == IDC_SIZE_MM && nc == EN_CHANGE) {
        char buff [60];
        double len;
        GetWindowText (hwnd, buff, 32);
        len = atof (buff);
        len = len / 25.4;
        sprintf (buff, "相当于 %.5f 英寸", len);
        SetDlgItemText (GetParent (hwnd), IDC_SIZE_INCH, buff);
    }
}

/* 该对话框的窗口过程 */
static int InputLenDialogBoxProc (HWND hDlg, int message, WPARAM wParam, LPARAM lParam)
{
    switch (message) {
        case MSG_INITDIALOG:
            //创建窗口时的lparam消息 以窗口附加数据的形式保存下来,以便在以后使用。
            SetWindowAdditionalData (hDlg, lParam);
            //设置控件的通知回调函数。 mm的编辑框
            SetNotificationCallback (GetDlgItem (hDlg, IDC_SIZE_MM), my_notif_proc);
            return 1;
        case MSG_COMMAND:
            switch (wParam) {
                case IDOK:
                    {
                        char buff [40];
                        //从输入框中获得数据,并保存在传入的指针中。
                        double* length = (double*) GetWindowAdditionalData (hDlg);
                        GetWindowText (GetDlgItem (hDlg, IDC_SIZE_MM), buff, 32);
                        *length = atof (buff);
                    }
                case IDCANCEL:
                    EndDialog (hDlg, wParam); //销毁模态对话框
                    break;
            }
            break;
    }
    return DefaultDialogProc (hDlg, message, wParam, lParam); //默认的对话框处理消息
}

static void InputLenDialogBox (HWND hWnd, double* length)
{
    DlgBoxInputLen.controls = CtrlInputLen; //将子控件赋值
    DialogBoxIndirectParam (&DlgBoxInputLen, hWnd, InputLenDialogBoxProc, (LPARAM)length); //对话框模板  父窗口  对话框回调函数  MSG的lparam值
}

//主程序入口
int MiniGUIMain (int argc, const char* argv[])
{
    double length; //长度
    
    #ifdef _MGRM_PROCESSES
    JoinLayer(NAME_DEF_LAYER , "input" , 0 , 0);
    #endif
    
    //创建模态对话框
    InputLenDialogBox (HWND_DESKTOP, &length);
    //把用户在对话框中输入的值打印在终端上
    printf ("The length is %.5f mm.\n", length);
    return 0;
}

#ifndef _MGRM_PROCESSES
#include <minigui/dti.c>
#endif

4.控件API

<minigui/window.h>

//创建控件
HWND GUIAPI CreateWindowEx2 (const char* spClassNameconst char* spCaption, DWORD dwStyle, DWORD dwExStyle,int id, int x, int y, int w, int h, HWND hParentWnd,const char* werdr_name, const WINDOW_ELEMENT_ATTR* we_attrs,DWORD dwAddData);
@spClassNameconst:控件名
@spCaption:标题
@dwStyle:风格
@dwExStyle:扩展风格
@id:控件id(父窗口下不能控件id号应该不一致)
@x,y,w,h:位置和大小
@hParentWnd:父窗口
@werdr_name:渲染器
@we_attrs:参数
@dwAddData:附加数据

static inline HWND GUIAPI CreateWindowEx (const char* spClassName,const char* spCaption, DWORD dwStyle, DWORD dwExStyle,int id, int x, int y, int w, int h, HWND hParentWnd,DWORD dwAddData)
{
	return CreateWindowEx2 (spClassName, spCaption, dwStyle, dwExStyle,id, x, y, w, h, 		hParentWnd, NULL, NULL, dwAddData);
}

#define CreateWindow(class_name, caption, style, id, x, y, w, h, parent, add_data) \
CreateWindowEx(class_name, caption, style, 0, id, x, y, w, h, parent, add_data)

BOOL GUIAPI DestroyWindow (HWND hWnd);
函数名用途
CreateWindowEx2创建控件 带有扩展风格和渲染器
CreateWindowEx创建控件 带有扩展风格
CreateWindow创建控件 无扩展风格
DestroyWindow销毁控件
GetNotificationCallback获取控件的通知消息回调函数
SetNotificationCallback设置控件的通知消息回调函数
NotifyParentEx发送控件通知消息
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值