2009-10-07 39 views
6

Tôi sử dụng Visual Studio 2008, tôi có tệp PNG được tải trong Chế độ xem tài nguyên, gán IDB_BANG_PNG.Cài đặt một cách có định dạng PNG thành Điều khiển ảnh trong các API Win32

Điều khiển hình ảnh được gọi là IDC_STATIC15.

Tôi gặp sự cố khi cố gắng tải tệp PNG vào điều khiển hình ảnh.

LRESULT CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 

// Way of loading a bmp with a mask perhaps? Or a PNG file programatically? 

static HBRUSH hBrushStatic; 
HBITMAP hBmp = LoadBitmap(hDlg,MAKEINTRESOURCE(IDB_BANG_PNG)); 

switch(message) 
{ 
case WM_INITDIALOG:  
    CheckDlgButton(hDlg, IDC_CHECK, FALSE); 
    EnableWindow(GetDlgItem(hDlg, IDOK), FALSE); 
    // Bitmap version is IDB_BANG, PNG is at IDB_BANG_PNG 
    // IDC_STATIC15 is the picture frame 
    HWND item = GetDlgItem(hDlg,IDC_STATIC15); 
    SendMessage(item,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)hBmp); 
    return TRUE; 

// .... snip 

Tôi khá ngây thơ khi nói đến việc phát triển Win32/GUI, thực hiện một dự án nhanh chóng và gặp khó khăn, mọi trợ giúp đều được đánh giá cao.

+0

Bạn cần tệp bitmap. Bạn muốn chuyển đổi hình ảnh PNG sang hình ảnh BMP. – anno

+0

Tôi đọc rằng bạn có thể hỗ trợ PNG nhưng bạn phải làm điều đó theo chương trình. Khi tôi thêm hình ảnh, sử dụng bộ lọc hình ảnh hte, * .png là một trong các mục được liệt kê. –

+0

Vấn đề là, tôi muốn duy trì nền trong suốt, do đó tại sao tôi muốn sử dụng PNG. Trừ khi, tôi có thể tạo mặt nạ bằng cách sử dụng BMP hoặc cho phép tệp ICO sử dụng biểu tượng có kích thước lớn hơn thay vì 32x32. –

Trả lời

0

Cá nhân, tôi sử dụng CPictureEx lớp học. Tôi nghĩ rằng nó không hỗ trợ png, nhưng bmp, jpeg và gif động.

Tôi cũng sử dụng đồ họa Cairo để hiển thị đặc biệt. Cairo hỗ trợ định dạng png.
Tất nhiên Cairo khó sử dụng hơn một chút.

+0

Dự án này tôi đang làm việc trên C, không phải C++. Các lớp, CImage, MFC, et cetera sẽ không thể thực hiện được và sẽ không biên dịch. Làm cách nào để sử dụng vẽ bmp vào điều khiển hình ảnh, trong hộp thoại lúc chạy? –

4

này hoạt động bằng GDI+bitmap class:

Bitmap oBmp(L"D:\\test.png"); 
HBITMAP hBmp; 
oBmp.GetHBITMAP(0, &hBmp); 
SendMessage(item,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)hBmp); 

Một số kiểm soát caveats.Your cần có một phong cách SS_BITMAP. Đừng quên bao gồm gdiplus.h và thư viện của nó. Bạn cần khởi tạo (GdiplusStartup) và tắt GDI +. Giải phóng tất cả tài nguyên hệ thống là bạn.

0

Bạn đã kiểm tra thư viện DevIL/OpenIL chưa? Nó tuân theo phong cách đặt tên OpenGL và được viết bằng chữ ol 'C.

Tôi đã sử dụng trong quá khứ, thành công. Nó cũng rất cầm tay.

Kiểm tra nó ra ở đây: http://openil.sourceforge.net/features.php

2

Tôi không nghĩ LoadBitmap hay bất kỳ chức năng GDI đồng bằng khác (chẳng hạn như LoadImage) sẽ được tải một PNG.

Bạn có thể lưu tài nguyên của mình vào BMP 32 bit bằng công cụ chỉnh sửa hình ảnh và sau đó sử dụng LoadImage với LR_CREATEDIBSECTION.

Hoặc bạn có thể sử dụng thư viện sẽ tải tệp PNG vào DIBSECTION. GDI + sẽ tải PNG và JPG ngoài BMP.

Thư viện tự động hóa OLE cũng có giao diện IPicture mà bạn có thể khởi tạo với các loại hình ảnh khác nhau và sau đó lấy DIBSECTION cơ bản. Thật khó xử khi sử dụng, đặc biệt nếu bạn không quen với COM. Xem OleLoadPicture để biết điểm xuất phát.

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