利用GDI+库给对话框改变背景



GDI+库解压到工程文件夹

 

stdafx.h
#include "../GDI+/Includes/GdiPlus.h"
#pragma comment(lib,"../GDI+/lib/GDIPlus.lib")
using namespace Gdiplus;


APP类定义

class Cpersonnal_dialog_testApp : public CWinApp
{
public:
Cpersonnal_dialog_testApp();
// 重写
public:
virtual BOOL InitInstance();
virtual BOOL ExitInstance();
// 实现
DECLARE_MESSAGE_MAP()
ULONG_PTR m_gdiToken;
};
APP类实现 
BOOL Cpersonnal_dialog_testApp::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls); 
GdiplusStartupInput gdi;
GdiplusStartup(&m_gdiToken,&gdi,NULL); 
CWinApp::InitInstance(); 
// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序")); 
Cpersonnal_dialog_testDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用
//  “确定”来关闭对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用
//  “取消”来关闭对话框的代码
} 
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
//  而不是启动应用程序的消息泵。
return FALSE;
}
 
BOOL Cpersonnal_dialog_testApp::ExitInstance()
{
Gdiplus::GdiplusShutdown(m_gdiToken); 
return CWinApp::ExitInstance();
}
DLG类实现
// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。
 
void Cpersonnal_dialog_testDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
 
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
 
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
 
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
Graphics graphics(dc.m_hDC);
Image bg(L"..\\res\\background.png");         //载入背景图
graphics.DrawImage(&bg,0,0,rect.Width(),rect.Height());
CDialog::OnPaint();
}
}
 
 
如果要加载资源中的PNG,需要如下函数:
//使用下面的代码,让资源中的png图片变成GDI+中的Image对象即可进行绘画
inline BOOL ImageFromIDResource(UINT resourceID, LPCTSTR resourceType, Image*& image)
{
        HINSTANCE hInst = AfxGetResourceHandle();
        HRSRC hRsrc = ::FindResource(hInst,MAKEINTRESOURCE(resourceID),resourceType);
        if (hRsrc == NULL)
                return FALSE;
        // load resource into memory
        DWORD len = SizeofResource(hInst, hRsrc);
        BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
        if (lpRsrc == NULL)
                return FALSE;
        // Allocate global memory on which to create stream
        HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
        BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
        memcpy(pmem,lpRsrc,len);
        IStream* pstm;
        CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);
        // load from stream
        image = Gdiplus::Image::FromStream(pstm);
        // free/release stuff
        GlobalUnlock(m_hMem);
        GlobalFree(m_hMem);
        pstm->Release();
        FreeResource(lpRsrc);
        return TRUE;
}
并在 void Cpersonnal_dialog_testDlg::OnPaint()对应位置修改如下:
                Image* bg;//(L"..\\res\\start.png");
                if (ImageFromIDResource(IDR_PNG1,L"PNG",bg)==false)
                {
                        TRACE("ImageFromIDResource failed.");
                }
                else
                {
                        TRACE("ImageFromIDResource success.");
                        graphics.DrawImage(bg,0,0,rect.Width(),rect.Height());
                        delete bg;
                }


http://hi.baidu.com/%EF%A3%EF%A3%BF%A8%C4%C2/blog/item/b51214f8edc50e45242df24f.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值