minigui常用的函数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
minigui常⽤的函数
#include
#include //包括minigui常⽤的宏以及数据类型的定义
#include //包含全局的和通⽤的接⼝函数以及某些杂项函数的定义
#include //包含minigui绘图函数的接⼝定义
#include //包含窗⼝有关的宏、数据类型、数据接⼝定义以及函数接⼝声明
//#include //包含libminigui中所有内建控件的接⼝定义
int MiniGUIMain (int argc, const char* argv[]) //argc:命令⾏参数个数 argv参数字符串数组指针
{
MSG Msg; //window.h中
HWND hMainWnd;
MAINWINCREATE CreateInfo; //描述⼀个主窗⼝的属性
//const char* old_renderer;
#ifdef _MGRM_PROCESSES
JoinLayer(NAME_DEF_LAYER , "helloworld" , 0 , 0); //MiniGUI-Processes模式下加⼊层(客户端)
#endif
CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION; //设置主窗⼝风格:可见|有边框|有标题栏
CreateInfo.dwExStyle = WS_EX_NONE; //扩展风格:⽆
CreateInfo.spCaption = "HelloWorld"; //标题
CreateInfo.hMenu = 0; //主菜单:⽆
CreateInfo.hCursor = GetSystemCursor(0); //设置主窗⼝的光标为系统缺省光标
CreateInfo.hIcon = 0; //图标:⽆
CreateInfo.MainWindowProc = HelloWinProc; //设置主窗⼝的窗⼝函数,所有发往该窗⼝的消息由该函数处理
CreateInfo.lx = 0; //屏幕上的位置(0,0)、(320,240)
CreateInfo.ty = 0;
CreateInfo.rx = 320;
CreateInfo.by = 240;
CreateInfo.iBkColor = COLOR_lightwhite; //背景⾊
CreateInfo.dwAddData = 0; //附加数据:⽆
//在窗⼝过程中,可以使⽤GetWindowAdditionalData函数获取该指针,从⽽获得所需要传递的参数。
CreateInfo.hHosting = HWND_DESKTOP; //设置主窗⼝的托管窗⼝为桌⾯窗⼝
//MiniGUI-Threads 中每个线程创建的第⼀个主窗⼝,其托管窗⼝必须是桌⾯,即 HWND_DESKTOP,
//该线程的其他窗⼝,必须由属于同⼀线程的已有主窗⼝作为托管窗⼝。
//系统在托管窗⼝为 HWND_DESKTOP 时创建新的消息队列,
//⽽在指定⾮桌⾯的窗⼝作为托管窗⼝时,使⽤该托管窗⼝的消息队列,
//也就是说,同⼀线程中的所有主窗⼝应该使⽤同⼀个消息队列。
//在调⽤ MiniGUIMain 之前,MiniGUI 启动⾃⼰的桌⾯窗⼝(Desktop)。
//old_renderer = SetDefaultWindowElementRender("classic");
hMainWnd = CreateMainWindow (&CreateInfo); //创建⼀个主窗⼝,返回值为所创建主窗⼝的句柄
if (hMainWnd == HWND_INVALID)
return -1;
ShowWindow(hMainWnd, SW_SHOWNORMAL); //显⽰:参数1:所要显⽰的窗⼝句柄参数2:显⽰窗⼝的⽅式(显⽰/隐藏) while (GetMessage(&Msg, hMainWnd)) { //参数1:要获取消息的主窗⼝的句柄参数2:指向MSG结构的指针
//GetMessage函数将⽤从消息队列中取出的消息来填充该消息结构的各个域
TranslateMessage(&Msg); //把击键消息转换为MSG_CHAR消息,然后直接发送到窗⼝过程函数
DispatchMessage(&Msg); //把消息发往该消息的⽬标窗⼝的窗⼝过程,让其处理。
//处理完消息后,应⽤程序的窗⼝函数将返回到DispatchMessage函数,再返回到应⽤程序代码,
//应⽤程序⼜从下⼀个GetMessage函数调⽤开始消息循环。
}
//SetDefaultWindowElementRenderer(old_renderer);
MainWindowThreadCleanup (hMainWnd); //清除主窗⼝所使⽤消息队列系统资源
return 0;
}
//窗⼝过程是⼀个特定类型的函数,⽤来接收和处理所有发送到该窗⼝的消息。
//每个控件类有⼀个窗⼝过程,属于同⼀控件类的所有控件共⽤同⼀个窗⼝过程来处理消息。
static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
//窗⼝过称函数,参数与MSG结构的前4个域相同 //由minigui调⽤,是⼀个回调函数
{
HDC hdc;
switch (message) {
case MSG_PAINT: //屏幕输出
hdc = BeginPaint (hWnd); //获得设备上下⽂句柄
TextOut (hdc, 60, 60, "Hello world!"); //⽂本输出
EndPaint (hWnd, hdc); //释放设备上下⽂句柄
return 0;
case MSG_CLOSE: //点击关闭按钮时
DestroyMainWindow (hWnd); //销毁主窗⼝
PostQuitMessage (hWnd); //在消息队列中投⼊⼀个MSG_QUIT消息,
//当GetMessage函数取出MSG_QUIT消息时将返回0.,最终导致程序退出消息循环
return 0;
}
return DefaultMainWinProc(hWnd, message, wParam, lParam); //默认处理
}
以上是完整的helloworld程序,可以直接⽤。
接下来是对话框,有模态对话框和⾮模态对话框之分。
模态对话框就是显⽰之后,⽤户不能再切换到其他主窗⼝进⾏⼯作的对话框,⽽只能在关闭之后,才能使⽤其他的主窗⼝。
MiniGUI 中,使⽤
模态对话框
DialogBoxIndirectParam函数建⽴的对话框就是模态对话框。
实际上,该对话框⾸先根据模板建⽴对话框,然后禁⽌其托管主窗⼝,并在主窗⼝的MSG_CREATE 消息中创建控件,之后发送 MSG_INITDIALOG 消息给回调函数,最终建⽴⼀个新的消息循环,并进⼊该消息循环,直到程序调⽤EndDialog 函数为⽌。
⾮模态对话框在利⽤对话框模板中的数据建⽴主窗⼝之后,会⽴即返回。
使⽤CreateMainWindowIndirect函数建⽴普通的主窗⼝。
对话框模板
在 MiniGUI 中,⽤两个结构来表⽰对话框模板(),如下所⽰:
typedef struct
{
char* class_name; // control class
DWORD dwStyle; // control style
int x, y, w, h; // control position in dialog
int id; // control identifier
const char* caption; // control caption
DWORD dwAddData; // additional data
DWORD dwExStyle; // control extended style
} CTRLDATA; //⽤来定义控件
typedef CTRLDATA* PCTRLDATA;
typedef struct
{
DWORD dwStyle; // dialog box style
DWORD dwExStyle; // dialog box extended style
int x, y, w, h; // dialog box position
const char* caption; // dialog box caption
HICON hIcon; // dialog box icon
HMENU hMenu; // dialog box menu
int controlnr; // number of controls
PCTRLDATA controls; // poiter to control array
DWORD dwAddData; // addtional data, must be zero
} DLGTEMPLATE; //⽤来定义对话框本⾝
typedef DLGTEMPLATE* PDLGTEMPLATE;
数组表⽰。
控件在该数组中的顺序,也就是对话框中⽤户按TAB键时的控件在程序中,应该⾸先利⽤ CTRLDATA 定义对话框中所有的控件,并⽤数组
切换顺序。
然后定义对话框,指定对话框中的控件数⽬,并指定 DLGTEMPLATE 结构中的controls指针指向定义控件的数组。
例如:
static CTRLDATA ButtonCtrls[BUTTONNUM];
static DLGTEMPLATE ButtonPanel = {
WS_VISIBLE | WS_THINFRAME,
WS_EX_NONE, 0,0,0,0,
"buttonlist",
0,0,
BUTTONNUM, ButtonCtrls,
};
ButtonPanel.controls = ButtonCtrls;
定义完对话框模板数据后,需要定义对话框的回调函数。
对话框操作函数(不⼀定仅在对话框中可⽤)
函数名称⽤途备注
DestroyAllControls 销毁所有的⼦窗⼝
GetDlgCtrlID 根据控件句柄获取控件标识符
GetDlgItem 根据控件标识符获取控件句柄
GetDlgItemInt 获取控件⽂本并转换为整数值
SetDlgItemInt 根据整数值设置控件⽂本
GetDlgItemText 获取⼦控件⽂本功能同 GetWindowText
GetDlgItemText2 获取⼦控件⽂本根据⽂本长度⾃动分配内存,应⽤程序负责释放该内存
SetDlgItemText 设置⼦控件⽂本功能同 SetWindowText
GetNextDlgGroupItem 获取下⼀个同组⼦控件⽤于遍历同组控件,参阅 WS_GROUP 风格
GetNextDlgTabItem 获取下⼀个“TAB 键停⽌”⼦控件⽤于TAB键游历控件,参阅WS_TABSTOP风格SendDlgItemMessage 向⼦控件发送消息功能同 SendMessage
CheckDlgButton 设置检查框⼦控件的选中状态
CheckRadioButton 设置单选按钮⼦控件的选中状态
IsDlgButtonChecked 检查⼦按钮是否选中
GetDlgDefPushButton 获取当前默认⼦按钮
通⽤窗⼝操作函数
函数名称⽤途备注
UpdateWindow ⽴即更新某个窗⼝
ShowWindow 显⽰或隐藏某个窗⼝
IsWindowVisible 判断某个窗⼝是否可见控件和主窗⼝均可⽤
EnableWindow 使能或禁⽌某个窗⼝
IsWindowEnabled 判断某个窗⼝是否可⽤
GetClientRect 获取窗⼝客户区矩形
GetWindowRect 获取窗⼝矩形屏幕坐标系中的窗⼝尺⼨
GetWindowBkColor 获取窗⼝背景⾊
SetWindowBkColor 设置窗⼝背景⾊
GetWindowFont 获取窗⼝默认字体
SetWindowFont 设置窗⼝默认字体
GetWindowCursor 获取窗⼝光标
SetWindowCursor 设置窗⼝光标
GetWindowStyle 获取窗⼝风格
GetWindowExStyle 获取窗⼝扩展风格
GetFocusChild 获取拥有输⼊焦点的⼦窗⼝
SetFocusChild 设置焦点⼦窗⼝
GetWindowCallbackProc 获取窗⼝过程函数
SetWindowCallbackProc 设置窗⼝过程函数
GetWindowAdditionalData 获取窗⼝附加数据⼀
SetWindowAdditionalData 设置窗⼝附加数据⼀
GetWindowAdditionalData2 获取窗⼝附加数据⼆
SetWindowAdditionalData2 设置窗⼝附加数据⼆
对话框和控件在内部已使⽤附加数据⼆,保留附加数据⼀给应⽤程序使⽤
GetWindowCaption 获取窗⼝标题通常⽤于主窗⼝
SetWindowCaption 设置窗⼝标题通常⽤于主窗⼝
InvalidateRect 使窗⼝的给定矩形区域⽆效将引发窗⼝重绘
GetUpdateRect 获取窗⼝当前的⽆效区域外包矩形
ClientToScreen 将窗⼝客户区坐标转换为屏幕坐标
ScreenToClient 将屏幕坐标转换为客户区坐标
WindowToScreen 将窗⼝坐标转换为屏幕坐标
ScreenToWindow 将屏幕坐标转换为窗⼝坐标
IsMainWindow 判断给定窗⼝是否为主窗⼝
IsControl 判断给定窗⼝是否为控件
IsDialog 判断给定窗⼝是否为对话框
GetParent 获取窗⼝的⽗窗⼝句柄主窗⼝的⽗窗⼝永远为HWND_DESKTOP
GetMainWindowHandle 返回包含某个窗⼝的主窗⼝句柄
GetNextChild 获取下⼀个⼦窗⼝⽤于遍历某个窗⼝的所有⼦窗⼝
GetNextMainWindow 获取下⼀个主窗⼝句柄⽤于遍历所有主窗⼝
GetHosting 获取某个主窗⼝的托管窗⼝
GetFirstHosted 获取某个主窗⼝的第⼀个被托管窗⼝
GetNextHosted 获取下⼀个被托管窗⼝⽤于遍历某个主窗⼝的所有被托管窗⼝
GetActiveWindow 获取当前活动主窗⼝
SetActiveWindow 设置当前活动主窗⼝
GetCapture 获取当前捕获⿏标的窗⼝
SetCapture 捕获⿏标
ReleaseCapture 释放⿏标
MoveWindow 移动窗⼝或改变窗⼝⼤⼩
ScrollWindow 滚动窗⼝客户区的内容
事件钩⼦
通常情况下,键盘事件和⿏标事件以其正常的途径从底层设备传递到最终的应⽤程序窗⼝过程中进⾏处理。
MiniGUI 提供了⼀种机制,使得我们可以在这些事件转换成相应的消息并传递到具体的窗⼝之前截获这些事件,然后有两种选择:让事件继续沿着正常的路径传递;或者打断事件的传递。
这种机制就是钩⼦机制。
钩⼦其实是⼀个回调函数,如果应⽤程序注册有钩⼦,系统就会在传递消息的中途调⽤这个回调函数,然后根据该回调函数的返回值来判断是否继续传递消息。
MiniGUI-Threads 和 MiniGUI-Standalone 模式下定义的钩⼦回调函数的原型如下所⽰:
typedef int (* MSGHOOK)(void* context, HWND dst_wnd, int msg, WPARAM wparam, LPARAM lparam);
其中,context 是注册钩⼦时传⼊的⼀个上下⽂信息,可以是⼀个指针;dst_wnd 是该消息的⽬标主窗⼝;msg 是消息标识符;wparam 和 lparam 是消息的两个参数。
钩⼦函数的返回值决定了系统是否继续传递事件:返回 HOOK_GOON 将继续传递事件;返回 HOOK_STOP 将停⽌事件的继续传递。
注册键盘和⿏标事件的钩⼦函数:
MSGHOOK GUIAPI RegisterKeyMsgHook (void* context, MSGHOOK hook);
MSGHOOK GUIAPI RegisterMouseMsgHook (void* context, MSGHOOK hook);
调⽤这两个函数时,只需传⼊上下⽂信息以及钩⼦回调函数的指针即可。
成功时会返回先前注册的钩⼦函数指针。
如果想注销先前注册的钩⼦函数,只需为 hook 参数传⼊ NULL :RegisterKeyMsgHook (0, old_hook);
窗⼝重绘
⼀般来说,在以下情况下,MiniGUI程序的窗⼝过程会接收到⼀个MSG_PAINT消息:
1、⽤户移动窗⼝或显⽰窗⼝时,MiniGUI向先前被隐藏的窗⼝发送MSG_PAINT消息;
2、程序使⽤InvalidateRect函数来更新窗⼝的⽆效区域,这将产⽣⼀个MSG_PAINT消息;
3、程序调⽤UpdateWindow函数来重绘窗⼝;
4、覆盖程序窗⼝的对话框或消息框被消除;
5、下拉或弹出菜单被消除。
基本绘图函数
void GUIAPI SetPixel (HDC hdc, int x, int y, gal_pixel c);
void GUIAPI SetPixelRGB (HDC hdc, int x, int y, int r, int g, int b);
gal_pixel GUIAPI GetPixel (HDC hdc, int x, int y);
void GUIAPI GetPixelRGB (HDC hdc, int x, int y, int* r, int* g, int* b);
gal_pixel GUIAPI RGB2Pixel (HDC hdc, int r, int g, int b);
void GUIAPI LineTo (HDC hdc, int x, int y);
void GUIAPI MoveTo (HDC hdc, int x, int y);
void GUIAPI Circle (HDC hdc, int x, int y, int r);
void GUIAPI Rectangle (HDC hdc, int x0, int y0, int x1, int y1);
菜单
定时器
在 MiniGUI 中,应⽤程序可以调⽤SetTimer函数创建定时器。
SetTimer 的第三个参数⽤来指定定时器的间隔,默认以 10毫秒为单位。
当创建的定时器到期时,创建定时器时指定的窗⼝就会收到MSG_TIMER消息,并传递到期的定时器标识号。
在不需要定时器时,应⽤程序可以调⽤KillTimer函数删除定时器。
应⽤程序还可以调⽤ResetTimer函数重新设定定时器的间隔。
IsTimerInstalled函数⽤于检查⼀个定时器是否被安装到指定的窗⼝上。
HaveFreeTimer⽤于检测系统中是否还有可⽤的定时器资源。
其他⼀些说明
1、设备字体
2、⽂本输出
3、颜⾊
4、输⼊框限制
SetWindowCallbackProc(hwndedit, RestrictedEditBox);。