⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 minigui开发文档总结.txt

📁 一个minigui 工程框架,需要windows 下的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 + -