📄 基于 linux 和 minigui 的嵌入式系统软件开发指南(四).htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0053)http://www.pocketix.com/documents/tech/2001090401.htm -->
<HTML><HEAD><TITLE>基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(四)</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META http-equiv=Content-Language content=en-us>
<META content="MSHTML 6.00.2719.2200" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId><!--使鼠标指向链接显示红色和加上下划线-->
<STYLE type=text/css>TD {
FONT-SIZE: 10pt; LINE-HEIGHT: 19px; FONT-FAMILY: 宋体
}
P {
FONT-SIZE: 10pt; FONT-FAMILY: 宋体
}
A:visited {
FONT-SIZE: 10pt; FONT-FAMILY: 宋体; TEXT-DECORATION: none
}
A:link {
FONT-SIZE: 10pt; FONT-FAMILY: 宋体; TEXT-DECORATION: none
}
A:hover {
FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: "宋体"; TEXT-DECORATION: underline
}
</STYLE>
</HEAD>
<BODY leftMargin=6 topMargin=5>
<DIV align=center>
<CENTER>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=690
borderColorLight=#000000 border=0>
<TBODY>
<TR>
<TD vAlign=top align=left><IMG height=60 alt=logo
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(四).files/pocketix_com_logo.gif"
width=220 border=0></TD>
<TD vAlign=center align=middle width=468>
<SCRIPT language=JavaScript
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(四).files/demo_banner.js"></SCRIPT>
</TD></TR></TBODY></TABLE></CENTER></DIV>
<DIV align=center>
<CENTER>
<TABLE height=15 cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%" background=""
height=15></TD></TR></TBODY></TABLE></CENTER></DIV>
<DIV align=left>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR height=20>
<TD width="100%"></TD></TR></TBODY></TABLE></DIV>
<DIV align=center>
<CENTER>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD vAlign=top width="100%">
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD align=middle width="100%"><SPAN class=atitle><FONT size=3>基于
Linux 和 MiniGUI 的嵌入式系统软件开发指南(四)</FONT></SPAN><FONT
size=3><BR></FONT><FONT color=#999999>2001-09-04 嵌入式Linux
报道</FONT></TD></TR>
<TR>
<TD vAlign=top align=middle width="100%">
<HR SIZE=1>
</TD></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE height=21 cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD width="100%" height=21>
<P> 主题四:使用 GDI 函数 <BR> 魏永明
(ymwei@minigui.org)<BR>
自由撰稿人<BR> 2001 年 8 月<BR><BR>
本文讲述 MiniGUI 中 GDI
函数及其使用。主要包括:设备上下文的概念、获取和释放;矩形操作和区域操作;基本绘图函数;位图操作函数;逻辑字体操作函数等。
<P><B>1 引言 <BR> </B>GUI 系统的一个重要组成部分就是
GDI,即图形设备接口(Graphics Device Interface)。通过 GDI,GUI
程序就可以在计算机屏幕上,或者其他的显示设备上进行图形输出,包括基本绘图和文本输出。本文将详细描述 MiniGUI 中的 GDI
函数,并举例说明重要函数的用法。其中包括:DC
的概念、获取和释放;矩形操作和剪切域操作;基本绘图函数;位图操作函数;逻辑字体操作函数等。<BR><BR><B>2
图形设备上下文 </B><BR> 在 MiniGUI 中,采用了在 Windows 和 X
Window
中普遍采用的图形设备概念。每个图形设备定义了计算机显示屏幕上的一个矩形输出区域。在调用图形输出函数时,均要求指定经初始化的图形设备上下文(Device
Context,DC),也称作"设备环境"。从程序员的角度看,一个经过初始化的图形设备上下文确定了其后进行图形输出的一些基本属性,并一直保持这些属性,直到被改变为止。这些属性包括:输出的线条颜色、填充颜色、字体颜色、字体形状等等。而从
GUI
系统角度来讲,一个图形设备上下文所代表的含义就要复杂得多,它起码应该包含如下内容: <BR><BR>
该设备上下文本所在设备信息(显示模式、色彩深度、显存布局等等); <BR>
该设备上下文所代表的窗口以及该窗口被其他窗口剪切的信息(在 MiniGUI
中,称作"全局剪切域"); <BR>
该设备上下文的基本操作函数(点、直线、多边形、填充、块操作等),及其上下文信息; <BR>
由程序设定的局部信息(绘图属性、映射关系和局部剪切域等)。<BR><BR>
所以,从程序员的角度看来,他所关心的仅仅是设备上下文本身的一小部分东西。<BR><BR>
<B>2.1 设备上下文的获取和释放 </B><BR> 在 MiniGUI
中,所有绘图相关的函数均需要有一个设备上下文。设备上下文可通过 GetClientDC 和 ReleaseDC 获取和释放。由
GetDC 所获取的设备上下文是针对整个窗口的,而 GetClientDC
所获取的设备上下文是针对窗口客户区,也就是说,前一个函数获得的设备上下文,其坐标原点位于窗口左上角,输出被限定在窗口范围之内;后一个函数获得的设备上下文,其坐标原点位于窗口客户区左上角,输出被限定在窗口客户区范围之内。下面是这三个函数的原型说明(include/gdi.h):
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD width="100%" bgColor=#c0c0c0>398 HDC GUIAPI GetDC (HWND
hwnd);<BR>399 HDC GUIAPI GetClientDC (HWND hwnd);<BR>400 void
GUIAPI ReleaseDC (HDC hdc);</TD></TR></TBODY></TABLE></DIV>
<P> GetDC 和 GetClientDC 是从系统预留的若干个 DC
当中获得一个目前尚未使用的设备上下文。所以,应该注意如下两点:
<P> 在使用完成一个由 GetDC 返回的设备上下文之后,应该尽快调用 ReleaseDC 释放。
避免同时使用多个设备上下文,并避免在递归函数中调用 GetDC 和
GetClientDC。<BR><BR> 为了方便程序编写,提高绘图效率,MiniGUI
还提供了建立私有设备上下文的函数,所建立的设备上下文在整个窗口生存期内有效,从而免除了获取和释放的过程。这些函数的原型如下:
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD width="100%" bgColor=#c0c0c0>403 HDC GUIAPI
CreatePrivateDC (HWND hwnd);<BR>404 HDC GUIAPI
CreatePrivateClientDC (HWND hwnd);<BR>405 HDC GUIAPI
GetPrivateClientDC (HWND hwnd);<BR>406 void GUIAPI
DeletePrivateDC (HDC hdc);</TD></TR></TBODY></TABLE></DIV>
<P> 在建立主窗口时,如果主窗口的扩展风格中指定了 WS_EX_USEPRIVATEDC 风格,则
CreateMainWindow 函数会自动为该窗口的客户区建立私有设备上下文。通过 GetPrivateClientDC
函数,可以获得该设备上下文。对控件而言,如果控件类具有 CS_OWNDC
属性,则所有属于该控件类的控件将自动建立私有设备上下文。DeletePrivateDC
函数用来删除私有设备上下文。对上述两种情况,系统将在销毁窗口时自动调用 DeletePrivateDC 函数。
<P> 另外一个获取和释放设备上下文的方法是通过 BeginPaint 和 EndPaint
函数。这两个函数只能在处理 MSG_PAINT 的消息中调用。MiniGUI 在 BeginPaint 函数中通过
GetClientDC 获取客户区设备上下文,然后将窗口当前的无效区域选择到窗口的剪切区域中;而 EndPaint
函数则清空窗口的无效区域,并释放设备上下文。这两个函数的原型如下(include/window.h):
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD width="100%" bgColor=#c0c0c0>623 HDC GUIAPI
BeginPaint(HWND hWnd);<BR>624 void GUIAPI EndPaint(HWND hWnd,
HDC hdc);</TD></TR></TBODY></TABLE></DIV>
<P> 因为 BeginPaint
函数将窗口的无效区域选择到了设备上下文中,所以,可以通过一些必要的优化来提高 MSG_PAINT
消息的处理效率。比如,某个程序要在窗口客户区中填充若干矩形,就可以在 MSG_PAINT 函数中如下处理:
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD width="100%" bgColor=#c0c0c0>MSG_PAINT:<BR>{<BR>HDC hdc =
BeginPaint (hWnd);<BR><BR>for (j = 0; j < 10; j ++) {<BR>if
(RectVisible (hdc, rcs + j)) {<BR>FillBox (hdc, rcs[j].left,
rcs[j].top, rcs [j].right, rcs
[j].bottom);<BR>}<BR>}<BR><BR>EndPaint (hWnd, hdc);<BR>return
0;<BR>}</TD></TR></TBODY></TABLE></DIV>
<P>
这样可以避免不必要的重绘操作,从而提高绘图效率。<BR><BR> <B>2.2
系统内存中的设备上下文 </B><BR> MiniGUI
也提供了内存设备上下文的创建和销毁函数。利用内存设备上下文,可以在系统内存中建立一个类似显示内存的区域,然后在该区域中进行绘图操作,结束后再复制到显示内存中。这种绘图方法有许多好处,比如速度很快,减少直接操作显存造成的闪烁现象等等。不过,目前
MiniGUI
中只能建立和显示内存,也就是物理设备上下文一样的内存设备上下文。用来建立和销毁内存设备上下文的函数原型如下(include/gdi.h):
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD width="100%" bgColor=#c0c0c0>401 HDC GUIAPI
CreateCompatibleDC (HDC hdc);<BR>402 void GUIAPI
DeleteCompatibleDC (HDC hdc);</TD></TR></TBODY></TABLE></DIV>
<P> <B>2.3
屏幕设备上下文 <BR></B><B> </B>MiniGUI
在启动之后,就建立了一个全局的屏幕设备上下文。该 DC
是针对整个屏幕的,并且没有任何预先定义的剪切域。在某些应用程序中,可以直接使用该设备上下文进行绘图,将大大提高绘图效率。在
MiniGUI 中,屏幕设备上下文用 HDC_SCREEN
标识,不需要进行任何获取和释放操作。<BR><BR> <B>2.4
映射模式 <BR>
</B>一个设备上下文被初始化之后,其坐标系原点通常是输出矩形的左上角,而 x 轴水平向左,y
轴垂直向下,并以象素为单位。这种坐标的映射模式标识为 MM_TEXT。MiniGUI
提供了一套函数,可以改变这种映射方式,包括对默认坐标系进行偏移、缩放等操作。这些函数的原型如下(include/gdi.h):
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD width="100%" bgColor=#c0c0c0>453 int GUIAPI GetMapMode
(HDC hdc);<BR>454 void GUIAPI GetViewportExt (HDC hdc, POINT*
pPt);<BR>455 void GUIAPI GetViewportOrg (HDC hdc, POINT*
pPt);<BR>456 void GUIAPI GetWindowExt (HDC hdc, POINT*
pPt);<BR>457 void GUIAPI GetWindowOrg (HDC hdc, POINT*
pPt);<BR>458 void GUIAPI SetMapMode (HDC hdc, int
mapmode);<BR>459 void GUIAPI SetViewportExt (HDC hdc, POINT*
pPt);<BR>460 void GUIAPI SetViewportOrg (HDC hdc, POINT*
pPt);<BR>461 void GUIAPI SetWindowExt (HDC hdc, POINT*
pPt);<BR>462 void GUIAPI SetWindowOrg (HDC hdc, POINT*
pPt);</TD></TR></TBODY></TABLE></DIV>
<P> GetMapMode 函数返回当前的映射模式,若不是 MM_TEXT
模式,则返回MM_ANISOTROPIC。SetMapMode 函数设置映射模式,MiniGUI
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -