📄 00000007.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人: Kongming (没日没夜...), 信区: Linux <BR>标 题: MiniGUI 的特色(5) <BR>发信站: BBS 水木清华站 (Fri Jul 2 16:16:21 1999) <BR> <BR> <BR>五、图形设备接口 <BR> <BR> 图形设备接口,即GDI, MiniGUI 中用来实现图形输出的模块。 <BR> <BR>5.1 基本概念 <BR> <BR>5.1.1 图形设备 <BR> 在 MiniGUI 中,采用了在 Windows 和 X Window 中普遍采用的图形设备 <BR>概念。每个图形设备定义了计算机显示屏幕上的一个矩形输出区域。 <BR> 在调用图形输出函数时,均要求指定经初始化,或经建立的图形设备上下 <BR>文,或设备环境(DC)。 <BR> 每个图形输出均局限在图形设备指定的矩形区域内。 <BR> 在多窗口系统中,各个图形设备之间的输出互相剪切,以避免图形输出之 <BR>间互相影响。 <BR> <BR>5.1.2 剪切域 <BR> 剪切域就是在图形设备上定义的一个区域,所有在该图形设备上进行的 <BR>图形输出,超过剪切域的部分,均被裁剪。只有在剪切域上的图形输出才是 <BR>可见的输出。 <BR> MiniGUI 中的剪切域,定义为矩形剪切域的集合。 <BR> <BR>5.1.3 映射模式 <BR> 映射模式指定了特定图形输出的坐标值如何映射到图形设备的坐标值。 <BR> 图形设备的坐标系原点定义为图形设备矩形区域的左上角。向右为正 X <BR>坐标轴方向;向下为正 Y 坐标轴方向。这一坐标系称为设备坐标系。 <BR> 通过 GDI 模块的映射模式操作函数,可定义自己的逻辑坐标系。逻辑 <BR>坐标系可以是设备坐标系的水平或垂直反转,缩放,或者偏移。 <BR> 多数 GDI 输出函数指定的是逻辑坐标系。 <BR> 默认情况下,逻辑坐标系和设备坐标系是重合的。 <BR> <BR>5.2 GDI 功能特性的分类说明 <BR> <BR>5.2.1 图形设备能力 <BR> <BR> 通过调用函数GetGDCapability,可获得图形设备的如下能力: <BR> 颜色数目; <BR> 水平和竖直方向的象素点数; <BR> 设备坐标系中可见点的最大 x 和 y 坐标值。 <BR> <BR>5.2.2 创建、销毁或获取、释放图形设备接口 <BR> 和 Win32 类似,MiniGUI 中也有一个 DC 的缓冲区,应用可调用 GetDC <BR>或 GetClientDC 函数从 DC 缓冲区中获取图形设备环境,在结束使用 DC 之 <BR>后,应当调用 ReleaseDC 函数释放 DC。 <BR> 应用也可以建立自己私有的 DC,这种 DC 可以是全局有效的 DC,由于 <BR>免除了获取和释放以及初始化等工作,因此,利用这种 DC 可加速图形显示。 <BR>当应用不再使用私有 DC 时,应当利用 DeletePrivateDC 删除私有 DC。下 <BR>面的代码即利用了这种 DC: <BR> <BR>int TestMainWinProc2(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) <BR>{ <BR> static HDC hdc; <BR> HDC hPaintDC; <BR> int x, y; <BR> RECT client; <BR> static int count = 0; <BR> static BITMAP bitmap; <BR> static BOOL fValid = FALSE; <BR> static int paintCount = 0; <BR> <BR> switch (message) { <BR> case MSG_CREATE: <BR> SetTimer (hWnd, 100, 20); <BR> SetTimer (hWnd, 200, 5); <BR> if(LoadBitmap(&bitmap, "res/j11b.BMP") < 0) <BR> fprintf (stderr, "Test Main Win: Loading bitmap failure!\n"); <BR> else <BR> fValid = TRUE; <BR> break; <BR> <BR> case MSG_SHOWWINDOW: <BR> if (wParam == SW_SHOWNORMAL) <BR> hdc = CreatePrivateClientDC (hWnd); <BR> break; <BR> <BR> case MSG_PAINT: <BR> hPaintDC = BeginPaint (hWnd); <BR> testdc (hPaintDC, fValid?&bitmap:NULL); <BR> EndPaint (hWnd, hPaintDC); <BR> break; <BR> <BR> case MSG_LBUTTONDBLCLK: <BR> return 0; <BR> <BR> case MSG_TIMER: <BR> if (ISINBACKGROUND) <BR> break; <BR> <BR> if (wParam == 100) { <BR> paintCount ++; <BR> <BR> if (paintCount % 10 != 0) { <BR> GetClientRect (hWnd, &client); <BR> x = random() % (RECTW (client)); <BR> y = random() % (RECTH (client)); <BR> SetPenColor(hdc, RGB2Index (hdc, random() % 256, <BR> random() % 256, <BR> random() % 256)); <BR> LineTo(hdc, x, y); <BR> } <BR> else <BR> InvalidateRect (hWnd, NULL, TRUE); <BR> } <BR> else if (wParam == 200) { <BR> if (count < 5) <BR> { <BR> Ping (); <BR> count ++; <BR> } <BR> else <BR> KillTimer (hWnd, 200); <BR> } <BR> break; <BR> <BR> case MSG_CLOSE: <BR> KillTimer (hWnd, 100); <BR> KillTimer (hWnd, 200); <BR> UnloadBitmap (&bitmap); <BR> DeletePrivateDC (hdc); <BR> DestroyMainWindow (hWnd); <BR> PostQuitMessage (hWnd); <BR> return 0; <BR> } <BR> <BR> return DefaultMainWinProc(hWnd, message, wParam, lParam); <BR>} <BR> <BR> 上述代码在应用主窗口建立时创建了私有 DC,然后在定时器消息中利用 <BR>私有 DC 进行绘制,最后在关闭窗口时删除了私有 DC。 <BR> MiniGUI 也支持内存中的虚拟 DC,可通过CreateCompatibleDC 建立内 <BR>存 DC,利用这种 DC,可加速绘制过程,并减少绘制过程中闪烁现象。应用 <BR>可使用DeleteCompatibleDC 函数删除内存 DC。 <BR> 上述 DC 的创建或获取与 Win32 API 有较明显的不同。 <BR> <BR>5.2.3 一般绘制属性 <BR> 这类功能用来设置 DC 的绘制属性,这些属性及其影响的绘图操作在 <BR>表 5.1 中列出。 <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -