C++ WinApi 绘制图像.jpg到新窗口



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

Graphics.DrawImage(Image*, const Rect) 方法

我想打开一个.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);
}

你走在正确的轨道上。 使用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);
}

您必须初始化 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

相关内容

  • 没有找到相关文章

最新更新