Using embedded resource icon as app icon in C# - c#

I'm trying to figure a way to specify my C# application to use an embedded resource (icon) as my application icon (the one displayed for taskbar, task switch, etc).
Yet, as I already embedded my icon in a resource, I can manage to use it in my forms but not with my application yet.
In fact, if someone could first tell me where I'll be able to set this (which file) by hand instead of using the VS2010 GUI to specify it, that'd be a great start!
Yet, my icon is available in these 2 ways :
{{Namespace}}.Properties.Resources.c_name.ico and in {{Namespace}}.Refs.c_name.ico (as a property of a public static class inside a class library).

Windows is an unmanaged operating system that doesn't know beans about managed resources. The only icon it can display is one that's embedded as an unmanaged resource. You can see what unmanaged resources look like in Visual Studio. Use File + Open + File and pick a .NET exe file (won't work in Express). A .NET program should have three of them, an icon, a manifest that declares the program compatible with UAC and a Version resource. This is all done automatically by the compiler, note for example how the Version resource properties match the attributes you set in AssemblyInfo.cs
The IDE makes it simple to set the icon for a program, you use Project + Properties, Application tab, Icon setting. Just pick the same .ico file as you embedded as a managed resource. Forget about trying to share, it cannot work by design.

Simply set
Icon=yourNamespace.Properties.Resources.yourEmbeddedIconName;

System.Drawing.Icon.FromHandle(Properties.Resources.EliminarNota.GetHicon());

Related

Assigning an image to the composite custom control c# VS .NET 2013

The problem concerns Windows Forms.
I have no idea how to do it. I've tried following:
1) Add a Bitmap (CarControl.bmp) do the solution, then set BuildAction to Embedded Resource and add the ToolBoxBitmapAttribute like:
[ToolboxBitmap(typeof(CarControl),"CarControl")]
2) Going into Properties, then in Resources section I've added some images. Still doesn't work.
Can anybody help?
Naming is very important, otherwise it does not work.
[ToolboxBitmap(typeof(CarControl), "Resources.CarControl.png")]
Another important note:
If you open the solution of your CarControl you will always see the default gear icons for the controls of your actual build. But if you make a build and you add the controls of this (released) library to the Toolbox either by drag-and-dropping the dll or by Right click/Choose Items..., then the icon will appear.
If you did everything well, you will able to find the embedded resource in the compiled .dll when you open it with Reflector or other disassembler tool. The following example is from System.dll:
You should find a <DefaultNamespace of your project>.<Your resources folder>.CarControl.png here.

Visual C# icon issue

I have recently finished a Visual c# project. During the process I tried multiple icons for the form and for the icon you see on your desktop. I found one that I was gonna use for both, but for some reason the icon that you see on your desktop is the old one that I used previously even though I changed it in Properties -> Application -> Icon and Manifest
Windows File Explorer uses an icon cache. You may need to clear this cache to get it to refresh.

Windows Forms: Form not localized

We have successfully localized our windows-forms application. One form refuses to use the localized resources and is always shown with the embedded resources. I checked the following points:
The forms Localizable attribute is true
At runtime the UI-culture is set correctly
The satellite assembly is in the correct location
With SysInternals process explorer I verified that the process uses the satellite assembly
I opened the satellite assembly with IL-Spy and checked that it contains the translated resources
In the debugger I stepped into Microsofts ComponentResourceManager.ApplyResources Method for a button. It finds the text property but as the code is optimized I cannot see the really interesting things.
All other forms (different assemblies) appear with the correct language, only this one ...
I hope someone out there has a helpful idea.
Just stumbled upon the same issue but could solve it.
I just imported the localized resx files into the project. So the *.de.resx were part of the project, but the localized resources were not applied to all forms.
Referring to http://msdn.microsoft.com/library/y99d1cd3%28v=vs.110%29.aspx, the localized resource files should appear beneath the form (as a sub item).
So my solution was:
- go through all forms, change language from Default to German and back to Default.
- as a result, the *.de.resx files were listed as sub items of the forms
- then overwrite the just created *.de.resx files with the localized ones
Then it works for all forms. I have no idea, though, why it worked before for 3 forms out of 4.
What is the recommended way to add a new language to a Windows Forms application? Do I really need to click through all forms of my application for creating the empty resx files for the new language? Of course, I could edit the project file manually...

Using the same icon for .exe and Form

In my WinForms app, if I set an icon for my app and an icon for my Form, the icon appears twice in my executable. Is it possible to avoid this?
(This question has been asked before, here, but the answers didn't seem to solve the problem. vanmelle's answer appears to extract only one icon (e.g., 16x16), Sunlight's answer extracts only the 32x32, and lc's answer doesn't solve the problem: there is still a duplicated icon in the executable.)
If it's not possible to accomplish this task, why is this? What is it about using the same icon for an executable and a Form that's so hard in WinForms?
This is an inevitable consequence of running managed code on a completely unmanaged operating system. Windows Explorer only knows how to read unmanaged resources. You can see what they look like, use File + Open + File in Visual Studio and select your .exe. You'll typically see three resource groups listed there:
RT_MANIFEST, contains the manifest that tells Windows that your program is Vista aware
Version, contains the file version resource with values derived from your AssemblyInfo.cs file. You see its content when you use Properties + Details tab in Explorer. Note how the super important [AssemblyVersion] isn't visible in Vista and up
Icon, contains the icon you added.
This unmanaged resource data is separate from the managed resources you added. Managed resources are compiled into the assembly manifest. Unmanaged resources are stored in the .rsrc section of the image file. You can override the auto-generated version with the /win32res command line option. Which requires a .res file, a binary file that is generated from a .rc resource script by the rc.exe resource compiler. An age old Windows SDK tool.
This may change some day, the super-secret Midori project is a rumored to focus on a managed operating system. For now, we'll have to make do with the glue.

Multiple Icons into c# 2.0 WinApp

I have small problem with my .net 2.0 winforms application.
I want to embed a few different icons to app.
There are also other requirements:
must be automatic rebuildable by
ms-build; using external gui apps
for preparation isn't allowed
application must contain versioninfo.
After embeding multiple icons, I want to register let's say two file associations to application documents / extension files.
[Registry]
...
Root: HKCR; Subkey: "MyFileExt\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\MyApp.exe,2"
where "2" it's icon index.
I know that I need to use somehow old-style Win32 resource file.
I also found somewhere that if using Visual Studio 2005 it's possible to add 'native resource file' but it doesn't exist in 2008 anymore.
Is it possible to meet all this requirements and if yes - how?
The solution is actually quite simple, although it required that I think back to my first encounter with RC files...
In a plain text file, you can write the following
#include <windows.h>
// The following is some Win32 candy for
// -- the Windows styles in XP, Vista & 7
// does the UAC too.
1 RT_MANIFEST "App.manifest"
// -- the versioning info, which we find usually in
// AssemblyInfo.cs, but we need to add this one
// because including Win32 resources overrides the .cs
// file!
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,0
PRODUCTVERSION 1,0,0,0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS VS_FF_DEBUG
FILEOS VOS__WINDOWS32
FILETYPE VFT_DLL
FILESUBTYPE VFT2_UNKNOWN
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904E4" // en-US/cp-1252
BEGIN
VALUE "CompanyName", "My Company"
VALUE "ProductName", "My C# App"
VALUE "ProductVersion", "1.0.0.0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1252 // en-US in ANSI (cp-1252)
END
END
END
// And now the icons.
// Note that the icon with the lowest ID
// Will be used as the icon in the Explorer.
101 ICON "Icon1.ico"
102 ICON "Icon2.ico"
103 ICON "Icon3.ico"
(Details about the VERSIONINFO structure can be found in MSDN: VERSIONINFO structure)
You compile using rc, which should either be part of VS, or in the Windows Platform SDK.
The result of the compilation of your .rc file is a .res file which can be included in the properties page of your C# project -- or add the following in the .csproj file itself.
<Win32ResourceFile>C:\path\to\my\resource\file.res</Win32ResourceFile>
Compile your project and look in the explorer, the info and icons should be there.
The CSC compiler also provides a /win32res switch that embeds the .res file into you app.
Hope this helps!
Just like in 2005, you can add the icons to the resources (via the project properties). After you do that, go to the icons you have added in the project explorer each icon has a BuildAction property of how that resource is stored and utilized.
I think what you are looking for is the EmbeddedResource value of the BuildAction property.
New WinForms App -> Expand Properties in the Solution Explorer -> Double click on Resources.resx -> Click Add Resource (The drop down also includes adding existing Resources)
These should be available to you now in the visual designer or in code using Properties.Resources.[Your Resource Name Here]
Hope that helps.
When I need multiple icons I embedded the png/bmp (or whatever image type it is) as a image resource in the application. Go to Project -> Properties -> Resoruces in Visual Studio.
The in code you can do the following at run-time:
buttonPlay.Image = Properties.Resources.Navigation_Media_Pause;
or
buttonPlay.Image = Properties.Resources.Navigation_Media_Play;
Assumning that you called the 2 image resources "Navigation_Media_Pause" and "Navigation_Media_Play".
Compile the application, then open the .exe with visual studio, you can then add the all the icons you want.
There is also something you can do with win32 resource files in c# but i cannot find the lik for that at the moment
I decided to put all icons into separate old-school plain win32 c++ *.dll.
It's more convienient and I don't need to do any tricks with versioninfo/win32resources.

Categories