BBS水木清华站∶精华区
发信人: Kongming (没日没夜...), 信区: Linux
标 题: MiniGUI 的特色(5)
发信站: BBS 水木清华站 (Fri Jul 2 16:16:21 1999)
五、图形设备接口
图形设备接口,即GDI, MiniGUI 中用来实现图形输出的模块。
5.1 基本概念
5.1.1 图形设备
在 MiniGUI 中,采用了在 Windows 和 X Window 中普遍采用的图形设备
概念。每个图形设备定义了计算机显示屏幕上的一个矩形输出区域。
在调用图形输出函数时,均要求指定经初始化,或经建立的图形设备上下
文,或设备环境(DC)。
每个图形输出均局限在图形设备指定的矩形区域内。
在多窗口系统中,各个图形设备之间的输出互相剪切,以避免图形输出之
间互相影响。
5.1.2 剪切域
剪切域就是在图形设备上定义的一个区域,所有在该图形设备上进行的
图形输出,超过剪切域的部分,均被裁剪。只有在剪切域上的图形输出才是
可见的输出。
MiniGUI 中的剪切域,定义为矩形剪切域的集合。
5.1.3 映射模式
映射模式指定了特定图形输出的坐标值如何映射到图形设备的坐标值。
图形设备的坐标系原点定义为图形设备矩形区域的左上角。向右为正 X
坐标轴方向;向下为正 Y 坐标轴方向。这一坐标系称为设备坐标系。
通过 GDI 模块的映射模式操作函数,可定义自己的逻辑坐标系。逻辑
坐标系可以是设备坐标系的水平或垂直反转,缩放,或者偏移。
多数 GDI 输出函数指定的是逻辑坐标系。
默认情况下,逻辑坐标系和设备坐标系是重合的。
5.2 GDI 功能特性的分类说明
5.2.1 图形设备能力
通过调用函数GetGDCapability,可获得图形设备的如下能力:
颜色数目;
水平和竖直方向的象素点数;
设备坐标系中可见点的最大 x 和 y 坐标值。
5.2.2 创建、销毁或获取、释放图形设备接口
和 Win32 类似,MiniGUI 中也有一个 DC 的缓冲区,应用可调用 GetDC
或 GetClientDC 函数从 DC 缓冲区中获取图形设备环境,在结束使用 DC 之
后,应当调用 ReleaseDC 函数释放 DC。
应用也可以建立自己私有的 DC,这种 DC 可以是全局有效的 DC,由于
免除了获取和释放以及初始化等工作,因此,利用这种 DC 可加速图形显示。
当应用不再使用私有 DC 时,应当利用 DeletePrivateDC 删除私有 DC。下
面的代码即利用了这种 DC:
int TestMainWinProc2(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
static HDC hdc;
HDC hPaintDC;
int x, y;
RECT client;
static int count = 0;
static BITMAP bitmap;
static BOOL fValid = FALSE;
static int paintCount = 0;
switch (message) {
case MSG_CREATE:
SetTimer (hWnd, 100, 20);
SetTimer (hWnd, 200, 5);
if(LoadBitmap(&bitmap, "res/j11b.BMP") < 0)
fprintf (stderr, "Test Main Win: Loading bitmap failure!\n");
else
fValid = TRUE;
break;
case MSG_SHOWWINDOW:
if (wParam == SW_SHOWNORMAL)
hdc = CreatePrivateClientDC (hWnd);
break;
case MSG_PAINT:
hPaintDC = BeginPaint (hWnd);
testdc (hPaintDC, fValid?&bitmap:NULL);
EndPaint (hWnd, hPaintDC);
break;
case MSG_LBUTTONDBLCLK:
return 0;
case MSG_TIMER:
if (ISINBACKGROUND)
break;
if (wParam == 100) {
paintCount ++;
if (paintCount % 10 != 0) {
GetClientRect (hWnd, &client);
x = random() % (RECTW (client));
y = random() % (RECTH (client));
SetPenColor(hdc, RGB2Index (hdc, random() % 256,
random() % 256,
random() % 256));
LineTo(hdc, x, y);
}
else
InvalidateRect (hWnd, NULL, TRUE);
}
else if (wParam == 200) {
if (count < 5)
{
Ping ();
count ++;
}
else
KillTimer (hWnd, 200);
}
break;
case MSG_CLOSE:
KillTimer (hWnd, 100);
KillTimer (hWnd, 200);
UnloadBitmap (&bitmap);
DeletePrivateDC (hdc);
DestroyMainWindow (hWnd);
PostQuitMessage (hWnd);
return 0;
}
return DefaultMainWinProc(hWnd, message, wParam, lParam);
}
上述代码在应用主窗口建立时创建了私有 DC,然后在定时器消息中利用
私有 DC 进行绘制,最后在关闭窗口时删除了私有 DC。
MiniGUI 也支持内存中的虚拟 DC,可通过CreateCompatibleDC 建立内
存 DC,利用这种 DC,可加速绘制过程,并减少绘制过程中闪烁现象。应用
可使用DeleteCompatibleDC 函数删除内存 DC。
上述 DC 的创建或获取与 Win32 API 有较明显的不同。
5.2.3 一般绘制属性
这类功能用来设置 DC 的绘制属性,这些属性及其影响的绘图操作在
表 5.1 中列出。
表 5.1 一般绘图属性
绘制属性 所影响的绘图操作 备注
-----------------------------------------------------------
背景色 文本输出 GetBkColor, SetBkColor
背景模式 文本输出 GetBkMode, SetBkMode
文本颜色 文本输出 GetTextColor, SetTextColor
画笔类型 线条输出 只支持实型画笔 GetPenType, SetPenType
画笔颜色 线条输出 GetPenColor, SetPenColor
画刷类型 填充操作 只支持实型画刷 GetBrushType, SetBrushType
画刷颜色 填充操作 GetBrushColor, SetBrushColor
5.2.4 一般绘图支持
这类功能用来完成基本的绘图功能,这些功能包括:画点、直线、圆、
矩形等。另外还有一些颜色转换方面的功能,可以将特定的 RGB 转换为最接
近的 256 色调色板中的颜色索引值。接口函数由表 5.2 给出。
表 5.2 一般绘图支持
函数 功能说明
------------------------------------------------------
SetPixel 设置指定的象素颜色,颜色值以调色板索引给出。
SetPixelRGB 设置指定的象素颜色,颜色值以 RGB 值给出。
GetPixel 获取指定点的象素颜色,以调色板索引给出。
GetPixelRGB 获取指定点的象素颜色,以 RGB 值给出。
RGB2Index 完成 RGB 值到调色板索引值的转换。
MoveTo, LineTo 绘制直线。
Circle 绘制圆。
Rectangle 绘制矩形。
5.2.5 文本输出支持
这类功能用来利用系统字体输出文本。可实现无格式文本(TextOut)和
有格式文本(TabbedTextOut)的输出。作为辅助函数,应用还可以利用
GetTabbedTextExtent 函数来获得格式化文本字符串的输出尺寸。由于系统
字体是等宽字体,无格式文本的输出长度就等于单字节字符串个数乘以单个
字符的宽度。利用 GetCharWidth 以及 GetCCharWidth 可获取单字节字符以
及双字节字符(汉字)的宽度;利用 GetCharHeight 可获取字符的高度。
5.2.6 映射函数支持
MiniGUI 支持的映射方式有两种,一种和 Win32 的 MM_TEXT 映射方式
一样,即设备坐标系和逻辑坐标系是一致的;一种和 Win32 的MM_ANISOTROPIC
映射方式一样,逻辑 x 和 y 轴可以以任意的比例映射到对应的坐标轴上。
其他的 Win32 映射方式不被支持。
通过函数 SetMapMode 设定映射方式。
利用 SetWindowExt和 SetViewportExt 可设置 MM_ANISOTROPIC 映射方
式的坐标轴方向、比例等。利用SetWindowOrg 和 SetViewPortOrg 可以设定
原点位置。
和上述函数的对应的 Get 函数组可用来获取设定值。
5.2.7 坐标转换
这类函数用来实现设备坐标到逻辑坐标的转换。DPtoLP 将设备坐标转换
为逻辑坐标,LPtoDP 将逻辑坐标转换为设备坐标。
5.2.8 剪切支持
这类函数用来实现对 DC 剪切域的操作。和 Win32 不同的是,MiniGUI
的剪切域只支持矩形剪切域。
ExcludeClipRect 可用来在当前剪切域中排除指定的矩形区域。
IncludeClipRect 可用来在当前剪切域中包含指定的矩形区域。
CliprectIntersect 可用来将当前剪切域和指定矩形相交。
SelectClipRect 将剪切域设置为指定矩形。
GetBoundsRect 获取包含当前剪切域的最大矩形。
PtVisible 可判断给定点是否处于剪切域。
RectVisible 可判断给定矩形是否和剪切域相交。
5.2.9 位图支持
这类函数用来实现填充操作。
利用 FillBox 可以以当前的画刷类型和颜色填充指定矩形。
利用 FillBoxWithBitmap 可以用指定的位图填充指定矩形,如果有需要,
该函数可进行位图的缩放。
利用 BitBlt 函数可在两个 DC 之间复制图象。
利用 StretchBlt 函数可两个 DC 之间复制图象,并完成缩放。
利用函数 LoadBitmap 可从Windows BMP文件中装入位图信息。
UnloadBitmap 则卸载位图信息。
5.2.10 图标支持
MiniGUI 的图标支持和 Win32 API 大致相同,包含如下几种操作:
创建和销毁图标:LoadIconFromFile、CreateIcon、DestroyIcon。
图标绘制支持:DrawIcon。
根据需要 MiniGUI 将提供系统图标集,及相应的操作函数。
5.2.11 矩形支持
这类函数提供了实现矩形相交,合并等一般性的操作,达到 Win32 的
95% 兼容。下面是这些函数的说明。
1) SetRect
void GUIAPI SetRect(RECT* prc, int left, int top, int right, int bottom);
该函数将矩形 prc 设定为参数 left, top, right, bottom 指定的大小。
2) SetRectEmpty
void GUIAPI SetRectEmpty(RECT* prc);
该函数将矩形 prc 设置为空矩形. 空矩形就是面积为 0 的矩形. 该函数将
矩形的 left, top, right, bottom 值均设置为 0。
3) CopyRect
void GUIAPI CopyRect(RECT* pdrc, const RECT* psrc);
该函数将矩形 psrc 复制到 pdrc 中。
4) IsRectEmpty
BOOL GUIAPI IsRectEmpty(const RECT* PRC);
该函数判断指定矩形是否为空矩形。若为空矩形,则函数返回 TRUE,否则
返回 FALSE。
5) EqualRect
BOOL GUIAPI EqualRect(const RECT* prc1, const RECT* prc2);
该函数判断指定的两个矩形是否是相等的矩形。相等的矩形其 left, top,
right, bottom 值均相等。
6) NormalizeRect
void GUIAPI NormalizeRect(RECT* pRect);
该函数将指定的矩形 pRect 进行正规化处理。矩形的正规化指满足如下条
件的矩形:left <= right 并且 top <= bottom。
7) IntersectRect
BOOL GUIAPI IntersectRect(RECT* pdrc,
const RECT* psrc1, const RECT* psrc2);
该函数求两个矩形 psrc1 和 psrc2 的相交区域, 并在 pdrc 中返回相交
矩形。
如果 psrc1 和 psrc2 相交,函数返回为 TRUE。
如果 psrc1 和 psrc2 不相交,函数返回为 FALSE,pdrc 为空矩形
8) DoesIntersect
BOOL GUIAPI DoesIntersect(const RECT* psrc1, const RECT* psrc2);
该函数判断两个矩形是否相交。
如果 psrc1 和 psrc2 相交,函数返回为 TRUE。
如果 psrc1 和 psrc2 不相交,函数返回为 FALSE。
9) UnionRect
BOOL GUIAPI UnionRect(RECT* pdrc, const RECT* psrc1, const RECT* psrc2);
该函数求两个矩形 psrc1 和 psrc2 相并矩形,并在 pdrc 中返回相并矩形。
如果 psrc1 和 psrc2 能够进行相并操作,函数返回 TRUE。
如果 psrc1 和 psrc2 不能进行相并操作,函数返回 FALSE,pdrc 为空矩形。
10) SubtractRect
BOOL GUIAPI SubtractREct(RECT* pdrc, const RECT* psrc1, const RECT* psrc2);
该函数求两个矩形 psrc1 和 psrc2 相减的矩形, 并在 pdrc 中返回结果
矩形。
如果 psrc1 和 psrc2 能够进行相减操作, 函数返回 TRUE。
如果 psrc1 和 psrc2 不能进行相减操作,函数返回 FALSE,pdrc 为空矩形。
11) OffsetRect
void GUIAPI OffsetRect(RECT* prc, int x, int y);
该函数将矩形 prc 偏移指定的偏移量 x, y。
12) InflateRect
void GUIAPI InflateRect(RECT* prc, int cx, int cy);
该函数将矩形 prc 的长和宽分别增加 cx 和 cy。
13) PtInRect
BOOL GUIAPI PtInRect(const RECT* prc, int x, int y);
该函数判断指定点(x, y)是否处于矩形 prc 中。
如果指定点在矩形中,函数返回 TRUE;否则返回 FALSE。
--
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.53.193]
BBS水木清华站∶精华区