richTextBox.DrawToBitmap不会绘制包含文本?如果我有一个richTextBox并在其上运行DrawToBitmap,它不会在richTextBox中绘制任何文本。位图b=newBitmap(rtb.Width,rtb.Height);inputControl.DrawToBitmap(b,newRectangle(0,0,b.Width,b.Height));有没有什么办法解决这一问题?这篇文章在谷歌排名第二。似乎有你想要的。因为我认为您在接受表单元素作为方法参数的问题中使用了这个问题?,最好做这样的事情。if(inputControlisRichTextBox){//在这里做特定的魔术}else{//一般情况}您可以递归检查包含RichTextBox的控件boolContainsOrIsRichTextBox(ControlinputControl){if(inputControlisRichTextBox)returntrue;foreach(inputControl.Controls中的控制控件){如果(ContainsOrIsRichTextBox(控件))返回true;}返回假;我没有编译它,并且有一种方法可以在不冒StackOverflowException风险的情况下完成它,但这应该让你开始。我知道这相对较旧,但我在http://www.windows-tech.info/3/8ffaf21eed5de2d4.php找到了一个可行的解决方案://确保RTB完全绘制Bitmapbmp=newBitmap(rtb.Width,rtb.Height);使用(Graphicsgr=Graphics.FromImage(bmp)){gr.CopyFromScreen(rtb.PointToScreen(Point.Empty),Point.Empty,rtb.Size);}返回bmp;来自RichTextBox.DrawToBitmap()的MSDN库文章:此方法与此类无关。说本机Windowsrichedit控件不支持WM_PRINT的一种令人讨厌的方式。截取屏幕截图是一种选择,Novikov为您提供了指向我的回答的链接。我在这里找到了一个相关的答案:Howtoprintrichtextboxcontentwithcorrectformattingonanydevicecontenxt?我更改了它以将我的屏幕外RichTextBox呈现为位图。这样我就可以在屏幕外创建位图并将其发送到OpenGL。//转换.NET框架使用的单位(1/100英寸)//和Win32API调用使用的单位(缇1/1440英寸)privateconstdoubleanInch=14.4;[StructLayout(LayoutKind.Sequential)]privatestructRECT{publicintLeft;公共诠释顶部;publicint对;公共诠释底部;}[StructLayout(LayoutKind.Sequential)]privatestructCHARRANGE{publicintcpMin;//范围的第一个字符(0代表文档的开始)publicintcpMax;//范围的最后一个字符(-1表示文档结尾)}[StructLayout(LayoutKind.Sequential)]privatestructFORMATRANGE{publicIntPtrhdc;//在publicIntPtrhdcTarget上绘制的实际DC;//用于确定文本格式的目标DCpublicRECTrc;//要绘制到(缇)的DC区域publicRECTrcPage;//整个DC的区域(页面大小)(以缇为单位)publicCHARRANGEchrg;//要绘制的文本范围(参见前面的声明)}privateconstintWM_USER=0x0400;私有常量EM_FORMATRANGE=WM_USER+57;[DllImport("USER32.dll")]privatestaticexternIntPtrSendMessage(IntPtrhWnd,intmsg,IntPtrwp,IntPtrlp);//////将指定的RichTextBox渲染到指定的位图上//////RichTextBox渲染///位图将RichTextBox渲染到publicvoidRenderToBitmap(RichTextBoxtextBox,Bitmapbitmap){//设置要渲染的区域是整个位图RECT矩形;rect.Left=0;rect.Top=0;rect.Right=(int)(bitmap.Width*anInch);rect.Bottom=(int)(bitmap.Height*anInch);图形g=Graphics.FromImage(位图);IntPtrhdc=g.GetHdc();FORMATRANGEfmtRange;fmtRange.chrg.cpMin=textBox.GetCharIndexFromPosition(新点(0,0));fmtRange.chrg.cpMax=textBox.GetCharIndexFromPosition(newPoint(bitmap.Width,bitmap.Height));fmtRange.hdc=hdc;//使用相同的DC进行测量和渲染fmtRange.hdcTarget=hdc;fmtRange.rc=矩形;fmtRange.rcPage=rect;IntPtrlparam=Marshal.AllocCoTaskMem(Marshal.SizeOf(fmtRange));元帅结构eToPtr(fmtRange,lparam,false);//将控件渲染到位图SendMessage(textBox.Handle,EM_FORMATRANGE,newIntPtr(1),lparam);//清理Marshal.FreeCoTaskMem(lparam);g.ReleaseHdc(hdc);值得一提的是,RichTextBox控件的更高版本正确支持DrawToBitmap方法;它还提高了性能并具有更多功能如果分享的所有内容对您有用并且您需要了解更多有关C#学习教程的信息,希望您多加关注它—internalclassRichTextBox5:RichTextBox{[DllImport("kernel32.dll",CharSet=CharSet.Auto)]staticexternIntPtrLoadLibrary(stringlpFileName);protectedoverrideCreateParamsCreateParams{get{CreateParamscparams=base.CreateParams;if(LoadLibrary("msftedit.dll")!=IntPtr.Zero){cparams.ClassName="RICHEDIT50W";}返回参数;}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
