📄 基于 linux 和 minigui 的嵌入式系统软件开发指南(五).htm
字号:
return;
bitmap.bmType = BMP_TYPE_ALPHACHANNEL;
/* 位图的 Alpha 混和 */
start_tick = GetTickCount ();
count = 1000;
while (count--) {
tox = rand() % 800;
toy = rand() % 800;
/* 设置随机 Alpha 通道值 */
bitmap.bmAlpha = rand() % 256;
/* 显示到窗口 DC 上 */
FillBoxWithBitmap (hdc, tox, toy, 0, 0, &bitmap);
}
end_tick = GetTickCount ();
TellSpeed (hwnd, start_tick, end_tick, "Alpha Blended Bitmap", 1000);
bitmap.bmType = BMP_TYPE_ALPHACHANNEL | BMP_TYPE_COLORKEY;
/* 取第一个象素点值,并设置为透明象素值 */
bitmap.bmColorKey = GetPixelInBitmap (&bitmap, 0, 0);
/* 透明及 Alpha 混和 */
start_tick = GetTickCount ();
count = 1000;
while (count--) {
tox = rand() % 800;
toy = rand() % 800;
/* 设置一个随机 Alpha 通道值 */
bitmap.bmAlpha = rand() % 256;
/* 显示到窗口 DC 上 */
FillBoxWithBitmap (hdc, tox, toy, 0, 0, &bitmap);
}
end_tick = GetTickCount ();
TellSpeed (hwnd, start_tick, end_tick, "Alpha Blended Transparent Bitmap", 1000);
UnloadBitmap (&bitmap);
</CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
<P>你也可以通过 CreateMemDCFromBitmap 函数将某个 BITMAP 对象转换成内存 DC
对象。该函数的原型如下(src/gdi.h):</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1><TBODY>
<TR>
<TD><PRE><CODE>HDC GUIAPI CreateMemDCFromBitmap (HDC hdc, BITMAP* bmp);
</CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
<P>需要注意的是,从 BITMAP 对象创建的内存 DC 直接使用 BITMAP 对象中的 bmBits
所指向的内存,该内存存在于系统内存,而不是显示内存中。</P>
<P>和 BITMAP 相关的 MYBITMAP 结构,新的 GDI 也做了一些增强。MYBITMAP 可以看成是设备无关的位图结构,你也可以利用
CreateMemDCFromMyBitmap 函数将一个 MYBITMAP 对象转换成内存 DC。该函数的原型如下(src/gdi.h):</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1><TBODY>
<TR>
<TD><PRE><CODE><BR>
HDC GUIAPI CreateMemDCFromMyBitmap (HDC hdc, MYBITMAP* mybmp);<BR>
</CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
<P>需要注意的是,许多 GAL 引擎不能对系统内存到显示内存的 BitBlt 操作提供硬件加速,所以,FillBoxWithBitmap
函数,以及从 BITMAP 对象或者 MYBITMAP 对象创建的内存 DC 无法通过硬件加速功能快速 BitBlt 到其他 DC
上。如果希望达到这样的效果,可以通过预先创建的建立于显示内存中的 DC 进行快速的 BitBlt 运算。</P>
<P><SPAN class=atitle3>4.5 新的 GDI 绘图函数</SPAN><BR>除了光栅操作意外,还添加了一些有用的 GDI
绘图函数,包括 FillRect、FillCircle
等等,我们将在接下来的开发中,将继续添加诸如椭圆、圆弧、三次样条曲线、多边形填充等高级绘图函数。目前新增的 GDI 函数有:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1><TBODY>
<TR>
<TD><PRE><CODE>void GUIAPI FillRect (HDC hdc, int x, int y, int w, int h);
void GUIAPI FillCircle (HDC hdc, int sx, int sy, int r);
BOOL GUIAPI ScaleBitmap (BITMAP* dst, const BITMAP* src);
BOOL GUIAPI GetBitmapFromDC (HDC hdc, int x, int y, int w, int h, BITMAP* bmp);
gal_pixel GUIAPI GetPixelInBitmap (const BITMAP* bmp, int x, int y);
BOOL GUIAPI SetPixelInBitmap (const BITMAP* bmp, int x, int y, gal_pixel pixel);
</CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
<OL class=n01>
<LI>FillRect 函数填充指定矩形,受当前光栅操作影响。
<LI>FillCircle 函数填充指定的圆,受当前光栅操作影响。
<LI>ScaleBitmap 函数将源 BITMAP 对象进行伸缩处理。
<LI>GetBitmapFromDC 函数将指定矩形范围内的象素复制到 BITMAP 对象中。
<LI>GetPixelInBitmap 函数获得 BITMAP 对象中指定位置的象素值。
<LI>SetPixelInBitmap 函数设置 BITMAP 对象中指定位置的象素值。 </LI></OL>
<P><A id=5 name=5><SPAN class=atitle2>5 其他</SPAN></A><BR>尽管在 1.1.0Pre4
以及其后版本对 MiniGUI 的 GAL 和 GDI 进行了大规模的改造,但在新版本中仍然可以利用老的 GAL 和 GDI
接口,从而提供对低端显示设备的支持。需要注意的是,虽然新 GDI API
当中的许多结构和函数具有相同的名称,但某些函数已经被重新定义。所以,在编写应用程序的时候,要特别注意这一点。比如:新的 mde
演示程序当中,就利用了在 <minigui/config.h> 中定义的 _USE_NEWGAL 宏来判断是否使用新的 GAL 和
GDI 函数,如下所示:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1><TBODY>
<TR>
<TD><PRE><CODE>#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
......
#ifdef _USE_NEWGAL
SetRasterOperation (hdc, ROP_XOR);
FillRect (hdc, 0, 0, 200, 200);
#else
/* Not implemented */
#endif
......</CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
<P><A id=6 name=6><SPAN class=atitle2>6 小结</SPAN></A><BR>本文重点介绍了在 MiniGUI
1.1.0 版本开发过程中新增的 GAL、GDI 功能和接口。新的 GAL 和
GDI重点针对高端图形应用进行了优化和功能增强,其中包括透明处理、Alpha 混和等高级特性,并且能够对硬件加速功能提供良好支持。本文分别就 GAL
和 GDI 的关系、GAL 的功能特性、GDI 的增强接口等方面较为全面地介绍了新的 GAL 和 GDI 接口。希望能够对程序开发有所帮助。</P><!-- Make author heading singular or plural as needed -->
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><A id=author1 name=author1><SPAN class=atitle2>关于作者</SPAN></A>
<BR>魏永明(<A
href="mailto:ymwei@minigui.org">ymwei@minigui.org</A>),男,27
岁,工学硕士。国内最有影响的自由软件项目之一--MiniGUI 的创始人及主要开发人员。著有《Linux 实用教程》与《学用 Linux
与 Windows NT》,并主持翻译了《Red Hat Linux 奥秘》、《Linux 编程宝典》 等大量优秀的 Linux
技术著作。是清华大学 AKA Linux
编程技术系列讲座的主讲人。</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE>
<TBODY>
<TR>
<TD width=10><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(五).files/c.gif" width=10
border=0></TD></TR></TBODY></TABLE><BR clear=all><IMG height=10 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(五).files/c.gif" width=100 border=0><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR vAlign=top>
<TD align=right width="100%"><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part5/index.shtml#top">到页首</A></TD>
<TD width=5><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(五).files/c.gif" width=5
border=0></TD></TR>
<TR vAlign=top>
<TD bgColor=#000000 colSpan=2><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(五).files/c.gif" width=100
border=0></TD></TR>
<TR vAlign=top>
<TD bgColor=#ffffff colSpan=2><IMG height=8 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(五).files/c.gif" width=100
border=0></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=10 width="100%" border=0>
<TBODY>
<TR vAlign=top>
<TD>
<FORM action=/developerWorks/cn/cnratings.nsf/RateArticle?CreateDocument
method=post><INPUT type=hidden
value="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南--MiniGUI 1.1.0 版本引入的新 GDI 功能和函数"
name=ArticleTitle> <INPUT type=hidden value=linux name=Zone> <INPUT
type=hidden value=/developerWorks/cn/thankyou/feedback-linux.html
name=RedirectURL> <A id=rating name=rating><B>您对这篇文章的看法如何?</B></A>
<TABLE cellSpacing=0 cellPadding=0 width=600 border=0>
<TBODY>
<TR>
<TD colSpan=5><IMG height=8 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(五).files/c.gif" width=100
border=0></TD></TR>
<TR vAlign=top>
<TD width="16%"><INPUT type=radio value=5 name=Rating>真棒!(5)</TD>
<TD width="20%"><INPUT type=radio value=4 name=Rating>好材料 (4)</TD>
<TD width="24%"><INPUT type=radio value=3 name=Rating>一般;尚可 (3)</TD>
<TD width="22%"><INPUT type=radio value=2 name=Rating>需提高 (2)</TD>
<TD width="18%"><INPUT type=radio value=1 name=Rating>太差!
(1)</TD></TR></TBODY></TABLE><BR><B>建议?</B><BR><TEXTAREA name=Comments rows=5 wrap=virtual cols=60></TEXTAREA><BR><BR><INPUT type=submit value=提交反馈意见></FORM></TD></TR>
<TR vAlign=top>
<TD bgColor=#ffffff><IMG height=8 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(五).files/c.gif" width=100
border=0></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD align=right>(c) Copyright IBM Corp. 2001, (c) Copyright IBM China
2001, All Right Reserved</TD></TR>
<TR vAlign=top>
<TD class=bbg height=21> <A class=mainlink
href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/index.shtml&origin=dwhead">关于
IBM</A><SPAN class=divider> | </SPAN><A
class=mainlink
href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/privacy/index.shtml&origin=dwhead">隐私条约</A><SPAN
class=divider> | </SPAN><A class=mainlink
href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/legal/index.shtml&origin=dwhead">使用条款</A><SPAN
class=divider> | </SPAN><A class=mainlink
href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/contact/index.shtml&origin=dwhead">联系
IBM</A></TD></TR></TBODY></TABLE>
<SCRIPT language=JavaScript1.2
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(五).files/stats.js"
type=text/javascript></SCRIPT>
<NOSCRIPT><IMG height=1 alt=""
src="D:\新建文件夹\基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(五).files\c(1).gif" width=1
border=0></NOSCRIPT> </A></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -