CDialog OnPaint背景图 覆盖button

Annie0716 2007-05-10 08:44:36
求教:
我的Dialog是没有标题栏的,在其右上角放有button(标准CButton),当作系统的button,处理了鼠标拖动Client区域移动窗口。

在OnPaint中向CDialog贴了一张背景图。但是在移动时(按下鼠标,长时间不释放),Onpaint在重画时,背景图片会将右上角的几个button覆盖。

请问该怎样解决这个问题?

万分感谢!
...全文
882 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Annie0716 2007-05-12
  • 打赏
  • 举报
回复
贴一下我的代码,哪位能帮我看看吗?谢谢了!

int nHeight;
int nWidth;

CRect rectdlg;
GetWindowRect(&rectdlg);

CDC *pDC;
pDC = GetWindowDC();

CRect rectBtn;
GetDlgItem(IDC_BTN_CLOSE)->GetWindowRect(&rectBtn);
ScreenToClient(rectBtn);

//Load JPEG picture to Dlg TitleBar
nWidth = rectdlg.Width();
nHeight = rectBtn.bottom + 5;


//if(!ShowJpgGif(pDC, TitlePath, 0, 0, HIGHT_PICTURE, WIDTH_PICTURE))
if(!ShowJpgGif(pDC, TitlePath, 0, 0, nHeight, nWidth))
{
TRACE("Load TitleBar JPG picture failed!");
}
Annie0716 2007-05-12
  • 打赏
  • 举报
回复
是这样吗?
m_btnClose.UpdateWindow();
看起来还是不行。

谁能帮我看看?谢谢了!
Annie0716 2007-05-12
  • 打赏
  • 举报
回复
发现如果贴bmp图片,就没有问题;但是,贴我的Jpeg图片会出现这个问题,想必是我jpg图片贴的有问题。

贴一下我添加背景图的代码,请高人帮我看看:
BOOL ShowJpgGif(CDC* pDC,CString strPath, int x, int y, int hight, int width)
{
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;

if (file.Open(strPath,CFile::modeRead) && file.GetStatus(strPath,fstatus) && ((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);

LPVOID pvData = NULL;

if (hGlobal != NULL)
{

pvData = GlobalLock(hGlobal);

if(pvData != NULL)
{

file.ReadHuge(pvData, cb);

GlobalUnlock(hGlobal);

CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
}
}
}
else
{
return FALSE;
}


IPicture *pPic;

//load image from file stream

if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{

OLE_XSIZE_HIMETRIC hmWidth;

OLE_YSIZE_HIMETRIC hmHeight;

pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);

double fX,fY;

//get image height and width

fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/
((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);

fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/
((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);

//calculate the picture size and region size
int widthPic;
int heightPic;

widthPic = (int) fX;
heightPic = (int) fY;

int n;
if(width%widthPic)
n = (int)(width/widthPic) + 1;
else
n = (int)(width/widthPic);

//use render function display image

//for(int i = 0; i < n; i++)
{
if(FAILED(pPic->Render(*pDC, x, y, width, hight, 0, hmHeight, hmWidth, -hmHeight, NULL)))
//if(FAILED(pPic->Render(*pDC, x + i * widthPic, y, widthPic, hight, 0, hmHeight, hmWidth, -hmHeight, NULL)))
{
AfxMessageBox("render failure");

pPic->Release();

return FALSE;
}
}

pPic->Release();

}
else
{
return FALSE;
}

return TRUE;
}

谢谢!
Y___Y 2007-05-11
  • 打赏
  • 举报
回复
OnEraseBkgnd里没问题
也可以OnPaint里画完后调用按钮的UpdateWindow()
Annie0716 2007-05-11
  • 打赏
  • 举报
回复
而且在Client区域内的其它部分,如果贴上另一个图片,拖动窗口时,该图片会把其它控件(如Clistctrl或者CTreeCtrl)覆盖掉.

看起来拖动窗口时,在OnEraseBkgnd或者OnPaint中贴的图总会覆盖其同一区域的控件。

是因为我拖动窗口的操作是处理的这个函数吗?
void CDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
//Move dlg when drag its client region
SendMessage(WM_SYSCOMMAND,SC_MOVE|HTCLIENT,0);

CDialog::OnLButtonDown(nFlags, point);
}
Annie0716 2007-05-11
  • 打赏
  • 举报
回复
|-----------------------------------------------------|
| [1][2][3][4] |
| |
| |
|-----------------------------------------------------|

我的图贴在OnEraseBkgnd或者OnPaint中贴的,如上图外围最大的client范围内(dialog没有TitleBar),这个范围内静态地放置了4个标准的button。
程序运行,拖动窗口时,系统调用Onpaint时,贴上去的图片会把button覆盖掉。

该怎样避免这种情况?
万分感谢!
Annie0716 2007-05-11
  • 打赏
  • 举报
回复
我的图是从外面加在的jpeg图片,用的IPicture.Render
我试过在OnEraseBkgnd里面贴图,在我拖动整个窗口一直不释放鼠标的情况下,还是会把那四个button覆盖掉。
「已注销」 2007-05-11
  • 打赏
  • 举报
回复
//CDialog::OnPaint();
如果注释掉这一行,运行起来后,那几个button就显示不出来了。

===============================
把这都注释了,当然显示不出来了,它都不绘制BUTTON了,你那来的显示,不要注释这一句
youngwolf 2007-05-10
  • 打赏
  • 举报
回复
在OnPaint里面可以调用父类的OnPaint,刚才说错了。

我做过你这样的,在OnEraseBkgnd做,绝对没问题。不知道你是怎么贴背景的?
Annie0716 2007-05-10
  • 打赏
  • 举报
回复
//CDialog::OnPaint();
如果注释掉这一行,运行起来后,那几个button就显示不出来了。
Annie0716 2007-05-10
  • 打赏
  • 举报
回复
我在OnEraseBkgnd里面试过了,也有这样的现象。
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
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;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
//Load Dlg Skin
LoadMainDlgSkin();

//CDialog::OnPaint();
}
帮我看看可以吗?
谢谢了!
youngwolf 2007-05-10
  • 打赏
  • 举报
回复
为什么不在OnEraseBkgnd里做?
另外,在OnPaint里面不要调用父类的OnPaint,不知道你调用了没有。

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧