1.在网站下载一副自己喜欢的图片做背景,注意图片大小跟分辨率,一般选择不大于2M的图片
2.在对话框头文件加一个CBrush变量,变量名是m_bkBrush
3.OnInitDialog中初始化它,定义如下
BOOL CMFCDialogUIDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
CString strBmpPath = _T(".\\res\\Background.png");
CImage img;
img.Load(strBmpPath);
MoveWindow(0, 0, img.GetWidth(), img.GetHeight());
CBitmap bmpTmp;
bmpTmp.Attach(img.Detach());
m_bkBrush.CreatePatternBrush(&bmpTmp);
CRgn rgnTmp;
RECT rc;
GetClientRect(&rc);
rgnTmp.CreateRoundRectRgn(rc.left + 3, rc.top + 3, rc.right - rc.left - 3, rc.bottom-rc.top -3, 6, 6);
SetWindowRgn(rgnTmp, TRUE);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
4.注意此时的窗口大小为图片的大小,并不一定符合你原始对话框的大小,在MoveWindow(0, 0, img.GetWidth(), img.GetHeight());之前加如下代码
RECT rc0;
GetClientRect(&rc0);设置断点运行,确定对话框的长度跟宽度,然后在MoveWindow(0, 0, img.GetWidth(), img.GetHeight())语句中的img.GetWidth(), img.GetHeight()前面乘以相应的 系数就可以得到原始窗口大小的背景图片。
例如:rc0.width=970;rc0.height=1610;
img.GetWidth()=2550;
img.GetHeight()=2888;
那么img.GetWidth()*0.38=970;
img.GetHeight()*0.557=1610;
5.在Dlg类中添加消息相应函数WM_CTLCOLOR,添加如下代码
HBRUSH CMFCDialogUIDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
if (pWnd == this)
{
return m_bkBrush;
}
return hbr;
6.添加消息相应函数WM_NCHITTEST,并添加代码
LRESULT CMFCDialogUIDlg::OnNcHitTest(CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
LRESULT ret = CDialogEx::OnNcHitTest(point);
return (ret == HTCLIENT) ? HTCAPTION : ret;
}
使得对话框可以自由拖动
7 运行程序