在我的应用程序中,我想创建一个位图来绘制,然后在多个表单上显示它。我需要集中协调位图的更新,所以我想基于计时器从MAIN做到这一点。在创建时,位图将重新调整为屏幕的完整大小。是否这种尝试调整大小会导致异常?
代码看起来很好,VS在我尝试调试之前不会抱怨,然后它会在创建位图的行上抛出“参数无效”异常。
我选择性地压缩了下面的代码:
using System;
using System.Windows.Forms;
using System.IO;
using System.Timers;
using System.Drawing;
using System.Reflection;
namespace MyProgram
{
/// <summary>
/// Class with program entry point.
/// </summary>
internal sealed class Program
{
/// <summary>
/// Program entry point.
/// </summary>
///
public struct Config {
public int Guns;
public int RedGunMin;
public int RedGunMax;
public int X;
public int Y;
public double PointRatio;
}
public static Config TC;
public static int OffsetX = 0;
public static int OffsetY = 0;
public static int Offset = 0;
public static int FirstPass = 0;
public static int XC = 0;
public static int YC = 0;
public static int RedVal = 0;
public static int GreenVal = 0;
public static int BlueVal = 0;
//Set up the random number seed
public static Random rand = new Random();
//Create a bitmap object (from the image in the resource file)
//***** The following line of code (70) generates the error: *****
public static System.Drawing.Bitmap myBitMap = new Bitmap(MyProgram.Resource1.Black600x600,Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y);
private static System.Timers.Timer myTimer;
[STAThread]
private static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
if (args.Length > 0)
{
string firstArgument = args[0].ToLower().Trim();
if (firstArgument == "/c") // Configuration mode
{
// TODO
}
else //(firstArgument == "/s") Full-screen mode, and default mode
{
//Read the config file
string strDocFolder;
TileConfig TC = new TileConfig();
strDocFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
//Check to see if the INI file exists
if (File.Exists(strDocFolder + "\\TileConfig.ini"))
{
//Read the configuration out of the file
TextReader TR = new StreamReader(strDocFolder + "\\TileConfig.ini");
TC.Guns = Convert.ToInt32(TR.ReadLine());
TC.RedGunMin = Convert.ToInt32(TR.ReadLine());
TC.RedGunMax = Convert.ToInt32(TR.ReadLine());
TC.X = Convert.ToInt32(TR.ReadLine());
TC.Y = Convert.ToInt32(TR.ReadLine());
TC.PointRatio = Convert.ToDouble(TR.ReadLine());
TR.Dispose();
}
else
{
//File does not exist, assign default values
TC.Guns = 3;
TC.RedGunMin = 0;
TC.RedGunMax = 255;
TC.X = 4;
TC.Y = 3;
TC.PointRatio = 0.10;
}
//Choose initial color
RedVal = rand.Next(0, 255);
ShowScreen();
myTimer.Start();
Application.Run();
}
}
}
当我将异常细节复制到剪贴板时,这就是我得到的:
System.TypeInitializationException was unhandled
HResult=-2146233036
Message=The type initializer for 'MyProgram.Program' threw an exception.
Source=MyProgram
TypeName=MyProgram.Program
StackTrace:
at MyProgram.Program.Main(String[] args)
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException: System.ArgumentException
HResult=-2147024809
Message=Parameter is not valid.
Source=System.Drawing
StackTrace:
at System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format)
at System.Drawing.Bitmap..ctor(Image original, Int32 width, Int32 height)
at MyProgram.Program..cctor() in C:\Users\Randy\Documents\SharpDevelop Projects\MyProgram\MyProgram\Program.cs:line 70
InnerException:
感谢您提供的任何帮助。你们是最伟大的,我非常感谢你们帮助人们的方式!
答案 0 :(得分:2)
异常详细信息清楚地表明,当您传递坐标时,您正在调用期望Bitmap
和width
的{{1}}构造函数 - height
和Screen.PrimaryScreen.Bounds.X
,最可能是0,因此无效大小。
如果您打算创建一个屏幕尺寸的位图,请改用Screen.PrimaryScreen.Bounds.Y
和Screen.PrimaryScreen.Bounds.Width
。或接受Screen.PrimaryScreen.Bounds.Height
并传递Size
的{{3}}。