大家好!
现有个问题要请教下:
我在VC++6中使用了一个模态窗体,并在OnPaint事件中加入一个背景图片,界面上有几个自定义的Slider控件(在网上找的 RoundSliderCtrl,是CSliderCtrl的派生类),这些Slider控件也设置了背景图片,然后我在界面上暴力操作这些Slider,也就是不停的拖拽,如果使用时间过长发现这些Slider控件的背景图片消失,露出灰色底,同时窗体的背景图片也消失变成了灰色底,而且界面上所有使用了背景图片的控件,例如Button之类都变成了灰色底,对于这个现象不是很理解,如果不是暴力操作估计发现不了这个问题,请问下各位高手大致是什么原因?谢谢了!
窗体加入背景图片的代码如下:/******************************************************************************************
  * @name OnPaint
  * @brief  窗体绘制处理程序,以下是关于窗体重绘的简短说明   
                  If you add a minimize button to your dialog, you will need the code below
   to draw the icon.  For MFC applications using the document/view model,
                   this is automatically done for you by the framework.
   当调用InvalidWindow,UpdateWindow和RedrawWindow等函数时
   也就是发送了WM_PAINT消息时该事件会响应,另外还有类似相关的一些函数如下: 1.OnPaint: WM_PAINT
  消息函数,接受到WM_PAINT消息时,首先调用的是OnPaint(),OnPaint()再调用OnDraw()    OnPaint()--OnDraw();    2.OnDraw:虚函数,需要重载    3.OnDrawItem: WM_DRAWITEM    子控件有自画属性且控件需重画时,父窗口会调用该函数   在具有Owner Draw属性的控件需要重画的时候,就会激发OnDrawItem   当自画子按钮控件、组合框控件、列表框控件或菜单的可视部分需要被画出时调用这个函数  OnDrawItem()--DrawItem();   4.DrawItem:虚函数,需要重载
  如果使用DrawItem来自画控件,需要给控件加上自画样式,然后重载该控件类的自画函数(DrawItem)函数,如果该控件的父窗口提供了ON_WM_DRAWITEM消息映射宏,
  并重载了OnDrawItem函数,则重画消息会由父窗口处理,父窗口调用基类的OnDrawItem来调用派生的子控件的DrawItem函数.  * @param  无
  * @retval 无
******************************************************************************************/
void HID5000PSoundCardDlg::OnPaint() 
{
//添加主界面背景图片
CRect InterfaceRect; 
CPaintDC Interfacedc(this);
CBitmap Interfacebitmap;
CBrush   Interfacebrush;
CBrush*   pOldInterfaceBrush; Interfacebitmap.LoadBitmap(IDB_BITMAP_BACKGROUND);    //这个IDB_BITMAP1要自己添加,文件被定义在resource.h文件中,可以通过Easy USB 51 Programer Test1.rc这个文件来进行资源管理
Interfacebrush.CreatePatternBrush(&Interfacebitmap);//用于绘制背景图的画笔,使用上面的背景图片
pOldInterfaceBrush=Interfacedc.SelectObject(&Interfacebrush);
GetWindowRect(&InterfaceRect);//得到要绘图的区域,如果需要获得窗体在屏幕上的位置,使用GetWindowRect
//InterfaceRect.Width();//宽度 
//InterfaceRect.Height();//高度
Interfacedc.Rectangle(0,0,InterfaceRect.Width(),InterfaceRect.Height());   // 这些参数可以调整图片添加位置和大小
//Interfacedc.Rectangle(50,50,InterfaceRect.Width(),InterfaceRect.Height());   // 这些参数可以调整图片添加位置和大小
Interfacedc.SelectObject(pOldInterfaceBrush);
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);// 得到的是在客户区坐标系下的RECT(即以所在窗口左上角为原点,去掉了标题栏计算,仅仅是个大小,返回值的左上角永远为0,0) 
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else//否则直接执行OnPaint函数,这个是父类CDialog的静态方法
{
CDialog::OnPaint();
}
}

解决方案 »

  1.   

    露出灰色底OnEraseBkgnd(CDC* pDC) { return true;}
      

  2.   

    "暴力操作这些Slider,也就是不停的拖拽"
    拖拽 Slider 窗口 还是 滑块 ?
      

  3.   

    是暴力操作这些滑块,不停地用鼠标左扭右扭,因为我是使用这些滑块来模拟音乐设备的音量调整按钮,所以滑动它的时候它自身的背景图片会不停的变化(我有PS绘制了一些图片,用于滑块值改变时设置对应的背景图片,感觉这种方法有些笨),我想如果是Slider控件的问题,怎么会影响其他的按钮和窗体的背景图片呢?确实是先发现Slider的背景图片变成灰底,操作其他控件就都变成灰底了,还望指教,谢谢!
      

  4.   

    1 Slider控件的背景图片只要一个, 即足够大 (所有图合并 )
    2 patternbrush 在 初始化时 创建
    2 brush 背景时 dc.SetBrushOrg 参考
    void Cxxxx::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting
    // TODO: Add your message handler code here
    CRect rc;
    GetClientRect(rc);
    MapWindowPoints(GetParent(),rc);
    dc.SetBrushOrg(-rc.left,-rc.top);//  移动 原点
    GetClientRect(rc);
    dc.FillRect(&rc,m_brushPat);// 刷背景
      

  5.   

    最后做一些收尾操作试试:Interfacebitmap.DeleteObject();
    Interfacebrush.DeleteObject();