VS2010开发MFC对话框关于最大化后背景图片的问题 20
如题,最大化或还原的时候背景图会延迟一下比如最大化的时候能看到背景图确实第一时间适应窗口变大了但是在窗口左上角还会有一两秒延迟就是说如果打断点的话这时候能看见正常的背景图...
如题,最大化或还原的时候 背景图会延迟一下 比如最大化的时候 能看到背景图确实第一时间适应窗口变大了 但是在窗口左上角还会有一两秒延迟 就是说 如果打断点的话 这时候能看见正常的背景图一个 然后左上角还有一个最大化之前的大小的背景图 然后随着时间一点一点的消失 是按照对话框里控件的位置一块一块的消失的 还原时情况类似
我的背景图是这样设置的
BOOL CHomepicDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CRect rctClient;
GetClientRect(rctClient);
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
CBitmap m_bmp;
m_bmp.LoadBitmap(IDB_BITMAP3);
BITMAP bitmap;
m_bmp.GetBitmap(&bitmap);
CBitmap *pbmpOld=dcMem.SelectObject(&m_bmp);
pDC->SetStretchBltMode(HALFTONE);
pDC->StretchBlt(0,0,rctClient.Width(),rctClient.Height(),&dcMem,0,0,
bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
pDC->DeleteDC();
dcMem.DeleteDC();
return TRUE;
}
onsize是这样的
void CHomepicDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
if(nType != SIZE_MINIMIZED) //nType为OnSize函数自带的参数,不用管它
{
/**/
CWnd *pWnd;
int count = m_rectlist_normal.GetCount();
for(int i=0;i<count;i++)
{
POSITION pos =m_rectlist_normal.FindIndex(i);
int cid=m_rectlist_normal.GetAt(pos);
pWnd = GetDlgItem(cid); //获取控件句柄
if(pWnd)//判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建
{
CRect rect; //获取控件变化前大小
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
rect.left=rect.left*(cx+1)/m_rect.Width();/////调整控件大小
rect.right=rect.right*(cx+1)/m_rect.Width();
rect.top=rect.top*(cy+1)/m_rect.Height();
rect.bottom=rect.bottom*(cy+1)/m_rect.Height();
pWnd->MoveWindow(rect);//设置控件大小
// CDC *pDc=NULL;
// pDc=pWnd->GetDC();
// pDc->SetStretchBltMode(HALFTONE);
}
}
GetClientRect(&m_rect);//将变化后的对话框大小设为旧大小
Invalidate(TRUE);
}
}
OnDrawItem方法是空的里边没有代码
onpaint是这样的
void CHomepicDlg::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
{
CDialogEx::OnPaint();
}
} 展开
我的背景图是这样设置的
BOOL CHomepicDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CRect rctClient;
GetClientRect(rctClient);
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
CBitmap m_bmp;
m_bmp.LoadBitmap(IDB_BITMAP3);
BITMAP bitmap;
m_bmp.GetBitmap(&bitmap);
CBitmap *pbmpOld=dcMem.SelectObject(&m_bmp);
pDC->SetStretchBltMode(HALFTONE);
pDC->StretchBlt(0,0,rctClient.Width(),rctClient.Height(),&dcMem,0,0,
bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
pDC->DeleteDC();
dcMem.DeleteDC();
return TRUE;
}
onsize是这样的
void CHomepicDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
if(nType != SIZE_MINIMIZED) //nType为OnSize函数自带的参数,不用管它
{
/**/
CWnd *pWnd;
int count = m_rectlist_normal.GetCount();
for(int i=0;i<count;i++)
{
POSITION pos =m_rectlist_normal.FindIndex(i);
int cid=m_rectlist_normal.GetAt(pos);
pWnd = GetDlgItem(cid); //获取控件句柄
if(pWnd)//判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建
{
CRect rect; //获取控件变化前大小
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
rect.left=rect.left*(cx+1)/m_rect.Width();/////调整控件大小
rect.right=rect.right*(cx+1)/m_rect.Width();
rect.top=rect.top*(cy+1)/m_rect.Height();
rect.bottom=rect.bottom*(cy+1)/m_rect.Height();
pWnd->MoveWindow(rect);//设置控件大小
// CDC *pDc=NULL;
// pDc=pWnd->GetDC();
// pDc->SetStretchBltMode(HALFTONE);
}
}
GetClientRect(&m_rect);//将变化后的对话框大小设为旧大小
Invalidate(TRUE);
}
}
OnDrawItem方法是空的里边没有代码
onpaint是这样的
void CHomepicDlg::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
{
CDialogEx::OnPaint();
}
} 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询