[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); // 释放设备上下文
}