C++ WinApi 将图像 .jpg 绘制到新 window?

C++ WinApi Draw image .jpg to new window?

我是 Windows API 的新手。使用 Winapi 教程中提供的一些 Windows 示例代码:

Graphics.DrawImage(Image*, const Rect) method

我想打开一张 .jpg 图片并将其绘制到我创建的新 window 上。问题是我不确定如何将 VOID Example_DrawImage9(HDC hdc) 方法与我现有的 window 一起使用。我的第一直觉是在回调过程中的 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);
}

您必须初始化 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);画图就够了。绘制图像后,请勿在其上绘制任何其他内容。

您可以在 WM_PAINT 中使用 Example_DrawImage9(hdc)。在绘制图像之前使用 FillRect

你走在正确的轨道上。使用 BeginPaint() 提供的 HDC。在使用之前不要忘记初始化 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);
}