2009-11-17 136 views
9

Tôi đã tạo một cửa sổ với createwindow() api sử dụng VS2005 trong C++ trên windows VistaLàm cách nào để vẽ hình ảnh trên cửa sổ?

Yêu cầu của tôi là vẽ hình ảnh (của bất kỳ định dạng nào) trên cửa sổ đó. Tôi không sử dụng bất kỳ MFC nào trong ứng dụng này.

Vui lòng giúp tôi với một số đoạn mã.

+0

Đó là khi bạn nhấp vào dấu kiểm nhỏ bên cạnh câu trả lời bạn thích nhất;) – mpen

+1

dấu cảm ơn, tôi đã làm điều đó với câu trả lời dưới đây. –

Trả lời

25

không chính xác chắc chắn vấn đề của bạn là gì: vẽ bitmap trên biểu mẫu hoặc bạn muốn biết cách làm việc với các định dạng hình ảnh khác nhau hoặc cả hai. Dưới đây là ví dụ về cách bạn có thể tải bitmap và vẽ nó trên biểu mẫu:

HBITMAP hBitmap = NULL; 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    int wmId, wmEvent; 

    switch (message) 
    { 
<...> 

    case WM_CREATE: 
     hBitmap = (HBITMAP)LoadImage(hInst, L"c:\\test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
     break; 
    case WM_PAINT: 
     PAINTSTRUCT  ps; 
     HDC    hdc; 
     BITMAP   bitmap; 
     HDC    hdcMem; 
     HGDIOBJ   oldBitmap; 

     hdc = BeginPaint(hWnd, &ps); 

     hdcMem = CreateCompatibleDC(hdc); 
     oldBitmap = SelectObject(hdcMem, hBitmap); 

     GetObject(hBitmap, sizeof(bitmap), &bitmap); 
     BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY); 

     SelectObject(hdcMem, oldBitmap); 
     DeleteDC(hdcMem); 

     EndPaint(hWnd, &ps); 
     break; 
    case WM_DESTROY: 
     DeleteObject(hBitmap); 
     PostQuitMessage(0); 
     break; 
    default: 
     return DefWindowProc(hWnd, message, wParam, lParam); 
    } 
    return 0; 
} 

LoadImage tải biểu tượng, con trỏ, con trỏ động hoặc bitmap. Các chi tiết về here

Để làm việc với các định dạng hình ảnh khác nhau mà bạn có thể sử dụng Windows Imaging Component (xem IWICBitmapDecoder) hoặc mã từ đây Loading JPEG and GIF pictures hoặc công cụ của bên thứ 3 như FreeImage hoặc LeadTools

hy vọng điều này giúp, coi

+0

Hi Serge, nó giải quyết được vấn đề của tôi về việc vẽ hình ảnh trên cửa sổ. cảm ơn sự giúp đỡ. nhưng vì điều này chỉ có các tệp bmp, cur và ico, tôi cần phải chuyển đổi png thành bmp và sau đó tôi sẽ chuyển bmp đó tới hàm này –

+0

có thể hướng dẫn tôi đặt ảnh png trên cửa sổ mà không cần sử dụng bất kỳ MFC –

+2

Nếu Tôi có thể cứu ai đó vài phút tìm kiếm xung quanh, tôi đã thử sử dụng câu trả lời này nhưng nó không hoạt động. Sau một thời gian chọc tôi cố gắng thay đổi sizeof (bitmap) thành sizeof (BITMAP) và mã hoạt động. Tôi đang sử dụng Visual Studio 2015 trên Windows 10. Heres dòng đầy đủ: GetObject (hBitmap, sizeof (BITMAP), & bitmap); –

2
void LoadScreen(HWND hWnd) { 
    RECT rect; 
    HDC hdc = GetDC(hWnd); 
    HBRUSH brush = CreatePatternBrush((HBITMAP)LoadImage(NULL, L"file.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)); 
    GetWindowRect(hWnd, &rect); 
    FillRect(hdc, &rect, brush); 
    DeleteObject(brush); 
    ReleaseDC(hWnd, hdc); 
} 
+1

Và HDC bị rò rỉ không bao giờ được giải phóng khi thoát khỏi chức năng? Windows GDI quy tắc 101: Nếu bạn nhận được nó, sau đó phát hành nó; nếu bạn tạo nó, sau đó xóa nó. Bạn đã làm điều này một cách chính xác với bàn chải của bạn (Tạo/Xóa), nhưng không làm như vậy với khách hàng của bạn DC (Get/Release). – WhozCraig

+0

Ah, cảm ơn :) Tôi đã giải quyết nó. Chỉ cần thêm một dòng trước khi đóng dấu ngoặc nhọn. ReleaseDC (hWnd, hdc); –

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