В Visual Studio как я могу загрузить изображение .png из папки ресурсов проекта? - PullRequest
3 голосов
/ 10 января 2010

Я пытаюсь разработать приложение для Windows Mobile КПК , но у меня проблема с получением изображений .png из папки ресурсов.

У меня есть несколько изображений в папке ресурсов проекта, и все, что я хочу сделать, это нарисовать окно изображения программно (т.е. просто используя код) с фоновым изображением из папки ресурсов проекта.

Например:

  PictureBox pictureBoxBlueCounter = new PictureBox();

  //pictureBoxBlueCounter = new System.Windows.Forms.PictureBox();
  pictureBoxBlueCounter.Image = global::StrikeOutMobile.Properties.Resources.counter_square_blue;
  pictureBoxBlueCounter.Location = new System.Drawing.Point(30, 30);
  pictureBoxBlueCounter.Name = "pictureBoxblueCounter";
  pictureBoxBlueCounter.Size = new System.Drawing.Size(240, 210);
  pictureBoxBlueCounter.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
  Controls.Add(pictureBoxBlueCounter);

В настоящее время вышеприведенный код выдает мне ошибку 'TargetInvocationException is nothandled', и я понятия не имею, как ее исправить!

Как я могу решить эту проблему?

Вот полная информация об TargetInvocationException:

  System.Reflection.TargetInvocationException was unhandled
  Message="TargetInvocationException"
  StackTrace:
       at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
       at System.Reflection.ConstructorInfo.Invoke(Object[] parameters)
       at System.Resources.ResourceReader.CreateResource(Type objType, Type[] ctorParamTypes, Object[] ctorParameters)
       at System.Resources.ResourceReader.LoadBitmap(Int32 typeIndex)
       at System.Resources.ResourceReader.LoadObjectV2(Int32 pos, ResourceTypeCode& typeCode)
       at System.Resources.ResourceReader.LoadObject(Int32 pos, ResourceTypeCode& typeCode)
       at System.Resources.RuntimeResourceSet.GetObject(String key, Boolean ignoreCase)
       at System.Resources.ResourceManager.GetObject(String name, CultureInfo culture)
       at StrikeOutMobile.Properties.Resources.get_counter_square_blue()
       at StrikeOutMobile.FormGameBoard.drawBlue()
       at StrikeOutMobile.FormGameBoard.menuItemPosition1_Click(Object sender, EventArgs e)
       at System.Windows.Forms.MenuItem.OnClick(EventArgs e)
       at System.Windows.Forms.Menu.ProcessMnuProc(Control ctlThis, WM wm, Int32 wParam, Int32 lParam)
       at System.Windows.Forms.Form.WnProc(WM wm, Int32 wParam, Int32 lParam)
       at System.Windows.Forms.Control._InternalWnProc(WM wm, Int32 wParam, Int32 lParam)
       at Microsoft.AGL.Forms.EVL.EnterModalDialog(IntPtr hwnModal)
       at System.Windows.Forms.Form.ShowDialog()
       at StrikeOutMobile.Main.menuItem1_Click(Object sender, EventArgs e)
       at System.Windows.Forms.MenuItem.OnClick(EventArgs e)
       at System.Windows.Forms.Menu.ProcessMnuProc(Control ctlThis, WM wm, Int32 wParam, Int32 lParam)
       at System.Windows.Forms.Form.WnProc(WM wm, Int32 wParam, Int32 lParam)
       at System.Windows.Forms.Control._InternalWnProc(WM wm, Int32 wParam, Int32 lParam)
       at Microsoft.AGL.Forms.EVL.EnterMainLoop(IntPtr hwnMain)
       at System.Windows.Forms.Application.Run(Form fm)
       at StrikeOutMobile.Program.Main()

  InnerException:
       Message="Exception"
       StackTrace:
            at Microsoft.AGL.Common.MISC.HandleAr(PAL_ERROR ar)
            at System.Drawing.Bitmap._InitFromMemoryStream(MemoryStream mstream)
            at System.Drawing.Bitmap..ctor(Stream stream)
            at System.Reflection.RuntimeConstructorInfo.InternalInvoke(RuntimeConstructorInfo rtci, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)
            at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
            at System.Reflection.ConstructorInfo.Invoke(Object[] parameters)
            at System.Resources.ResourceReader.CreateResource(Type objType, Type[] ctorParamTypes, Object[] ctorParameters)
            at System.Resources.ResourceReader.LoadBitmap(Int32 typeIndex)
            at System.Resources.ResourceReader.LoadObjectV2(Int32 pos, ResourceTypeCode& typeCode)
            at System.Resources.ResourceReader.LoadObject(Int32 pos, ResourceTypeCode& typeCode)
            at System.Resources.RuntimeResourceSet.GetObject(String key, Boolean ignoreCase)
            at System.Resources.ResourceManager.GetObject(String name, CultureInfo culture)
            at StrikeOutMobile.Properties.Resources.get_counter_square_blue()
            at StrikeOutMobile.FormGameBoard.drawBlue()
            at StrikeOutMobile.FormGameBoard.menuItemPosition1_Click(Object sender, EventArgs e)
            at System.Windows.Forms.MenuItem.OnClick(EventArgs e)
            at System.Windows.Forms.Menu.ProcessMnuProc(Control ctlThis, WM wm, Int32 wParam, Int32 lParam)
            at System.Windows.Forms.Form.WnProc(WM wm, Int32 wParam, Int32 lParam)
            at System.Windows.Forms.Control._InternalWnProc(WM wm, Int32 wParam, Int32 lParam)
            at Microsoft.AGL.Forms.EVL.EnterModalDialog(IntPtr hwnModal)
            at System.Windows.Forms.Form.ShowDialog()
            at StrikeOutMobile.Main.menuItem1_Click(Object sender, EventArgs e)
            at System.Windows.Forms.MenuItem.OnClick(EventArgs e)
            at System.Windows.Forms.Menu.ProcessMnuProc(Control ctlThis, WM wm, Int32 wParam, Int32 lParam)
            at System.Windows.Forms.Form.WnProc(WM wm, Int32 wParam, Int32 lParam)
            at System.Windows.Forms.Control._InternalWnProc(WM wm, Int32 wParam, Int32 lParam)
            at Microsoft.AGL.Forms.EVL.EnterMainLoop(IntPtr hwnMain)
            at System.Windows.Forms.Application.Run(Form fm)
            at StrikeOutMobile.Program.Main()

Ответы [ 5 ]

2 голосов
/ 10 января 2010

ОК, как обычно, я сделал гору из холма-крота!

Вот как я решил свою проблему:

private void menuItemPosition1_Click(object sender, EventArgs e)
{
    Graphics graphicsCanvas = this.pictureBoxBoard.CreateGraphics();
    graphicsCanvas.DrawImage(global::StrikeOutMobile.Properties.Resources.counter_square_blue, 60, 60);
}

private void pictureBoxBoard_Paint(object sender, PaintEventArgs e)
{

}

Оказывается, мне нужен холст для рисования (как в J2ME), но в отличие от J2ME этот холст на самом деле ничего не должен делать.

Понятия не имею, почему это работает, но работает!

Также я хотел бы сказать большое спасибо Qberticus и Нику Геррере за ваши усилия!

1 голос
/ 12 января 2010

Вы ранее распоряжались ресурсом? Вы получаете такой же вид трассировки стека на внутреннем исключении, если вы избавляетесь от растрового изображения из этого вида файла ресурсов. Я сделал это сегодня, и это было весело!

Ну ... вид

Кстати, вы получаете TargetInvocationException, если во время отражения возникает исключение, которое динамически вызывает функцию. Вы заметите, что ResourceReader.CreateResource () делает это. Оборачивает исходное исключение (получить через свойство .InnerException)

1 голос
/ 10 января 2010

Должно Controls.Add(pictureBoxBoard); быть Controls.Add(pictureBoxBlueCounter);?

EDIT:

Может быть, это контрольный вопрос. Попробуйте обратиться к pictureBoxBlueCounter.Handle перед тем, как установить pictureBoxBlueCounter.Image и this.Handle перед вами Add, и посмотрите, не в этом ли проблема.

EDIT2:

Проверьте файл Resources.Designer.cs и убедитесь, что все в порядке. Возможно, имя файла изменилось и не отражено в Resources.resx

EDIT3:

Есть ли на вашем устройстве gdiplus.dll? Подсказка отсюда

EDIT4:

Вы делаете это в потоке пользовательского интерфейса? Если нет, то это может быть проблемой.

0 голосов
/ 15 января 2010

У меня был еще один из них на этой неделе. НЕТ ИДЕИ, что вызвало это, не копался в этом, поскольку я был в спешке. Я также получил загадочное сообщение «Исключение».

Некоторые вещи, которые я наблюдал.

  • Происходит только при отладке в приложении.
  • Всегда одно и то же изображение (640x310)
  • Изображение было в формате .png, как и остальные (другое было 640x310, что было хорошо).
  • Преобразование изображения в jpeg, похоже, решило проблему.
0 голосов
/ 10 января 2010

Я посмотрел на стек, и это явно специфический код .NET Compact Framework, так как последние несколько методов нигде не встречаются в стандартных сборках. Я никогда не работал с .NET CF в Windows Mobile, но мое предположение состояло бы в том, что на КПК не хватило памяти при загрузке растрового изображения.

Попробуйте использовать крошечный файл .png и посмотрите, имеет ли это значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...