使用GDI+的 Image对象做为自己类成员变量

在绘图时插入图片,使用Image类对象加载图片,每次重绘都得重新加载图片,为了提高效率把Image对象做为自己类成员;
在网上有3中方法
1、注释掉cpp中下面的代码这就好了:
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
2、在new前面加::全局作用符;
由于没有Image参数的构造函数是保护成员;所以用指针:


Image *m_pImage;


构造时:
m_pImage = ::new Image( _T("static.png") )
           在析构时会出现崩溃;
           delete m_pImage;
           
而直接 new倒没事,工具查也没泄漏;
m_pImage = new ( _T("static.png") );
或者
m_pImage = ::Image::FromFile( _T("static.png") );












  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个基于 C++ 和 GDI+ 的示例代码,用于创建异形窗口并在窗口上绘制图像。下面是代码: ```c++ #include <windows.h> #include <gdiplus.h> #pragma comment (lib,"Gdiplus.lib") // 窗口类名 const wchar_t* WindowClassName = L"MyWindowClass"; // 要绘制的图片路径 const wchar_t* ImageFilePath = L"C:\\image.bmp"; // 窗口句柄 HWND hWnd; // GDI+ 全局变量 Gdiplus::GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; // 窗口回调函数声明 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 初始化 GDI+ Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); // 注册窗口类 WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszMenuName = NULL; wc.lpszClassName = WindowClassName; wc.hIconSm = NULL; RegisterClassEx(&wc); // 创建窗口 hWnd = CreateWindowEx( WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST, WindowClassName, L"My Window", WS_POPUPWINDOW | WS_VISIBLE, 100, 100, 640, 480, NULL, NULL, hInstance, NULL); // 设置窗口为异形窗口 HRGN hRgn = CreateEllipticRgn(0, 0, 640, 480); SetWindowRgn(hWnd, hRgn, TRUE); // 加载图片 Gdiplus::Bitmap bitmap(ImageFilePath); // 绘制图片到窗口 HDC hdc = GetDC(hWnd); Gdiplus::Graphics graphics(hdc); graphics.DrawImage(&bitmap, 0, 0, 640, 480); ReleaseDC(hWnd, hdc); // 消息循环 MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } // 释放 GDI+ Gdiplus::GdiplusShutdown(gdiplusToken); return (int)msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: PostQuitMessage(0); break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); } break; default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; } ``` 上面的代码中,我们首先初始化了 GDI+,然后注册了一个窗口类,并创建了一个异形窗口。我们使用 `CreateEllipticRgn` 函数创建一个椭圆形区域作为窗口的形状,然后使用 `SetWindowRgn` 函数设置窗口的形状。接下来,我们加载了一张图片,并使用 GDI+ 绘制到窗口上。最后,在消息循环中,我们处理了窗口的关闭消息,并在窗口绘制时处理了 `WM_PAINT` 消息。 需要注意的是,由于我们创建的是异形窗口,因此窗口的背景应该是透明的。我们通过设置窗口的扩展样式 `WS_EX_LAYERED` 和 `WS_EX_TRANSPARENT` 来实现窗口的透明效果。另外,我们还将窗口的扩展样式设置为 `WS_EX_TOPMOST`,使窗口置于所有其他窗口之上。 希望这个示例代码能够对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值