2016-03-02 6 views
1

Я новичок в Windows API. Используя некоторые из примеров кода Windows, поставляемого на учебники WinAPI:C++ WinApi Нарисуйте изображение .jpg в новом окне?

Graphics.DrawImage(Image*, const Rect) method

Я ищу, чтобы открыть .jpg изображение и нарисовать его в новом окне я создал. Проблема в том, что я точно не знаю, как использовать метод VOID Example_DrawImage9(HDC hdc) с моим существующим окном. Мой первый инстинкт заключался в том, чтобы вызвать его внутри case WM_PAINT в процедуре обратного вызова и использовать hdc оттуда, но изображение не отображается. Как я могу узнать о правильном hdc? И где я должен вызвать метод?

#include <windows.h> 
#include "stdafx.h" 
#include <objidl.h> 
#include <gdiplus.h> 

using namespace Gdiplus; 
#pragma comment (lib,"Gdiplus.lib") 

//*************************************************** added for gdiplus 
HWND hEdit; 

//************************************************how do I use this method with the window I have created below? 
VOID Example_DrawImage9(HDC hdc){ 
    Graphics graphics(hdc); // Create an Image object. 
    Image image(L"C:/Users/Me/Desktop/fuzz.jpg"); // Create a Pen object. 
    Pen pen(Color(255, 255, 0, 0), 2); // Draw the original source image. 
    graphics.DrawImage(&image, 10, 10); // Create a Rect object that specifies the destination of the image. 
    Rect destRect(200, 50, 150, 75); // Draw the rectangle that bounds the image. 
    graphics.DrawRectangle(&pen, destRect); // Draw the image. 
    graphics.DrawImage(&image, destRect); 
} 
//********************************************************************************************* 



LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow) 
{ 
    const wchar_t CLASS_NAME[] = L"Sample Window Class"; 
    WNDCLASS wc = {}; 
    wc.lpfnWndProc = WindowProc; //attach this callback procedure 
    wc.hInstance = hInstance; //handle to application instance 
    wc.lpszClassName = CLASS_NAME; 
    RegisterClass(&wc); //register wc 
    // Create the window. 
    HWND hwnd = CreateWindowEx( 
     0,        // Optional window styles. 
     CLASS_NAME,      // Window class 
     L"Learn to Program Windows", // Window text 
     WS_OVERLAPPEDWINDOW,   // Window style 

             // Size and position 
     CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 

     NULL,  // Parent window  
     NULL,  // Menu 
     hInstance, // Instance handle 
     NULL  // Additional application data 
     ); 

    if (hwnd == NULL){ 
     return 0; 
    } 

    ShowWindow(hwnd, nCmdShow); 

    MSG msg = {}; 
    while (GetMessage(&msg, NULL, 0, 0)){ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 
return 0; 
} 

//callback procedure for this window, takes in all the window details 
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ 
    switch (uMsg){ 
     case WM_DESTROY: 
      PostQuitMessage(0); 
      return 0; 

     case WM_PAINT:{ 
      PAINTSTRUCT ps; 
      HDC hdc = BeginPaint(hwnd, &ps); 
      //*************************************************************** 
      //do we call DrawImage here? what do we need to pass as hdc? 
      //Example_DrawImage9(HDC hdc);//????????????? 
      //*************************************************************** 
      FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1)); 
      EndPaint(hwnd, &ps); 
     } 
     return 0; 
    } 
    return DefWindowProc(hwnd, uMsg, wParam, lParam); 
} 
+0

Не кодируйте по инстинкту. Вместо этого прочитайте ресурсы, предлагаемые вам в [комментарии] (http://stackoverflow.com/questions/35698324/winapi-create-window-child-windows-process-a-button-press#comment59074595_35698324) к вашему предыдущему вопросу , – IInspectable

+0

Я думаю, что 'Graphics' попытается уничтожить HDC, который вы передадите, когда он выходит из сферы видимости. И если это не так, как вы думаете, будет результат, когда вы сразу же заполните прямоугольник? –

+0

@MarkRansom: класс 'Graphics' не уничтожает предоставленные' HDC'. –

ответ

4

Вы на правильном пути. Используйте HDC, который предоставляет BeginPaint(). И не забудьте инициализировать GDI + перед его использованием.

#include <windows.h> 
#include "stdafx.h" 
#include <objidl.h> 
#include <gdiplus.h> 

using namespace Gdiplus; 
#pragma comment (lib, "Gdiplus.lib") 

void Example_DrawImage9(HDC hdc) 
{ 
    Graphics graphics(hdc); 
    // Create an Image object. 
    Image image(L"C:/Users/Me/Desktop/fuzz.jpg"); 
    // Create a Pen object. 
    Pen pen(Color(255, 255, 0, 0), 2); 
    // Draw the original source image. 
    graphics.DrawImage(&image, 10, 10); 
    // Create a Rect object that specifies the destination of the image. 
    Rect destRect(200, 50, 150, 75); 
    // Draw the rectangle that bounds the image. 
    graphics.DrawRectangle(&pen, destRect); 
    // Draw the image. 
    graphics.DrawImage(&image, destRect); 
} 

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow) 
{ 
    ULONG_PTR token; 
    GdiplusStartupInput input = {0}; 
    input.GdiplusVersion = 1; 
    GdiplusStartup(&token, &input, NULL); 

    const wchar_t CLASS_NAME[] = L"Sample Window Class"; 
    WNDCLASS wc = {}; 
    wc.lpfnWndProc = &WindowProc; //attach this callback procedure 
    wc.hInstance = hInstance; //handle to application instance 
    wc.lpszClassName = CLASS_NAME; 
    RegisterClass(&wc); //register wc 
    // Create the window. 
    HWND hwnd = CreateWindowEx( 
     0,        // Optional window styles. 
     CLASS_NAME,      // Window class 
     L"Learn to Program Windows", // Window text 
     WS_OVERLAPPEDWINDOW,   // Window style 

     // Size and position 
     CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 

     NULL,  // Parent window  
     NULL,  // Menu 
     hInstance, // Instance handle 
     NULL  // Additional application data 
    ); 

    if (hwnd != NULL) 
    { 
     ShowWindow(hwnd, nCmdShow); 

     MSG msg; 
     while (GetMessage(&msg, NULL, 0, 0) > 0) 
     { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
    } 

    GdiplusShutdown(token); 
    return 0; 
} 

//callback procedure for this window, takes in all the window details 
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (uMsg) 
    { 
     case WM_DESTROY: 
      PostQuitMessage(0); 
      return 0; 

     case WM_PAINT: 
     { 
      PAINTSTRUCT ps; 
      HDC hdc = BeginPaint(hwnd, &ps); 
      FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1)); 
      Example_DrawImage9(hdc); 
      EndPaint(hwnd, &ps); 
      return 0; 
     } 
    } 

    return DefWindowProc(hwnd, uMsg, wParam, lParam); 
} 
3

Вы должны инициализировать GDI +, а затем закрыть его перед выходом.

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow) 
{ 
    Gdiplus::GdiplusStartupInput gdiplusStartupInput; 
    ULONG_PTR gdiplusToken; 
    Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); 

    //... 

    Gdiplus::GdiplusShutdown(gdiplusToken); 

    return 0; 
} 

graphics.DrawImage(&image, 10, 10); достаточно, чтобы нарисовать изображение. Как только вы нарисуете изображение, не нарисуйте что-нибудь еще над ним.

Вы можете использовать Example_DrawImage9(hdc) в WM_PAINT. Перед рисунком используйте FillRect.

 Смежные вопросы

  • Нет связанных вопросов^_^