📄 minigui开发文档总结.txt
字号:
miniGUI 程序基本框架:
/*
** Listing 2.1
**
** helloworld.c: Sample program for MiniGUI Programming Guide
** The first MiniGUI Application
**
** Copyright (C) 2003~2005 Feynman Software.
**
** License: GPL
*/
#include <stdio.h>
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
switch (message) {
case MSG_PAINT:
hdc = BeginPaint (hWnd);
TextOut (hdc, 100, 100, "Hello world!");
EndPaint (hWnd, hdc);
return 0;
case MSG_CLOSE:
DestroyMainWindow (hWnd);
PostQuitMessage (hWnd);
return 0;
}
return DefaultMainWinProc(hWnd, message, wParam, lParam);
}
int MiniGUIMain (int argc, const char* argv[])
{
MSG Msg;
HWND hMainWnd;
MAINWINCREATE CreateInfo;
#ifdef _MGRM_PROCESSES
JoinLayer(NAME_DEF_LAYER , "helloworld" , 0 , 0);
#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;
CreateInfo.ty = 0;
CreateInfo.rx = 320;
CreateInfo.by = 240;
CreateInfo.iBkColor = COLOR_lightwhite;
CreateInfo.dwAddData = 0;
CreateInfo.hHosting = HWND_DESKTOP;
hMainWnd = CreateMainWindow (&CreateInfo);
if (hMainWnd == HWND_INVALID)
return -1;
ShowWindow(hMainWnd, SW_SHOWNORMAL);
while (GetMessage(&Msg, hMainWnd)) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
MainWindowThreadCleanup (hMainWnd);
return 0;
}
#ifndef _MGRM_PROCESSES
#include <minigui/dti.c>
#endif
miniGUI 程序消息循环
while (GetMessage (&Msg, hMainWnd))
{
TranslateMessage (&Msg);
DispatchMessage (&Msg);
}
miniGUI 几个重要的消息
(1) MSG_NCCREATE
该消息在 MiniGUI 建立主窗口的过程中发送到窗口过程。lParam 中包含了由
CreateMainWindow 传递进入的 pCreateInfo 结构指针。你可以在该消息的处理过程中修改
pCreateInfo 结构中的某些值。需要注意的是,系统向窗口过程发送此消息时,窗口对象尚
未建立,因此,在处理该消息时不能使用 GetDC 等函数获得该窗口的设备上下文,也不能
在 MSG_NCCREATE 消息中建立子窗口。
对输入法窗口来讲,必须在对该消息的处理中进行输入法窗口的注册工作,比如:
case MSG_NCCREATE:
if (hz_input_init())
/* Register before show the window. */
SendMessage (HWND_DESKTOP, MSG_IME_REGISTER, (WPARAM)hWnd, 0);
else
return -1;
break;
(2)MSG_ERASEBKGND
当系统需要清除窗口背景时,将发送该消息到窗口过程。通常情况下,应用程序调用
InvalidateRect 或者 UpdateWindow 等函数并为 bErase 参数传递 TRUE 时,系统将发送
该消息通知窗口清除背景。默认窗口过程将以背景色刷新窗口客户区。某些窗口比较特殊,
往往会在 MSG_PAINT 消息中重绘所有的窗口客户区,就可以忽略对该消息的处理:
MSG_EARSEBKGND:
return 0;
还有一些窗口希望在窗口背景上填充一个图片,则可以在该消息的处理中进行填充操作:
MSG_EARSEBKGND:
HDC hdc = (HDC)wParam;
const RECT* clip = (const RECT*) lParam;
BOOL fGetDC = FALSE;
RECT rcTemp;
if (hdc == 0) {
hdc = GetClientDC (hWnd);
fGetDC = TRUE;
}
if (clip) {
rcTemp = *clip;
ScreenToClient (hDlg, &rcTemp.left, &rcTemp.top);
ScreenToClient (hDlg, &rcTemp.right, &rcTemp.bottom);
IncludeClipRect (hdc, &rcTemp);
}
/* 用图片填充背景 */
FillBoxWithBitmap (hdc, 0, 0, 0, 0, &bmp_bkgnd);
if (fGetDC)
ReleaseDC (hdc);
return 0;
(3)MSG_PAINT
消息处理完后请直接返回
(4) MSG_IDLE、MSG_TIMER 和MSG_FDEVENT
系统消息
MSG_FDEVENT 主要用于异步事件的处理中
#define MAX_NR_LISTEN_FD 5
/* Return TRUE if all OK, and FALSE on error. */
BOOL GUIAPI RegisterListenFD (int fd, int type, HWND hwnd, void* context);
/* Return TRUE if all OK, and FALSE on error. */
BOOL GUIAPI UnregisterListenFD (int fd);
MSG_TIMER 定时器消息
在 MiniGUI 中,应用程序可以调用 SetTimer 函数创建定时器。当创建的定时器到期
时,创建定时器时指定的窗口就会收到 MSG_TIMER 消息,并传递到期的定时器标识号。
在不需要定时器时,应用程序可以调用 KillTimer 函数删除定时器。
miniGUI 几个重要的需要注意的几个函数
(1) 设置绑定和获取绑定HWND 的数据 [对象]
GetWindowAdditionalData 获取窗口附加数据一
SetWindowAdditionalData 设置窗口附加数据一
(2) 自定义窗口创建及消息处理
WNDCLASS MyClass;
MyClass.WinProc = MyControlProc;
RegisterWindowClass(&MyClass);
UnregisterWindowClass
其中MyControlProl 为消息处理函数
例如:(注意:这里hwnd 为控件窗口句柄)
static int MyControlProc (HWND hwnd, int message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
switch (message) {
case MSG_PAINT:
/* 仅仅输出“hello, world! – from my control” */
hdc = BeginPaint (hwnd);
SetBkColor (hdc, COLOR_red);
SetBrushColor(hdc,COLOR_blue);
Rectangle(hdc,0,0,320,240);
FillBox(hdc,0,0,320,240);
TextOut (hdc, 10, 10, "Hello, world! – from my control");
EndPaint (hwnd, hdc);
return 0;
case MSG_LBUTTONDOWN:
MessageBox(hwnd,"TEST","TEST",MB_OK);
return 0;
}
return DefaultControlProc (hwnd, message, wParam, lParam);
}
miniGUI 显示 绘图部分
MSG_PAINT 消息响应
消息可以由InvalidateRect函数产生,窗口自身的动作也能产生MSG_PAINT消息,另外InvalidateRect函数能产生MSG_ERASEBKGND消息,用户移动窗口或显示窗口时,MiniGUI 向先前被隐藏的窗口发送MSG_PAINT 消息;
?? 程序使用InvalidateRect 函数来更新窗口的无效区域,这将产生一个MSG_PAINT消息;
?? 程序调用UpdateWindow 函数来重绘窗口;
?? 覆盖程序窗口的对话框或消息框被消除;
?? 下拉或弹出菜单被消除。
hwnd 将要绘制的窗口句柄,hdc 窗口dc
hdc = BeginPaint (hwnd);
EndPaint (hwnd, hdc);
如果应用程序的某个操作要求立即的反馈,例如处理键盘和鼠标消息时,它可以立刻进行绘制而不用等待MSG_PAINT 消息。应用程序在其它
时候绘制时可以调用GetDC 或GetClientDC 来获得设备上下文句柄
GC 属性:
?? 前景色(画笔),绘制时所使用的颜色值或图像。
?? 背景色或填充位图(画刷),绘制原语在填充时所使用的颜色或图像。
?? 绘制模式,描述前景色与已有的屏幕颜色如何组合。常见的选项是覆盖已有的屏幕内容或把绘制颜色和屏幕颜色进行“XOR”位逻辑运算。
XOR 模式使得绘制对象可以通过重绘进行擦除。
?? 填充模式,描述背景色或图像与屏幕颜色如何组合。常见的选项是覆盖或透明,也就是忽略背景和已有的屏幕内容。
?? 颜色掩蔽,它是一个位图,用于决定绘制操作对屏幕象素影响的风格。
?? 线形,它的宽度、端型和角型。
?? 字体,字体通常是对应于某个字符集的一组位图。字体一般通过指定其大小、磅值、类别和字符集等属性进行选择。
?? 绘制区域,在概念上是一个大小和位置可以为任意值的、映射到窗口之上的视口。可以通过改变视口的原点来移动视口。有时候系统允许视口的缩放。
?? 剪切域,在该区域内绘制原语才有实效。剪切域之外的输出将不被绘制出来。剪切域主要用于重绘,由各个窗口的有变化的区域相交而成。应用程序可以调整剪切域,增加需要改变的区域。
?? 当前位置,例如可以通过MoveTo 和LineTo 等绘制原语来画线。
函数列表:
内存设备上下文
HDC GUIAPI CreateCompatibleDC (HDC hdc);
void GUIAPI DeleteCompatibleDC (HDC hdc);
基本函数
基本绘图属性
线条颜色 GetPenColor/SetPenColor
填充颜色 GetBrushColor/SetBrushColor
文本背景模式 GetBkMode/SetBkMode
文本颜色 GetTextColor/SetTextColor
TAB 键宽度 GetTabStop/SetTabStop
基本绘图函数
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);
void GUIAPI FillBox (HDC hdc, int x, int y, int w, int h);
void GUIAPI FillBoxWithBitmap (HDC hdc, int x, int y, int w, int h,
PBITMAP pBitmap);
void GUIAPI FillBoxWithBitmapPart (HDC hdc, int x, int y, int w, int h,
int bw, int bh, PBITMAP pBitmap, int xo, int yo);
void GUIAPI BitBlt (HDC hsdc, int sx, int sy, int sw, int sh,
HDC hddc, int dx, int dy, DWORD dwRop);
void GUIAPI StretchBlt (HDC hsdc, int sx, int sy, int sw, int sh,
HDC hddc, int dx, int dy, int dw, int dh, DWORD dwRop);
int GUIAPI LoadBitmapEx (HDC hdc, PBITMAP pBitmap, MG_RWops* area, const char* ext);
int GUIAPI LoadBitmapFromFile (HDC hdc, PBITMAP pBitmap, const char* spFileName);
int GUIAPI LoadBitmapFromMemory (HDC hdc, PBITMAP pBitmap,
void* mem, int size, const char* ext);
#define LoadBitmap LoadBitmapFromFile
void GUIAPI UnloadBitmap (PBITMAP pBitmap);
int GUIAPI LoadMyBitmapEx (PMYBITMAP my_bmp, RGB* pal, MG_RWops* area, const char* ext);
int GUIAPI LoadMyBitmapFromFile (PMYBITMAP my_bmp, RGB* pal, const char* file_name);
int GUIAPI LoadMyBitmapFromMemory (PMYBITMAP my_bmp, RGB* pal,
void* mem, int size, const char* ext);
void* GUIAPI InitMyBitmapSL (MG_RWops* area, const char* ext, MYBITMAP* my_bmp, RGB* pal);
int GUIAPI LoadMyBitmapSL (MG_RWops* area, void* load_info, MYBITMAP* my_bmp,CB_ONE_SCANLINE cb, void*
context);
int GUIAPI CleanupMyBitmapSL (MYBITMAP* my_bmp, void* load_info);
BOOL GUIAPI PaintImageEx (HDC hdc, int x, int y, MG_RWops* area, const char *ext);
int GUIAPI PaintImageFromFile (HDC hdc, int x, int y, const char *file_name);
int GUIAPI PaintImageFromMem (HDC hdc, int x, int y, const void* mem, int size, const char *ext);
void GUIAPI UnloadMyBitmap (PMYBITMAP my_bmp);
int GUIAPI ExpandMyBitmap (HDC hdc, PBITMAP bmp, const MYBITMAP* my_bmp,
const RGB* pal, int frame);
void GUIAPI FillBoxWithBitmap (HDC hdc, int x, int y, int w, int h,
PBITMAP pBitmap);
void GUIAPI FillBoxWithBitmapPart (HDC hdc, int x, int y, int w, int h,
int bw, int bh, PBITMAP pBitmap, int xo, int yo);
void GUIAPI BitBlt (HDC hsdc, int sx, int sy, int sw, int sh,
HDC hddc, int dx, int dy, DWORD dwRop);
void GUIAPI StretchBlt (HDC hsdc, int sx, int sy, int sw, int sh,
HDC hddc, int dx, int dy, int dw, int dh, DWORD dwRop);
miniGUI 高级编程主题
#define BUTTON_MINIGUI ("Button_miniGUI")
WNDCLASS MyClass;
MyClass.spClassName = BUTTON_MINIGUI;
MyClass.dwStyle = WS_NONE;
MyClass.dwExStyle = WS_EX_NONE;
MyClass.hCursor = GetSystemCursor (IDC_ARROW);
MyClass.iBkColor = COLOR_lightwhite;
MyClass.WinProc = Button_miniGUIProc;
A:) 注册一个新对象
return RegisterWindowClass (&MyClass);
B:) 注销一个对象
UnregisterWindowClass (BUTTON_MINIGUI);
C:) 直接通过"BUTTON_MINIGUI" (类似)来创建一个新对象
CreateWindow(BUTTON_MINIGUI,...
d:) 对象的消息处理函数定义:
MyClass.WinProc = WinProc (针对一个特定的对象写一个函数.)
E:) 消息循环
while (GetMessage(&Msg, g_wndMain)) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
g_wndMain : 主窗口对象,消息将顺序向其子窗口传递,目的窗口由Msg.hWnd (类似)指定.
F:) Cleans up system resource associated with a main window. More...
void GUIAPI MainWindowThreadCleanup (HWND hMainWnd)
G:) Creates a main window. More...
HWND GUIAPI CreateMainWindow (PMAINWINCREATE pCreateStruct)
H:) Destroies a main window. More...
BOOL GUIAPI DestroyMainWindow (HWND hWnd)
I:) 定时:
SetTimer
windows 开发环境搭建:
minigui-dev-1.6.8-for-win32
inlcude 设置
minigui-dev-1.6.8-for-win32/include
minigui-dev-1.6.8-for-win32/include/pthread-win32
lib & exe 目录设置
minigui-dev-1.6.8-for-win32/lib
运行:
先运行 :wvfb.exe
在执行应用程序
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -