图形程序设计

http://hi.baidu.com/filoplume/blog/item/8201f9dda3e701dc8d1029bb.html

字体

可以通过一个字体名(font face name)指定一种字体。字体名由"Helvetica"这样的字体家族名(font family name)和一个可选的"Bold"后缀组成。例如"Helvetica"和"Helvetica Bold"属于"Helvetica"家族的字体。

要想知道某台特定计算机上所允许使用的字体,就需要调用Graphics Environment类中的getAvailableFontFamilyNames方法,这个方法将返回一个String型数组,其中包含了所有可用的字体名。

GraphicsEnvironment类描述了用户系统的图形环境,为了得到这个类的对象,需要调用静态的getLocalGraphicsEnvironment方法。下列的程序将打印出系统上所有字体名:

//v1ch7\ListFonts.java

import java.awt.*;

public class ListFonts
{
public static void main(String[] args)
{
String[] fontNames = GraphicsEnvironment
.getLocalGraphicsEnvironment()
.getAvailableFontFamilyNames();

for (String fontName : fontNames)
System.out.println(fontName);
}
}
无法知道用户是否安装了某种特定外观的字体。此外,一些字体还有仿制品。为了创建一个公共基准,AWT定义了5个落体字体名:SansSerif, serif, Monospaced, Dialog, DialogInput。这些字体将被映射到客户机上的实际字体。比如在Windows系统中,SansSerif将被映射到Arial上。

要想使用某种字体绘制字符,必须首先利用指定的字体名、字体风格和字体大小来创建一个Font类对象。下面是构造一个Font对象的例子: Font helvb14 = new Font("Helvetica", Font.BOLD, 14);
Font构造器中,第一个参数提供字体名,可以用逻辑字体。另外第二个参数可以指定字体的风格(常规,加粗,斜体,加粗斜体),下面是几个字体风格的值:
Font.PLAIN, Font.BOLD, Font.ITALIC, Font.BOLD + Font.ITALIC

JDK1.3开始,可以读取TrueType字体,这需要一个字体输入流,可以从文件或者URL读取,最后调用静态方法Font.createFont:
URL url = new URL(http://www.fonts.com.Wingbats.ttf);
InputStream in = url.openStream();
Font f = Font.createFont(Font.TRUERYPE_FONT, in);
上面定义的字体是常规字体,大小为1。可以使用deriveFont方法定义字体的大小:
Font df = f.deriveFont(14.0F);
deriveFont(float f) 设置字体大小
deriveFont(int i) 设置字体风格 //deriveFont(14)设置风格为斜体

我们希望把字符串绘制在面板的中央,怎么办?需要知道字符串占据的宽和高的像素数量,这取决于这些:
·使用的字体
·字符串
·绘制字体的设备
要想得到屏幕设备字体属性的描述对象,需要调用Graphics2D类的getFontRenderContext方法,返回FontRenderContext类对象,可以直接把这个对象传递给Font类的getStringBounds方法:
FontRenderContext context = g2.getFontRenderContext();
Rectangle2D bounds = f.getStringBounds(message, context);


为了解释这个矩形,需要清楚几个术语。基线(baseline)是一条虚构的线。上坡度(ascent)是从基线到坡顶(ascenter)的距离。下坡度是从基线到坡底的距离。
行间距(leading)是某一行的坡底与其下一行的坡顶之间的空隙。字体的高度是连续两个基线的距离,它等于下坡度+行间距+上坡度。
getStringBounds方法返回的举行宽度是字符串水平方向的宽度。矩形的高度是上坡度、下坡度、行间距的总和。该矩形始于字符串的基线,矩形顶部的y坐标为负值。因此,可以采用下面的方法获得字符串的宽度、高度和上坡度。
double stringWidth = bounds.getWidth();
double stringHeight = bounds.getHeight();
double ascent = -bounds.getY();
如果需要知道下坡度或行间距,可以使用Font类的getLineMetrics方法。这个方法将返回一个LineMetrics类对象,获得下坡度和行间距的方法是:
LineMetrics metrics = f.getLineMetrics(message, context);
float descent = metrics.getDescent();
float leading = metrics.getLeading();

这个代码使用了这些信息可以把字符串显示在包围它的面板中央:
FontRenderContext context = g2.getFontRenderContext();
Rectangle2D bounds = f.getStringBounds(message, context);
//(x, y) = top left corner of text
double x = (getWidth() - bounds.getWidth())/2;
double y = (getHeight() - bounds.getHeight())/2;
double ascent = -bounds.getY();
double baseY = y + ascent;
g2.drawString(message, (int)x, (int)baseY);

java.awt.Font
·Font(String name, int style, int size)
name 字体名或者逻辑字体名
style 字体风格
size 字体大小
·String getFontName() 返回字体名
·String getFamily() 返回字体家族名
·String getName() 返回字体名。如果创建时候使用了逻辑字体,就返回逻辑名
·Rectangle2D getStringBounds(String s, FontRenderContext context)
·LineMetrics getLineMetrics(String s, FontRenderContext context)
·Font deriveFont(int style)
·Font deriveFont(float size)
·Font deriveFont(int style, float size)

java.awt.font.LineMetrics
·float getAscent() 上坡度
·float getDescent() 下坡度
·float getLeading() 行间距——从一行文本底端到下一行文本顶端之间的空隙
·float getHeight() 返回字体的总高度,两条基线的距离 下坡度+行间距+上坡度

java.awt.Graphics
·void setFont(Font font)
·void drawString(String str, int x, int y)

java.awt.Graphics2D
·FontRenderContext setRenderContext()
·void drawString(String str, int x, int y)

//v1ch7\FontTest.java

import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import javax.swing.*;

public class FontTest
{
public static void main(String[] args)
{
FontFrame frame = new FontFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

/**
A frame with a text message panel
*/
class FontFrame extends JFrame
{
public FontFrame()
{
setTitle("FontTest");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

// add panel to frame

FontPanel panel = new FontPanel();
add(panel);
}

public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
}

/**
A panel that shows a centered message in a box.
*/
class FontPanel extends JPanel
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;

String message = "Hello, World!";

Font f = new Font("Serif", Font.BOLD, 36);
g2.setFont(f);

// measure the size of the message

FontRenderContext context = g2.getFontRenderContext();
Rectangle2D bounds = f.getStringBounds(message, context);

// set (x,y) = top left corner of text

double x = (getWidth() - bounds.getWidth()) / 2;
double y = (getHeight() - bounds.getHeight()) / 2;

// add ascent to y to reach the baseline

double ascent = -bounds.getY();
double baseY = y + ascent;

// draw the message

g2.drawString(message, (int) x, (int) baseY);

g2.setPaint(Color.GRAY);

// draw the baseline

g2.draw(new Line2D.Double(x, baseY, x + bounds.getWidth(), baseY));

// draw the enclosing rectangle

Rectangle2D rect = new Rectangle2D.Double(x, y, bounds.getWidth(), bounds.getHeight());
g2.draw(rect);
}
}
【图书描述】: GDI+是新一代的图形接口。如果要设计.NET Framework图形应用程序,就必须使用GDI+。本书是一本为.NET开发人员讲授如何编写Windows和Web图形应用程序的专著,书中全面介绍了GDI+和Windows图形程序设计的基本知识和GDI+图形程序设计的各个方面。 本书适合于开发GDI+图形应用程序的初、中级程序员阅读,书中给出了大量用C#语言编写的可重用示例代码,可以使读者更快地掌握书中所介绍的各种知识和概念。本书也可以作为大专院校相关课程的重要辅导教材。 【编辑推荐】: 《GDI+图形程序设计》是为.NET开发人员介绍如何编写Windows和Web图形应用程序的指南用书。通过大量详尽的实例,本书使有经验的程序员可以更深入地理解在.NET Framework类库中定义和整个GDI+API。   本书从介绍GDI+Windows图形程序设计的基本知识开始,其核心是对一些实际问题的指导,包括如何使用Windows Forms及如何优化GDI+的性能。本书通过一些例子来说明如何开发真实世界的工具,如GDI+Painter、GDI+Editro、ImageViewer和ImageAnimator等。另外,作者还给出了大量使用C#语言编写的可重用示例代码,读者可从网上下载完整的C#和Visual Basic.NET源代码,并可通过这些源代码查看书中各图的彩色效果 第1章 GDI+ ——下一代图形接口 1.1 理解GDI+ 1.2 探索GDI+ 的功能 1.3 从GDI的角度学习GDI+ 1.4 .NET中的GDI+ 名称空间和类 总结 第2章 第一个GDI+ 应用程序 2.1 绘制表面 2.2 坐标系统 2.3 指南——第一个GDI+ 应用程序 2.4 一些基本的GDI+ 对象 总结 第3章 Graphics类 3.1 Graphics类的属性 3.2 Graphics类的方法 3.3 GDI+ Painter应用程序 3.4 绘制饼图 总结 第4章 使用画笔和钢笔 4.1 理解和使用画笔 4.2 在GDI+ 中使用钢笔 4.3 使用钢笔进行变形 4.4 使用画笔进行变形 4.5 系统钢笔和系统画笔 4.6 一个真实世界的例子 ——在GDI+ Painter应用程序中添加颜色、钢笔和画笔 总结 第5章 颜色、字体和文本 5.1 访问Graphics对象 5.2 使用颜色 5.3 使用字体 5.4 使用文本和字符串 5.5 渲染文本的质量和性能 5.6 高级版式 5.7 一个简单的文本编辑器 5.8 文本变形 总结 第6章 矩形和区域 6.1 Rectangle结构体 6.2 Region类 6.3 区域和剪辑 6.4 剪辑区域示例 6.5 区域、非矩形窗体和控件 总结 第7章 图像处理 7.1 光栅图像和矢量图像 7.2 使用图像 7.3 操作图像 7.4 在GDI+ 中播放动画 7.5 使用位图 7.6 使用图标 7.7 扭曲图像 7.8 绘制透明的图形对象 7.9 查看多个图像 7.10 使用图片框查看图像 7.11 使用不同的大小保存图像 总结 第8章 高级图像处理 8.1 渲染位图的一部分 8.2 使用图元文件 8.3 使用颜色对象应用颜色映射 8.4 图像属性和ImageAttributes类 8.5 编码器参数与图像格式 总结 第9章 高级二维图形 9.1 线帽和线条样式 9.2 理解并使用图形路径 9.3 图形容器 9.4 读取图像的元数据 9.5 混合 9.6 Alpha混合 9.7 其他高级二维主题 总结 第10章 变形 10.1 坐标系统 10.2 变形的类型 10.3 Matrix类与变形 10.4 Graphics类与变形 10.5 全局变形、局部变形和复合变形 10.6 图像变形 10.7 颜色变形和颜色矩阵 10.8 图像处理中的矩阵操作 10.9 文本变形 10.10 变形顺序的重要性 总结 第11章 打印 11.1 简要地回顾使用Microsoft Windows进行打印的历史 11.2 打印过程概述 11.3 第一个打印应用程序 11.4 打印机的设置 11.5 PrintDocument和Print事件 11.6 打印文本 11.7 打印图形 11.8 打印对话框 11.9 自定义页面设置 11.10 打印多个页面 11.11 页边打印——注意事项 11.12 进入细节——自定义控制和打印控制器 总结 第12章 开发GDI+ Web应用程序 12.1 创建第一个ASP.NET Web应用程序 12.2 第一个图形Web应用程序 12.3 绘制简单的图形 12.4 在Web上绘制图像 12.5 绘制曲线图 12.6 绘制饼图 总结 第13章 GDI+ 的最佳实践及性能技术 13.1 理解渲染过程 13.2 双缓存和无抖动绘图 13.3 理解SetStyle方法 13.4 绘图过程的质量与性能 总结 第14章 GDI互操作性 14.1 在受控环境中使用GDI 14.2 在受控代码中使用GDI的注意事项 总结 第15章 其他GDI+ 示例 15.1 设计交互式GUI应用程序 15.2 绘制具有形状的窗体和Windows控件 15.3 为绘制的图像添加版权信息 15.4 从流或数据库读取及写入图像 15.5 创建自绘制的列表控件 总结 附录A .NET中的异常处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值