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 | 发送控件通知消息 |