我想在对话框中用一个256色的BMP文件作背景,
若该256色文件的ID为IDB_BITMAP3,
先建一个基于对话框的程序,仅仅重载了Onpaint()函数如下:
然后在该对话框上放置了一个CButton控件,ID为ID_BUTTON1,
编译通过运行之,则发现第一次运行时,该ID_BUTTON1存在于窗口中
但当再次调用该函数时,由于“背景重画”,ID_BUTTON1被冲掉了,
却再也“显示不出来了”,请问,看样才能保证每次调用OnPaint()
达到”既重画IDB_BITMAP3,又重画ID_BUTTON1“目的?注意:各位网友在调试时先建立一个基于对话框的程序,
将c:\windows\Forest.bmp加入到当前工程的BMP资源中,ID为IDB_BITMAP3
先在对话框内放一CButton控件,该CButton控件放于窗口左上角
然后重载OnPaint() ,编译运行后发现CButton控件存在,
这时我们不要关闭本程序窗口,
这时我们打开“资源管理器”,让资源管理器“最大化”,
然后“最小化”,这时我们再看看桌面上本程序窗口中的CButton控件不在了?我的要求是:不破坏我的这个程序思路来解决这个问题(即仅在这个函数中修改或添加一些代码)void CAaaDlg::OnPaint() 
{
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
{
CDialog::OnPaint();
CClientDC  dc(this);
CDC     memDC;
CBitmap bitmap;
BITMAP  bmp;
bitmap.LoadBitmap(IDB_BITMAP3);
bitmap.GetObject (sizeof(BITMAP),&bmp);
memDC.CreateCompatibleDC (&dc);
memDC.SelectObject (bitmap);
dc.BitBlt (0,0,bmp.bmWidth ,bmp.bmHeight ,&memDC,0,0,SRCCOPY);
//memDC.DelObject (bitmap);
GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE); }
//AfxMessageBox("ddd");
}

解决方案 »

  1.   

    既然你的图象已经在你的资源中了,你可以用一个Static控件来装它啊.然后你所要做的工作就是重载OnSize函数了.你觉得呢?
      

  2.   

    to (边城冷月):
      我也想到这个办法了,但是我的思路是有特定用途的。
    若按你所说, 哪么放在图像上的按纽的颜色是默认的(即是灰色的)
    而我要求的是这个按纽是“透明的”,也就是说按纽的表面是背景色,
    但按纽的文字可以是指定的颜色,如RGB(255,0,0)