基本上我的问题是我需要在需要时自动换行.不是.NET想要的时候.据我所知,如果我给它一个矩形来绘制,DrawString方法将自动自动换行.我需要控制它什么时候自动换行.所以我要说的是我想要绘制的字符串是Testing 1234.而且我想在看到空格时在新行上绘制文本.所以在这种情况下它会有两行 - 测试和1234.我猜我需要重新调整字符串的大小(以适应我的边界)和多个drawtring方法调用来绘制每一行.问题是我真的不知道该怎么做.对于GDI +,我是新手.
我想要做的是使用DrawString()方法将字符串绘制到位图.为此,我需要创建一个位图并从位图中获取Graphics对象,然后在该Graphics对象上调用DrawString().
问题是,我怎么知道,在我创建初始位图时,有多少像素宽和长来制作我的位图?
我知道这与MeasureString()有关,但是为了使用MeasureString(),我需要从位图中获取Graphics对象.在我创建位图之前我无法做到这一点,直到我知道尺寸才能做到这一点.这似乎是一个循环的悖论!
有人请帮我解决这个问题吗?
我一直在使用Affine Transform在我的java项目中旋转一个String,而我还不是一个经验丰富的程序员,所以我花了很长时间做一个看似很小的任务.旋转一个字符串.
现在我终于得到了或多或少的工作,正如我所希望的那样,除非它没有像我想要的那样精确地完成......
由于经过了大量的反复试验并阅读了仿射变换的描述,我仍然不太清楚它到底是做什么的.我想我现在所知道的是,我取一个字符串,并定义字符串的中心(或我想要旋转的点),但是矩阵在哪里?(显然我不知道嘿嘿)
任何人都可以试着向我解释仿射变换是如何工作的,换句话说就是java doc?也许它可以帮助我调整我的实现,而且,我真的很想知道:)
提前致谢.
我正在尝试在位图图像上绘制文本,我做了一些研究,发现.NET/GDI +不支持OTF字体.我在某处读到了你可以用TextRenderer.DrawTextGDI渲染OTF字体的地方,但我似乎无法弄清楚如何,质量也没有比较Graphics.DrawString.
首先,是否可以在VS中使用OTF字体或者我是否错误地阅读了某些内容?
其次,如果答案是TextRenderer.DrawText,我该如何使用OTF字体?看起来我必须使用System.Drawing.Font该类,但我不认为那些支持字体,这是问题,对吗?
如何使用GDI +(Graphics.DrawString)使字体像TTF字体一样清晰地呈现
使用Graphics.DrawString我能够使用RectangleF(具有指定的宽度,0高度)作为我的文本的边界,并正确包装文本.随着TextRenderer.DrawText,使用的能力RectangleF消失,只允许Rectangle哪些似乎不允许0高度,同时仍然允许文本显示(即文本必须在矩形内,文本包装不起作用).我做错了吗?
任何帮助将不胜感激.如果无法做到这一点,有没有办法转换OTF字体,或在TTF版本中在线找到Gotham字体系列?我真的需要这些字体!
我已经尝试了所有建议的方法来居中文本,但我似乎无法得到我想要的结果,同时居中一个人的角色.
我有一个矩形.在那个矩形中,我用DrawEllipse绘制一个圆圈.现在我想使用相同的矩形和DrawString在圆圈内绘制一个单个字符,使其完美居中.
这是我的基本代码:
StringFormat stringFormat = new StringFormat();
stringFormat.Alignment = StringAlignment.Center;
stringFormat.LineAlignment = StringAlignment.Center;
using (Graphics g = Graphics.FromImage(xImage))
{
g.SmoothingMode = SmoothingMode.AntiAlias;
g.TextRenderingHint = TextRenderingHint.AntiAlias;
g.CompositingQuality = CompositingQuality.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.FillEllipse(fillBrush, imageRect.X, imageRect.Y, imageRect.Width - 1, imageRect.Height - 1);
g.DrawString(Text, font, Brushes.White, imageRect, stringFormat);
}
Run Code Online (Sandbox Code Playgroud)
文本水平居中......但它没有正确地居中.使用像大写"I"这样的对称字符,我发现字符的顶部总是比字符的底部更接近矩形的边缘.距离可能至少增加50%.
我假设它正在为字符测量足够的空间,比如小写的"j",它会挂得更低.但是,由于我试图用单个字母创建一个图形图标,我想要更精确的居中.
我创建了一个新的Bitmap对象,现在想要使用GDI +绘制一些文本.所以我调用Graphics.DrawString(...).
问题是字符串的大小取决于Windows 7的DPI设置.有没有办法让我的文字绘图独立于Windows设置?
PS:DPI设置似乎只影响文本.例如,当更改DPI时,矩形尺寸相同...
我正在将文本绘制到DIB部分的屏幕外位图,该位图深度为32位并使用alpha通道(ARGB).我将像素直接绘制到内存中.然后,我创建一个Gdiplus Graphics对象,将我的内存DC传递给它,并使用Graphics :: DrawString绘制文本.这在正常情况下工作正常.但是,在远程桌面上,渲染的文本是完全透明的,即不是绘制任何颜色像素,而是可以看到文本的位置.有谁知道为什么会这样,以及如何解决它?
这是我的drawString例程:
void SplashScreen::drawString (MyString &ivText, Gdiplus::RectF &r,
Gdiplus::ARGB c, Gdiplus::StringAlignment align, Gdiplus::Font &fnt,
Gdiplus::Graphics &gfx)
{
Gdiplus::StringFormat fmt;
fmt.SetAlignment (align);
Gdiplus::SolidBrush brush (c);
wchar_t *wstr = new wchar_t [ivText.length()+1];
std::mbstowcs (wstr, ivText.cstr(), ivText.length()+1);
gfx.DrawString (wstr, ivText.length(), &fnt, r, &fmt, &brush);
delete wstr;
}
Run Code Online (Sandbox Code Playgroud)
这就是我创建DIB的方式:
BITMAPV5HEADER bhd;
memset (&bhd, 0, sizeof (bhd));
bhd.bV5Size = sizeof (BITMAPV5HEADER);
bhd.bV5Width = nWidth;
bhd.bV5Height = -nHeight; // negative height indicates top-down DIB
bhd.bV5Planes = 1;
bhd.bV5BitCount = 32;
bhd.bV5Compression = BI_BITFIELDS; …Run Code Online (Sandbox Code Playgroud) 这与字符串的大小无关.
我指定了绘制字符串的字体.现在我需要1个字符的精确宽度(以像素为单位).我只允许具有静态字符宽度的字体(W和i在绘制时具有相同的宽度).如果我使用大小为10的"Consolas",我的估计宽度为7.75f.我可以直接以某种方式检索此信息吗?
绘图时我不需要这些信息,但是当我想设置光标位置等时,我不知道光标下面有什么文字.
编辑: MeasureString给我11.99653作为字符宽度.不知道为什么.但我不能使用这个值.我估计7.75f而且非常精确.如果我想改变字体大小,我会遇到麻烦.
我Graphics.DrawString在ObjectListView中使用.我需要突出显示字符串中的一些单词(使其背景为黄色).可以这样做吗?
在使用之前Graphics.DrawString,我可以使用DefaultRenderer突出显示.但现在它不起作用.
我Graphics.DrawString在这里使用Task List样本
我正在研究简单的计数器.我的问题是drawString()方法在旧的字符串上绘制新的字符串.以前如何清除旧的?码...
package foobar;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
public class board extends JPanel implements Runnable {
Thread animator;
int count;
public board() {
this.setBackground( Color.WHITE );
count = 0;
animator = new Thread( this );
animator.start();
}
@Override
public void run() {
while( true ) {
++count;
repaint();
try {
animator.sleep( 1000 );
} catch ( InterruptedException e ) {}
}
}
@Override
public void paint( Graphics Graphics ) {
Graphics.drawString( Integer.toString( count ), 10, 10 );
}
} …Run Code Online (Sandbox Code Playgroud)