- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
您好,我正在学习使用 C# VS 2010 EE 进行编程,并且正在申请填写预印表格。这种形式在不同的坐标中有几个地方。纸上的三个盒子是多行 5” W x 2” H 盒子。
我已经为纸质表单上的每个位置创建了带有一个 TextBox
的 Windows 表单。
问题是,在这些多行文本框中输入信息时,我需要知道纸上还有多少行可以输入更多文本,以及何时停止输入,因为预印框中没有更多可用空间.
我做了很多搜索,但我发现的所有内容都是关于屏幕上的测量,与纸上的最终结果不符。
换句话说,我需要知道如何在文本框中输入字符串时找出纸上的字符串尺寸,并将其与预打印表单上的可用空间进行比较,以便我可以在它之前停下来越过纸上方框的底部边界。
纸上的第一个框宽 5 英寸,高 2 英寸,从“new RectangleF(60.0F, 200.0F, 560.0F, 200.0F)
”开始。我知道这些数字是百分之一英寸。
所有这些,考虑到我无法通过字符数量限制文本框,因为并非所有字符都占用相同的空间,例如 H != I;
M != l;
等
预先感谢您的帮助。今天 2011 年 9 月 5 日,根据您的意见和建议,我更改了代码以使用 Graphics.MeasureString 。
这是我现在拥有的带有 Graphics.MeasureString 且只有一个 richTextBox 的代码:在 printDocument1_PrintPage 事件中运行良好,但我不知道如何在 richTextBox1_TextChanged 事件中运行。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Printing;//Needed for the PrintDocument()
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Printing
{
public partial class Form1 : Form
{
private Font printFont1;
string strPrintText;
public Form1()
{
InitializeComponent();
}
private void cmdPrint_Click(object sender, EventArgs e)
{
try
{
PrintDocument pdocument = new PrintDocument();
pdocument.PrintPage += new PrintPageEventHandler
(this.printDocument1_PrintPage);
pdocument.Print();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public void printDocument1_PrintPage (object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{
strPrintText = richTextBox1.Text.ToString();
printFont1 = new Font("Times New Roman", 10); //I had to remove this line from the btnPrintAnexo1_Click
Graphics g = e.Graphics;
StringFormat format1 = new StringFormat();
RectangleF rectfText;
int iCharactersFitted, iLinesFitted;
rectfText = new RectangleF(60.0F, 200.0F, 560.0F, 200.0F);
// The following e.Graphics.DrawRectangle is
// just for debuging with printpreview
e.Graphics.DrawRectangle(new Pen(Color.Black, 1F),
rectfText.X, rectfText.Y, rectfText.Width, rectfText.Height);
format1.Trimming = StringTrimming.Word; //Word wrapping
//The next line of code "StringFormatFlags.LineLimit" was commented so the condition "iLinesFitted > 12" could be taken into account by the MessageBox
// Use next line of code if you don't want to show last line, which will be clipped, in rectangleF
//format1.FormatFlags = StringFormatFlags.LineLimit;
//Don't use this next line of code. Some how it gave me a wrong linesFilled
//g.MeasureString(strPrintText, font, rectfFull.Size,
//StringFormat.GenericTypographic, out iCharactersFitted, out iLinesFilled);
//Use this one instead:
//Here is where we get the quantity of characters and lines used
g.MeasureString(strPrintText, printFont1, rectfText.Size, format1, out iCharactersFitted, out iLinesFitted);
if (strPrintText.Length == 0)
{
e.Cancel = true;
return;
}
if (iLinesFitted > 12)
{
MessageBox.Show("Too many lines in richTextBox1.\nPlease reduce text entered.");
e.Cancel = true;
return;
}
g.DrawString(strPrintText, printFont1, Brushes.Black, rectfText, format1);
g.DrawString("iLinesFilled = Lines in the rectangle: " + iLinesFitted.ToString(), printFont1, Brushes.Black,
rectfText.X, rectfText.Height + rectfText.Y);
g.DrawString("iCharactersFitted = Characters in the rectangle: " + iCharactersFitted.ToString(), printFont1, Brushes.Black,
rectfText.X, rectfText.Height + rectfText.Y + printFont1.Height);
}
private void richTextBox1_TextChanged(object sender, EventArgs e)
{
//***I don’t know what to type here.***
if (iLinesFitted == 13)
{
MessageBox.Show("Too many lines in richTextBox1.\nPlease erase some characters.");
}
}
private void cmdPrintPreview_Click(object sender, EventArgs e)
{
printPreviewDialog1.ShowDialog();
}
private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
// strPrintText = richTextBox1.Text;
}
}
}
最佳答案
我认为这就是您所追求的。
请确保您的图形对象是 PrintDocument。
using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
namespace GraphicsHandler
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
// Check the width of the text whenever it is changed.
if (checkTextWillFit(textBox1.Text) == true)
{
MessageBox.Show("Entered test is too wide, please reduce the number of characters.");
}
}
private bool checkTextWillFit(string enteredText)
{
// Create a handle to the graphics property of the PrintPage object
Graphics g = pd.PrinterSettings.CreateMeasurementGraphics();
// Set up a font to be used in the measurement
Font myFont = new Font("Arial", 12, FontStyle.Regular, GraphicsUnit.Millimeter);
// Measure the size of the string using the selected font
// Return true if it is too large
if (g.MeasureString(enteredText, myFont).Width > 100)
{
return true;
}
else
{
return false;
}
}
PrintDocument pd = null;
private void Form1_Load(object sender, EventArgs e)
{
// Initialise the print documnet used to render the printed page
pd = new PrintDocument();
// Create the event handler for when the page is printed
pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
}
void pd_PrintPage(object sender, PrintPageEventArgs e)
{
// Page printing logic here
}
}
}
关于c# - 如何在打印之前预先测量字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7054922/
有没有更好的方法用 PHP 将数据输出到 html 页面? 如果我想在 php 中用一些 var 制作一个 div,我会写类似的东西 print (''.$var.''); 或 echo "''.$v
我可以使用 java awt print 来打印文档/文件而不是使用 javax print 吗?我发现在 java awt print 中有一个选项可以使用 AttributedString 将内容
目前我通过以下方式运行 R 脚本: R --slave argument1 argument2 ... 我想知道 R 中关于如何退出脚本并发出警告的最佳实践,q() 会这样做吗? if(!file.
谁能告诉我如何编写一个程序,用 gcc 编译时打印 c ,用 g++ 编译时打印 c++? 最佳答案 #ifdef __cplusplus printf("c++\n"); #else
我需要支持在 KitKat 设备上打印,但我的目标 SDK 是 13(无法更改)。 特别是我需要打印一个 webview。 这是用于打印 webview 的 API: http://developer
我正在尝试创建一个简单的函数,其中 python 将根据您的年份输入计算年龄。我已经尝试了几种方法,但我没有运气 atm。 附:对不起,我是新手。 ame = input(" Enter your n
JavaFX 2.0 是否支持打印?我有一个文本区域,我从中获取文本然后我想打印它,但似乎没有这个功能。 当然,这里我说的是打印到打印机。 :) 最佳答案 尚不支持。作为一种解决方法,您可以使用 Ja
我试图找出printOn的重点。我查看了一些实现它的类,看起来它只是帮助打印不同数据类型的单位。这是准确的吗? 如果是这样,有人能指出我如何为我自己的类(class)实现这一点的正确方向吗?我将在可能
我无法让 IE 打印我的 Canvas (使用 excanvas 生成)...我使用的是最新版本的 excanvas。 http://dl.dropbox.com/u/997831/canvas.ht
我搜索了很多但没有人回答我的问题,我读到在这样的信号处理程序中使用 cout 是不安全的: void ctrlZHandler(int sig_num) { //SIGTSTP-18
我有兴趣打印一系列查询。我有以下代码。 start = datetime.datetime(2012, 2, 2, 6, 35, 6, 764) end = datetime.datetime(201
public class javaClass { public static void main(String [] arg) { String row1 = "A____A"
我需要写入前一行的命令,例如不带\n 的 print()。 下面是一些示例代码: a=0 print("Random string value") if a==0: print_to_prev
我有一个使用 UIKit 和 Objective C 的旧 iOS 应用程序,我目前正在将其移植到 SwiftUI 和 Swift。一切都很顺利,我喜欢 Swift 和 SwiftUI。该应用程序已经
我创建了一个求和函数,它接受一个开始编号和一个结束编号,并返回这两点之间的总和答案 def print_sum_equations(start_number,end_number):
在 Perl 6 中,print 和有什么区别? , put和 say ? 我怎么看 print 5不同,但 put 5和 say 5看起来一样。 最佳答案 put $a就像 print $a.Str
我正在使用 here 中的 getOrgChart 库,我正在尝试打印整个图表,而不仅仅是可见部分。不幸的是,当使用标准库打印功能时,它只会打印出第一部分,而我不知道如何打印整个图表(该图表相当宽,大
我制作了一个非常适合 A4 页面的 View 。现在我想打印它。请注意,我没有使用drawRect或类似的东西,只是一个带有 subview 和文本标签的普通 View 。我的问题是,我对该 View
由于 Cocoa-Java 已弃用,我正在将 Cocoa-Java 代码迁移到 Cocoa + JNI。该代码打印存储在文件中的图像。新的 Cocoa 代码基本上是: NSImage *image =
这个问题已经有答案了: Printing a TDBGrid (4 个回答) 已关闭 6 年前。 如何在不安装或下载组件的情况下打印 DBGrid? 或者 如何将 DBGrid 的数据放入 RichE
我是一名优秀的程序员,十分优秀!