📄 10.html
字号:
NULL)<BR> return;<BR> //
锁定绘图表面<BR> lock =
ds->Lock(ds);<BR> assert((lock
& JAWT_LOCK_ERROR) ==
0);<BR><BR> //
获取绘图表面的信息<BR> dsi =
ds->GetDrawingSurfaceInfo(ds);<BR><BR> //
获取特定平台的绘图信息<BR> dsi_win =
(JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;<BR><BR> HDC
hdc =
dsi_win->hdc;<BR> HWND
hWnd =
dsi_win->hwnd;<BR> //////////////////////////////<BR> //
!!! 在此处进行绘图 !!!
//<BR> //////////////////////////////<BR> if(hrgn
==
NULL)<BR> {<BR> RECT
rcBounds;<BR> GetWindowRect(hWnd,&rcBounds);<BR> long
xLeft = 0; //
用于缩放宏<BR> long
yTop =
0;<BR> long
xScale =
rcBounds.right-rcBounds.left;<BR> long
yScale =
rcBounds.bottom-rcBounds.top;<BR> hrgn
= CreateEllipticRgn(X(10), Y(15), X(90),
Y(95));<BR> SetWindowRgn(GetParent(hWnd),hrgn,TRUE);<BR> InvalidateRect(hWnd,NULL,TRUE);<BR> }
else
{<BR> DrawSmiley(hWnd,hdc);<BR> }<BR> //
释放绘图表面的信息<BR> ds->FreeDrawingSurfaceInfo(dsi);<BR> //
为绘图表面解锁<BR> ds->Unlock(ds);<BR> //
释放绘图表面<BR> awt.FreeDrawingSurface(ds);<BR>}<BR><BR>void
DrawSmiley(HWND hWnd, HDC
hdc)<BR>{<BR> RECT
rcBounds;<BR> GetWindowRect(hWnd,&rcBounds);<BR> long
xLeft = 0; //
用于缩放宏<BR> long yTop =
0;<BR> long xScale =
rcBounds.right-rcBounds.left;<BR> long
yScale =
rcBounds.bottom-rcBounds.top;<BR><BR> //
基于控制大小的画笔宽度<BR> int
iPenWidth = max(CX(5),
CY(5));<BR> HBRUSH
brushBlack;<BR> HBRUSH
brushYellow;<BR> HPEN
penBlack = CreatePen(PS_SOLID, iPenWidth,
RGB(0x00,0x00,0x00));<BR> //
用于绘制填充椭圆的空画笔<BR> HPEN
penNull = CreatePen(PS_NULL, 0,
(COLORREF)0);<BR><BR> brushBlack
=
CreateSolidBrush(RGB(0x00,0x00,0x00));<BR> brushYellow
=
CreateSolidBrush(RGB(0xff,0xff,0x00));<BR><BR> HPEN
pPenSave = (HPEN)SelectObject(hdc,
penBlack);<BR> HBRUSH
pBrushSave =
(HBRUSH)SelectObject(hdc,brushYellow);<BR> Ellipse(hdc,X(10),
Y(15), X(90), Y(95)); //
头部<BR><BR> Arc(hdc,X(25),
Y(10), X(75), Y(80), //
嘴部(微笑)<BR> X(35),
Y(70), X(65),
Y(70));<BR><BR> SelectObject(hdc,&penNull);
//
无绘图宽度<BR> SelectObject(hdc,&brushBlack);<BR><BR> Ellipse(hdc,X(57),
Y(35), X(65),
Y(50));<BR> Ellipse(hdc,X(35),
Y(35), X(43), Y(50)); //
右眼<BR> Ellipse(hdc,X(46),
Y(50), X(54), Y(65)); //
鼻子<BR><BR> SetBkMode(hdc,TRANSPARENT);
//
使用前景颜色<BR><BR> SelectObject(hdc,pBrushSave);<BR> SelectObject(hdc,pPenSave);<BR>}<BR></CODE>
<P>这里的关键数据结构是 <CODE>JAWT</CODE>,它是在 <CODE>jawt.h</CODE> 中定义的(通过
<CODE>jawt_md.h</CODE> 包含在内)。它使程序可以访问本地代码在基于 Java 的 GUI
组件上绘图所需的所有信息。本地方法的第一部分是套式:置入 <CODE>JAWT</CODE> 结构,获得一个
<CODE>JAWT_Win32DrawingSurfaceInfo</CODE> 结构,锁定表面(请一次只使用一种绘图工具!),然后,获取一个
<CODE>JAWT_DrawingSurfaceInfo</CODE> 结构,该结构包含特定平台下绘图所必需的指针(在
<CODE>platformInfo</CODE>字段中)。它也包含绘图界面的矩形界限框及当前剪切区域。有关详细信息,请查看
<CODE>jawt.h</CODE> 和 <CODE>jawt_md.h</CODE> (请参阅下面标题为 “构建环境”的部分)。
<P><CODE>Java_MyWindow_paint</CODE> 是一个入口点,JVM 通过调用它来绘制
<CODE>MyWindow</CODE>。辅助函数 <CODE>DrawSmiley</CODE> 使用 Win32
调用来完成实际的绘制工作。要在您的应用程序中包含 <CODE>GetDrawingSurfaceInfo</CODE>,请使用外部库
<CODE>jawt.lib</CODE>(请参阅 “构建环境”)。
<P><FONT size=+1><STRONG>第四步:编辑 BUILD.BAT</STRONG></FONT><BR>在运行
<CODE>BUILD.BAT</CODE> 之前首先对它进行编辑,并像如下所示的那样,为您的 Visual C++ 及 JDK1.3
设置路径。<CODE>BUILD.BAT</CODE> 对 <CODE>MyWindow.java</CODE> 进行编译,生成
<CODE>MyWindow.h</CODE>,然后将 <CODE>MyWindow.CPP</CODE> 编译为
<CODE>MyWindow.DLL</CODE>。
<P><CODE>SET DEVSTUDIO=D:\Program Files\Microsoft Visual
Studio\VC98<BR>SET JDK13=D:\JDK1.3<BR></CODE>
<P>好了,一切准备就绪。在运行该样例之前,请确保
<CODE>MyWindow.DLL</CODE>、<CODE>\JDK1.3\BIN</CODE> 及
<CODE>\JDK1.3\JRE\BIN</CODE> 都在 <CODE>PATH</CODE> 内,还要保证当前目录在
<CODE>CLASSPATH</CODE> 中;这将确保 <CODE>MyWindow.class</CODE> 会被成功加载。在确信
<CODE>PATH</CODE> 和 <CODE>CLASSPATH</CODE> 都设置妥当后,在命令行输入 <CODE>java
MyWindow</CODE> 来运行此应用程序。为方便您的使用,<CODE>window.zip</CODE> 中包含了一个批处理文件
<CODE>RUN.BAT</CODE>(请参阅<A
href="http://www.cn.ibm.com/developerWorks/java/jw-tips/tip086/index.shtml#resources">参考资源</A>)。要为
JDK 1.3 设置<CODE>PATH</CODE> 和 <CODE>CLASSPATH</CODE>,请编辑
<CODE>RUN.BAT</CODE>。
<P><FONT size=+1><STRONG>构建环境</STRONG></FONT><BR>
<UL>
<LI><STRONG>头文件:</STRONG>在 JDK 的 include 目录中新增了专用于 Windows 的 C 头文件。它们是:
<P><CODE> include/jawt.h.<BR> include/win32/jawt_md.h.<BR></CODE>
<P>依据 JavaSoft 网站的说明,这些头文件并不是 Java 2
平台正式规范的组成部分;提供这些头文件只是为希望用一种标准化方法访问本地绘图功能的开发人员提供一种便利。我认为这表示将 JDK
移植到其它平台的厂商可以不提供这个 API。
<P></P>
<LI><STRONG>库:</STRONG>一个以 <CODE>jawt.lib</CODE> 命名的新库已添加到 SDK
的库目录中。如前所述,这个库包含一个用于把 J2AWT 包含到您的应用程序中所需要的入口点。例如,要链接到
<CODE>GetDrawingSurfaceInfo</CODE> 入口点,您需要在您的程序中包含
<CODE>jawt.lib</CODE>。
<P></P>
<LI><STRONG>工具:</STRONG><CODE>javah</CODE> 工具用来为 Java 类的本地函数生成 C/C++
头文件,<CODE>javac</CODE> 工具用来编译 Java 源文件。
<P></P></LI></UL>
<P><FONT size=+1><STRONG>小结</STRONG></FONT><BR>将原有软件系统移植到 Java
中并不容易,尤其是当原有软件包含高性能的绘图器时。Java 2 AWT
本地接口使得分阶段移植变得较为容易,它允许您首先移植对性能要求不高的代码,然后再移植关键的绘制代码。它同时使第三方窗口小部件开发厂商更能严肃地看待针对
Java 产品的开发。有了 Java 2 AWT 本地应用程序接口,您就可以移植原有的 GUI
代码,并更快地完成开发,这样就不会牺牲您为提高本地代码关键部分的性能而作的投资。 <!-- end body text -->
<P><A name=bio>
<TBODY>
<TR>
<TD vAlign=top><STRONG><FONT
size=-1>作者简介 </FONT></STRONG><BR></a><A
href="mailto:davanum.srinivas@javaworld.com">Davanum Srinivas</A>
目前在 <A href="http://www.cai.com/">Computer Associates</A>
公司从事软件开发工作。 </TD></TR></TBODY><P><A name=resources><STRONG>参考资源</STRONG></A>
<UL>
<LI>本压缩文件包含本文章涉及的所有源代码和一个批处理文件: <BR><A
href="window.zip">window.zip</A>
<LI>Sun 公司对 AWT 本地接口的介绍: <BR><A
href="http://java.sun.com/products/jdk/1.3/AWT_Native_Interface.html">http://java.sun.com/products/jdk/1.3/AWT_Native_Interface.html</A>
<LI>SUN 公司在 Java 2 SDK,版本 1.3 中所作的增强: <BR><A
href="http://java.sun.com/products/jdk/1.3/docs/guide/awt/enhancements.html">http://java.sun.com/products/jdk/1.3/docs/guide/awt/enhancements.html</A>
<LI>Sun 公司对本地绘图 JAWT 接口的改进,post-Kestrel(只需免费注册): <BR><A
href="http://developer.java.sun.com/developer/bugParade/bugs/4281429.html">http://developer.java.sun.com/developer/bugParade/bugs/4281429.html</A>
<LI>"Enhance your Java application with Java Native Interface (JNI),"
TalLyron(<EM>JavaWorld,</EM>1999 年 10 月): <BR><A
href="http://www.javaworld.com/javaworld/jw-10-1999/jw-10-jni.html">http://www.javaworld.com/javaworld/jw-10-1999/jw-10-jni.html</A>
<LI>"Java Tip 23: Write native methods," John D. Mitchell
<EM>(JavaWorld):</EM> <BR><A
href="http://www.javaworld.com/javaworld/javatips/jw-javatip23.html">http://www.javaworld.com/javaworld/javatips/jw-javatip23.html</A>
</LI></UL>
</td>
</tr>
</td>
</tr>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -