精易论坛

标题: GDI 窗口图片 鼠标中心 缩放 拖拽 绘制源码 [打印本页]

作者: z13228604287    时间: 2024-6-7 20:57
标题: GDI 窗口图片 鼠标中心 缩放 拖拽 绘制源码
[C++] 纯文本查看 复制代码
#include <windows.h>
#include <iostream>

int main()
{

    RECT m_Rect; //对话框的矩形区域
    HWND m_hWnd; //对话框句柄

    // 获取对话框的设备上下文
    HDC hdc = GetDC(m_hWnd);
    if (hdc == NULL) {
        // 处理获取设备上下文失败的情况
        return;
    }

    // 创建内存设备上下文
    HDC memDC = CreateCompatibleDC(hdc);
    if (memDC == NULL) {
        // 处理创建内存设备上下文失败的情况
        ReleaseDC(m_hWnd, hdc); // 释放设备上下文
        return;
    }

    // 对话框的矩形 宽高
    int Width = m_Rect.right - m_Rect.left + 1;
    int Height = m_Rect.bottom - m_Rect.top + 1;

    // 创建与设备兼容的位图
    HBITMAP hBitmap = CreateCompatibleBitmap(hdc, Width, Height);
    if (hBitmap == NULL) {
        // 处理创建位图失败的情况
        DeleteDC(memDC); // 释放内存设备上下文
        ReleaseDC(m_hWnd, hdc); // 释放设备上下文
        return;
    }

    // 将位图选入内存设备上下文
    HGDIOBJ hOldBitmap = SelectObject(memDC, hBitmap);
    if (hOldBitmap == NULL) {
        // 处理选择位图失败的情况
        DeleteObject(hBitmap); // 释放位图
        DeleteDC(memDC); // 释放内存设备上下文
        ReleaseDC(m_hWnd, hdc); // 释放设备上下文
        return;
    }

    // 使用 FillSolidRect 函数填充矩形区域
    RECT rect = { 0, 0, Width, Height };
    // 创建一个画刷,用于指定填充的颜色
    HBRUSH hBrush = CreateSolidBrush(RGB(255, 255, 255));
    if (hBrush == NULL) {
        // 处理创建画刷失败的情况
        SelectObject(memDC, hOldBitmap); // 恢复原来的位图
        DeleteObject(hBitmap); // 释放位图
        DeleteDC(memDC); // 释放内存设备上下文
        ReleaseDC(m_hWnd, hdc); // 释放设备上下文
        return;
    }

    // 将画刷选入设备上下文
    HBRUSH hOldBrush = (HBRUSH)SelectObject(memDC, hBrush);
    if (hOldBrush == NULL) {
        // 处理选择画刷失败的情况
        SelectObject(memDC, hOldBitmap); // 恢复原来的位图
        DeleteObject(hBrush); // 释放画刷
        DeleteObject(hBitmap); // 释放位图
        DeleteDC(memDC); // 释放内存设备上下文
        ReleaseDC(m_hWnd, hdc); // 释放设备上下文
        return;
    }

    // 使用 FillRect 函数填充矩形区域
    RECT rect = { m_Rect.left, m_Rect.top, m_Rect.right, m_Rect.bottom };
    if (!FillRect(memDC, &rect, hBrush)) {
        // 处理填充矩形区域失败的情况
        SelectObject(memDC, hOldBrush); // 恢复原来的画刷
        SelectObject(memDC, hOldBitmap); // 恢复原来的位图
        DeleteObject(hBrush); // 释放画刷
        DeleteObject(hBitmap); // 释放位图
        DeleteDC(memDC); // 释放内存设备上下文
        ReleaseDC(m_hWnd, hdc); // 释放设备上下文
        return;
    }

    {
        HBITMAP img;
        // 创建与设备兼容的内存设备上下文
        HDC imgDC = CreateCompatibleDC(memDC);
        if (imgDC == NULL) {
            // 处理创建内存设备上下文失败的情况
            SelectObject(memDC, hOldBrush); // 恢复原来的画刷
            SelectObject(memDC, hOldBitmap); // 恢复原来的位图
            DeleteObject(hBrush); // 释放画刷
            DeleteObject(hBitmap); // 释放位图
            DeleteDC(memDC); // 释放内存设备上下文
            ReleaseDC(m_hWnd, hdc); // 释放设备上下文
            return;
        }

        // 将位图对象选择进内存设备上下文
        HBITMAP hOldBitmap = (HBITMAP)SelectObject(imgDC, img);
        if (hOldBitmap == NULL) {
            // 处理选择位图失败的情况
            DeleteDC(imgDC); // 释放内存设备上下文
            SelectObject(memDC, hOldBrush); // 恢复原来的画刷
            SelectObject(memDC, hOldBitmap); // 恢复原来的位图
            DeleteObject(hBrush); // 释放画刷
            DeleteObject(hBitmap); // 释放位图
            DeleteDC(memDC); // 释放内存设备上下文
            ReleaseDC(m_hWnd, hdc); // 释放设备上下文
            return;
        }
        int originalWidth = 0; // 原始图片的宽度,请根据实际情况填写
        int originalHeight = 0; // 原始图片的高度,请根据实际情况填写

        // 计算缩放后的尺寸
        int scaledWidth = static_cast<int>((float)originalWidth * 0.5f);
        int scaledHeight = static_cast<int>((float)originalHeight * 0.5f);

        // 设置绘图的起始位置
        int xPos = 0; // 根据需要修改位置
        int yPos = 0; // 根据需要修改位置

        BOOL StretchResult = StretchBlt(memDC,    // 目标设备上下文的句柄
            xPos, yPos,    // 目标位置的坐标
            scaledWidth, scaledHeight,    // 目标宽度和高度
            imgDC,         // 源设备上下文的句柄,即位图的内存设备上下文
            0, 0,          // 源矩形的左上角坐标
            originalWidth, originalHeight,   // 源矩形的宽度和高度
            SRCCOPY);      // 指定光栅操作代码,这里使用 SRCCOPY 表示直接复制像素
        if (!StretchResult) {
            // 处理拉伸操作失败的情况
            SelectObject(imgDC, hOldBitmap); // 恢复原来的位图
            DeleteDC(imgDC); // 释放内存设备上下文
            SelectObject(memDC, hOldBrush); // 恢复原来的画刷
            SelectObject(memDC, hOldBitmap); // 恢复原来的位图
            DeleteObject(hBrush); // 释放画刷
            DeleteObject(hBitmap); // 释放位图
            DeleteDC(memDC); // 释放内存设备上下文
            ReleaseDC(m_hWnd, hdc); // 释放设备上下文
            return;
        }

        // 恢复原来的位图
        SelectObject(imgDC, hOldBitmap);
        DeleteDC(imgDC); // 释放内存设备上下文
    }
    // 使用 BitBlt 函数进行位块传输
    if (!BitBlt(hdc, 0, 0, Width, Height, memDC, 0, 0, SRCCOPY)) {
        // 处理位块传输失败的情况
        SelectObject(memDC, hOldBrush); // 恢复原来的画刷
        SelectObject(memDC, hOldBitmap); // 恢复原来的位图
        DeleteObject(hBrush); // 释放画刷
        DeleteObject(hBitmap); // 释放位图
        DeleteDC(memDC); // 释放内存设备上下文
        ReleaseDC(m_hWnd, hdc); // 释放设备上下文
        return;
    }
    // 释放资源
    SelectObject(memDC, hOldBrush); // 恢复原来的画刷
    SelectObject(memDC, hOldBitmap); // 恢复原来的位图
    DeleteObject(hBrush); // 释放画刷
    DeleteObject(hBitmap); // 释放位图
    DeleteDC(memDC); // 释放内存设备上下文
    ReleaseDC(m_hWnd, hdc); // 释放设备上下文
}


作者: 似风似雨似魔鬼    时间: 2024-6-9 21:33
还行不够完善
作者: z13228604287    时间: 2024-6-10 10:43
似风似雨似魔鬼 发表于 2024-6-9 21:33
还行不够完善

接人鼠标事件   就完善了
作者: z13228604287    时间: 2024-6-13 10:53
似风似雨似魔鬼 发表于 2024-6-9 21:33
还行不够完善



作者: qq977352880    时间: 2024-9-7 20:30
作者用心了,感谢你的付出。

作者: 涤尘    时间: 2025-4-18 21:15
感谢分享‘




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4