📄 基于 linux 和 minigui 的嵌入式系统软件开发指南(四).htm
字号:
<TD width=5><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(四).files/c.gif" width=5 border=0></TD><!-- START CENTER COLUMN -->
<TD width="100%">
<TABLE cellSpacing=0 cellPadding=0 width=168 align=right border=0>
<TBODY>
<TR><!-- Sidebar Gutter -->
<TD width=8><IMG height=21 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(四).files/c.gif" width=5></TD>
<TD width=160><!-- Start TOC -->
<TABLE cellSpacing=0 cellPadding=0 width=160 border=0>
<TBODY>
<TR>
<TD width=160 bgColor=#000000 height=1><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(四).files/c.gif"
width=160></TD></TR>
<TR>
<TD align=middle
background="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(四).files/bg-gold.gif"
height=5><B>内容:</B></TD></TR>
<TR>
<TD width=160 bgColor=#666666 height=1><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(四).files/c.gif"
width=160></TD></TR>
<TR>
<TD align=right>
<TABLE cellSpacing=0 cellPadding=3 width="98%" border=0>
<TBODY>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part4/index.shtml#1">引言</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part4/index.shtml#2">图形设备上下文</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part4/index.shtml#3">矩形操作和区域操作</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part4/index.shtml#4">基本绘图函数</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part4/index.shtml#5">位图操作函数</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part4/index.shtml#6">逻辑字体操作函数</A>
</TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part4/index.shtml#7">小结</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part4/index.shtml#author1">作者介绍</A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!-- End TOC --><!-- Start Related Content Area -->
<TABLE cellSpacing=0 cellPadding=0 width=160 border=0>
<TBODY>
<TR>
<TD width=160 bgColor=#000000 height=1><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(四).files/c.gif"
width=160></TD></TR>
<TR>
<TD align=middle
background="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(四).files/bg-gold.gif"
height=5><B>相关内容:</B></TD></TR>
<TR>
<TD width=160 bgColor=#666666 height=1><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(四).files/c.gif"
width=160></TD></TR>
<TR>
<TD align=right>
<TABLE cellSpacing=0 cellPadding=3 width="98%" border=0>
<TBODY>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part1/index.shtml">主题一:选择MiniGUI-Threads
或者 MiniGUI-Lite</A> </TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part2/index.shtml">主题二:理解消息循环和窗口过程</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part3/index.shtml">主题三:对话框和控件编程</A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!-- End Related dW Content Area -->
<TABLE cellSpacing=0 cellPadding=0 width=160 border=0>
<TBODY>
<TR>
<TD width=150 bgColor=#000000 colSpan=2 height=2><IMG height=2
alt="" src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(四).files/c.gif"
width=160></TD></TR>
<TR>
<TD width=150 bgColor=#ffffff colSpan=2 height=2><IMG height=2
alt="" src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(四).files/c.gif"
width=160></TD></TR></TBODY></TABLE><!-- END STANDARD SIDEBAR AREA --></TD></TR></TBODY></TABLE><!-- START SUBTITLE AND CONTENT --><SPAN
class=atitle2>主题四:使用 GDI 函数</SPAN>
<P><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part4/index.shtml#author1">魏永明</A>
(<A
href="mailto:ymwei@minigui.org">ymwei@minigui.org</A>)<BR>自由撰稿人<BR>2001 年
8 月</P>
<BLOCKQUOTE>本文讲述 MiniGUI 中 GDI
函数及其使用。主要包括:设备上下文的概念、获取和释放;矩形操作和区域操作;基本绘图函数;位图操作函数;逻辑字体操作函数等。</BLOCKQUOTE>
<P><A id=1 name=1><SPAN class=atitle2>1 引言</SPAN></A><BR>GUI 系统的一个重要组成部分就是
GDI,即图形设备接口(Graphics Device Interface)。通过 GDI,GUI
程序就可以在计算机屏幕上,或者其他的显示设备上进行图形输出,包括基本绘图和文本输出。本文将详细描述 MiniGUI 中的 GDI
函数,并举例说明重要函数的用法。其中包括:DC 的概念、获取和释放;矩形操作和剪切域操作;基本绘图函数;位图操作函数;逻辑字体操作函数等。</P>
<P><A id=2 name=2><SPAN class=atitle2>2 图形设备上下文</SPAN></A><BR>在 MiniGUI
中,采用了在 Windows 和 X Window
中普遍采用的图形设备概念。每个图形设备定义了计算机显示屏幕上的一个矩形输出区域。在调用图形输出函数时,均要求指定经初始化的图形设备上下文(Device
Context,DC),也称作"设备环境"。从程序员的角度看,一个经过初始化的图形设备上下文确定了其后进行图形输出的一些基本属性,并一直保持这些属性,直到被改变为止。这些属性包括:输出的线条颜色、填充颜色、字体颜色、字体形状等等。而从
GUI 系统角度来讲,一个图形设备上下文所代表的含义就要复杂得多,它起码应该包含如下内容:</P>
<OL class=n01>
<LI>该设备上下文本所在设备信息(显示模式、色彩深度、显存布局等等);
<LI>该设备上下文所代表的窗口以及该窗口被其他窗口剪切的信息(在 MiniGUI 中,称作"全局剪切域");
<LI>该设备上下文的基本操作函数(点、直线、多边形、填充、块操作等),及其上下文信息;
<LI>由程序设定的局部信息(绘图属性、映射关系和局部剪切域等)。 </LI></OL><BR><BR>
<P>所以,从程序员的角度看来,他所关心的仅仅是设备上下文本身的一小部分东西。</P>
<P><SPAN class=atitle3>2.1 设备上下文的获取和释放</SPAN><BR>在 MiniGUI
中,所有绘图相关的函数均需要有一个设备上下文。设备上下文可通过 GetClientDC 和 ReleaseDC 获取和释放。由 GetDC
所获取的设备上下文是针对整个窗口的,而 GetClientDC
所获取的设备上下文是针对窗口客户区,也就是说,前一个函数获得的设备上下文,其坐标原点位于窗口左上角,输出被限定在窗口范围之内;后一个函数获得的设备上下文,其坐标原点位于窗口客户区左上角,输出被限定在窗口客户区范围之内。下面是这三个函数的原型说明(include/gdi.h):</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1><TBODY>
<TR>
<TD><PRE><CODE>398 HDC GUIAPI GetDC (HWND hwnd);
399 HDC GUIAPI GetClientDC (HWND hwnd);
400 void GUIAPI ReleaseDC (HDC hdc);
</CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
<P>GetDC 和 GetClientDC 是从系统预留的若干个 DC 当中获得一个目前尚未使用的设备上下文。所以,应该注意如下两点:</P>
<OL class=n01>
<LI>在使用完成一个由 GetDC 返回的设备上下文之后,应该尽快调用 ReleaseDC 释放。
<LI>避免同时使用多个设备上下文,并避免在递归函数中调用 GetDC 和 GetClientDC。 </LI></OL><BR><BR>
<P>为了方便程序编写,提高绘图效率,MiniGUI
还提供了建立私有设备上下文的函数,所建立的设备上下文在整个窗口生存期内有效,从而免除了获取和释放的过程。这些函数的原型如下:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1><TBODY>
<TR>
<TD><PRE><CODE>403 HDC GUIAPI CreatePrivateDC (HWND hwnd);
404 HDC GUIAPI CreatePrivateClientDC (HWND hwnd);
405 HDC GUIAPI GetPrivateClientDC (HWND hwnd);
406 void GUIAPI DeletePrivateDC (HDC hdc);
</CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
<P>在建立主窗口时,如果主窗口的扩展风格中指定了 WS_EX_USEPRIVATEDC 风格,则 CreateMainWindow
函数会自动为该窗口的客户区建立私有设备上下文。通过 GetPrivateClientDC 函数,可以获得该设备上下文。对控件而言,如果控件类具有
CS_OWNDC 属性,则所有属于该控件类的控件将自动建立私有设备上下文。DeletePrivateDC
函数用来删除私有设备上下文。对上述两种情况,系统将在销毁窗口时自动调用 DeletePrivateDC 函数。</P>
<P>另外一个获取和释放设备上下文的方法是通过 BeginPaint 和 EndPaint 函数。这两个函数只能在处理 MSG_PAINT
的消息中调用。MiniGUI 在 BeginPaint 函数中通过 GetClientDC
获取客户区设备上下文,然后将窗口当前的无效区域选择到窗口的剪切区域中;而 EndPaint
函数则清空窗口的无效区域,并释放设备上下文。这两个函数的原型如下(include/window.h):</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1><TBODY>
<TR>
<TD><PRE><CODE>623 HDC GUIAPI BeginPaint(HWND hWnd);
624 void GUIAPI EndPaint(HWND hWnd, HDC hdc);
</CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
<P>因为 BeginPaint 函数将窗口的无效区域选择到了设备上下文中,所以,可以通过一些必要的优化来提高 MSG_PAINT
消息的处理效率。比如,某个程序要在窗口客户区中填充若干矩形,就可以在 MSG_PAINT 函数中如下处理:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1><TBODY>
<TR>
<TD><PRE><CODE>MSG_PAINT:
{
HDC hdc = BeginPaint (hWnd);
for (j = 0; j < 10; j ++) {
if (RectVisible (hdc, rcs + j)) {
FillBox (hdc, rcs[j].left, rcs[j].top, rcs [j].right, rcs [j].bottom);
}
}
EndPaint (hWnd, hdc);
return 0;
}
</CODE>
</PRE></TD></TR></TBODY></TABLE>这样可以避免不必要的重绘操作,从而提高绘图效率。<BR><BR>
<P><SPAN class=atitle3>2.2 系统内存中的设备上下文</SPAN><BR>MiniGUI
也提供了内存设备上下文的创建和销毁函数。利用内存设备上下文,可以在系统内存中建立一个类似显示内存的区域,然后在该区域中进行绘图操作,结束后再复制到显示内存中。这种绘图方法有许多好处,比如速度很快,减少直接操作显存造成的闪烁现象等等。不过,目前
MiniGUI
中只能建立和显示内存,也就是物理设备上下文一样的内存设备上下文。用来建立和销毁内存设备上下文的函数原型如下(include/gdi.h):</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1><TBODY>
<TR>
<TD><PRE><CODE>401 HDC GUIAPI CreateCompatibleDC (HDC hdc);
402 void GUIAPI DeleteCompatibleDC (HDC hdc);
</CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
<P><SPAN class=atitle3>2.3 屏幕设备上下文</SPAN><BR>MiniGUI
在启动之后,就建立了一个全局的屏幕设备上下文。该 DC
是针对整个屏幕的,并且没有任何预先定义的剪切域。在某些应用程序中,可以直接使用该设备上下文进行绘图,将大大提高绘图效率。在 MiniGUI
中,屏幕设备上下文用 HDC_SCREEN 标识,不需要进行任何获取和释放操作。</P>
<P><SPAN class=atitle3>2.4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -