2008-11-13 36 views
11

Lưu ý: Câu hỏi Using 256 x 256 Vista icon in application xử lý việc sử dụng biểu tượng "Vista" làm biểu tượng của ứng dụng. Câu hỏi này đề cập đến việc vẽ một biểu tượng Vista theo cách thủ công.Biểu mẫu Windows .NET 2.0: Cách vẽ biểu tượng PNG?

Lưu ý: Câu hỏi WinForms .NET 2.0: How to paint the proper sized icon? đề cập đến việc vẽ biểu tượng Vista được tải từ tệp. Câu hỏi này đề cập đến việc vẽ một biểu tượng Vista được tải từ một nguồn.


tôi đã bao gồm một biểu tượng trong dự án Visual Studio của tôi có định dạng khác nhau:

  • 16x16
  • 32x32
  • 48x48
  • 256x256 (PNG nén)

Bây giờ muốn vẽ phiên bản 256x256. Không có điều nào sau đây tôi đã thử làm việc.

Sau đây thu hút các định dạng 32x32 kéo dài đến 256x256:

Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat; 
e.Graphics.DrawIcon(ico, new Rectangle(0, 0, 256, 256)); 

Sau đây thu hút các định dạng 32x32 không được căng sẵn:

Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat; 
e.Graphics.DrawIconUnstretched(ico, new Rectangle(0, 0, 256, 256)); 

Sau đây thu hút các định dạng 32x32 kéo dài đến 256x256 :

Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat; 
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(0, 0, 256, 256)); 

Sau đây thu hút các định dạng 48x48 kéo dài đến 256x256:

Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat; 
e.Graphics.DrawIcon(
     new Icon(ico, new Size(256, 256)), 
     new Rectangle(0, 0, 256, 256)); 

Làm thế nào để vẽ các biểu tượng định dạng 256x256?


Ghi chú:

  1. Biểu tượng không đến từ một tập tin, vì vậy PInvoking LoadImage() sẽ không giúp đỡ.

  2. Biểu tượng không phải là biểu tượng được liên kết với tệp, vì vậy PInvoking SHGetFileInfo() will không được trợ giúp. Cũng sẽ không using Icon.ExtractAssociatedIcon.

  3. Tôi cũng không cố gắng tác giả các biểu tượng có định dạng 256x256 khi chạy, vì vậy libraries designed to do that sẽ không trợ giúp.

    2: Câu hỏi WinForms .NET 2.0: How to paint the proper sized icon?

+0

mở cửa trở lại - những 'trùng lặp 'chủ đề không có câu trả lời đúng/được chấp nhận cho câu hỏi cụ thể này –

+0

Đó là một câu hỏi khác. Điều đó đề cập đến việc sử dụng biểu tượng Vista làm biểu tượng của ứng dụng. Điều này đề cập đến việc vẽ một biểu tượng Vista trong một đồ họa. –

+0

Bạn có thể pastebin (slexy.org hoạt động) một mẫu 256^2 PNG biểu tượng resx tập tin để tôi có thể hack đi lúc này (hoặc cho tôi biết làm thế nào để làm cho một cách dễ dàng) – TheSoftwareJedi

Trả lời

0

Tôi hỏi một câu hỏi tương tự trong một thời gian trước, nhưng với không nhiều may mắn. Một số câu trả lời trong bài viết của tôi có thể giúp bạn, có một cách nhưng có vẻ khá khó khăn.Liên kết đến bài đăng của tôi here

+0

Câu trả lời có được sử dụng để trích xuất biểu tượng được liên kết cho một tệp; mà sẽ chỉ cung cấp cho bạn một biểu tượng vista nếu bạn đang trên vista. Nó cũng đòi hỏi bạn đang nhận được biểu tượng từ một tập tin. Đây là biểu tượng tôi đã viết. –

3

Biểu tượng ResourceManager tải biểu tượng dựa trên các bit được lưu trữ trong tài nguyên. Tuy nhiên, cách nó xử lý tải sẽ không cho phép bạn truy cập vào biểu tượng 256x256 (thông tin này không thực hiện theo cách của mình vào System.Drawing.Icon mà bạn đang nhận được trở lại).

Tôi rất tiếc phải làm bạn thất vọng, nhưng cách duy nhất hoạt động mà tôi biết là tải biểu tượng qua P/Gọi LoadImage và làm việc với tệp (vâng, tôi biết, đó không phải là những gì bạn tìm kiếm). Vì vậy, câu hỏi mới nên là: làm thế nào để trích xuất các bit của một tài nguyên nhất định để tôi có thể lưu trữ chúng vào một tập tin? Tôi lo sợ rằng điều này là không thể, hoặc, đã thực hiện một số bước qua System.Resources.ResourceReader, như dữ liệu tài nguyên có vẻ là một tập hợp các đối tượng NET được tuần tự hóa.

Dù sao, đối với những người có thể đủ khả năng để tải các biểu tượng từ một tập tin .ico (và cho bản thân mình, như một tài liệu tham khảo trong tương lai trên như thế nào để tải 256x256 biểu tượng), gọi IconConverter.LoadIcon:

using System.Runtime.InteropServices; 

static class IconConverter 
{ 
    public static System.Drawing.Icon LoadIcon(string path, int width, int height) 
    { 
     System.IntPtr hIcon; 
     hIcon = LoadImage (System.IntPtr.Zero, path, IMAGE_ICON, width, height, 
          LR_LOADFROMFILE); 
     if (hIcon == System.IntPtr.Zero) 
     { 
      return null; 
     } 
     return System.Drawing.Icon.FromHandle (hIcon); 
    } 

    const int IMAGE_ICON = 1; 
    const int LR_LOADFROMFILE = 0x0010; 

    [DllImport ("user32.dll", SetLastError=true, CharSet=CharSet.Auto)] 
    static extern System.IntPtr LoadImage(System.IntPtr hInstance, 
              string lpszName, uint uType, 
              int cxDesired, int cyDesired, 
              uint fuLoad); 
} 

Một khi bạn có các System.Drawing.Icon trong kích thước dự kiến, chỉ cần sơn nó bằng cách sử dụng graphics.DrawIconUnstretched.

0

Hôm nay, tôi đã tạo một chức năng rất đẹp cho trích xuất các ảnh bitmap 256x256 từ biểu tượng Vista.

Tôi sử dụng nó để hiển thị biểu tượng lớn dưới dạng bitmap trong hộp "Giới thiệu".

Chức năng này lấy đối tượng Biểu tượng làm tham số. Vì vậy, bạn có thể sử dụng nó với bất kỳ biểu tượng nào - từ các tài nguyên, từ tệp, từ luồng, v.v. Nó chạy trên bất kỳ hệ điều hành , bởi vì nó không sử dụng bất kỳ API Win32, nó là 100% quản lý mã :-)

Bitmap ExtractVistaIcon(Icon icoIcon) 

Tôi posted chức năng của tôi ở đây: ExtractVistaIcon()

Các vấn đề liên quan