问题是这样的,在对话框OnCtlColor中对SLIDER设置背景,主要是为了和对话框背景一致,成功后,一旦最小化后会出现SIDER控件看不见。在上面点一下又会出来的,最小化时间长一些也不会出现问题,就是一最小化,马上恢复就会看不见控件,求解?HBRUSH CPhotoXDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); if (pWnd->GetDlgCtrlID()==IDC_SLIDERFONTSIZE)
{
CRect    rect;
CRect    clientrect;
GetDlgItem(IDC_SLIDERFONTSIZE)->GetWindowRect(&rect); 
GetWindowRect(&clientrect);
//CDC    *pDC=GetDC();  
CDC    memdc;   
memdc.CreateCompatibleDC(pDC);   
CBitmap    bitmap;   
int wi=rect.left-clientrect.left;
int hi=rect.top-clientrect.top;
//从资源中载入位图   
bitmap.LoadBitmap(IDB_BITMAP1);   
memdc.SelectObject(bitmap);   
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memdc,wi,hi,SRCCOPY); 
return (HBRUSH)::GetStockObject(NULL_BRUSH);  // 设置背景色
} return hbr;
}
void CPhotoXDlg::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();
}
CRect    rect;   
GetClientRect(&rect);   
CDC    *pDC=GetDC();   
CDC    memdc;   
memdc.CreateCompatibleDC(pDC);   
CBitmap    bitmap;   
//从资源中载入位图   
bitmap.LoadBitmap(IDB_BITMAP1);   
memdc.SelectObject(bitmap);   
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memdc,0,0,SRCCOPY); 
}

解决方案 »

  1.   


    void CPhotoXDlg::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
    {
    CRect    rect;   
    GetClientRect(&rect);   
    CDC    *pDC=GetDC();   
    CDC    memdc;   
    memdc.CreateCompatibleDC(pDC);   
    CBitmap    bitmap;   
    //从资源中载入位图   
    bitmap.LoadBitmap(IDB_BITMAP1);   
    memdc.SelectObject(bitmap);   
    pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memdc,0,0,SRCCOPY); 
            }
    }
      

  2.   


    void CPhotoXDlg::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
    {
    CPaintDC dc(this);
    CRect    rect;   
    GetClientRect(&rect);     
    CDC    memdc;   
    memdc.CreateCompatibleDC(dc);   
    CBitmap    bitmap;   
    //从资源中载入位图   
    bitmap.LoadBitmap(IDB_BITMAP1);   
    memdc.SelectObject(bitmap);   
    dc.BitBlt(0,0,rect.Width(),rect.Height(),&memdc,0,0,SRCCOPY); 
         }
    }
      

  3.   


    试过你这种方法不行,我觉得应该是Slider控的背景挡住了控件,因为我不要对话框背景的时候也是出现这样的问题。
      

  4.   


    试过你这种方法不行,我觉得应该不是对话框的背景问题,应该是Slider控件的问题,因为我取消了对话框背景,只留slider控件背景的时候还是一样出现这个问题,估计是slider背景挡了控件,就是不知道怎么解决
      

  5.   


    试过你这种方法不行,我觉得应该不是对话框的背景问题,应该是Slider控件的问题,因为我取消了对话框背景,只留slider控件背景的时候还是一样出现这个问题,估计是slider背景挡了控件,就是不知道怎么解决
      

  6.   

    在oerasebkground中刷新背景
    不要再onpaint中刷新!
      

  7.   

    在OnPaint里应该用CPaintDC
    不要用GetDC获取DC
      

  8.   

    我其它 控件正常,就是slider控件 不正常
      

  9.   


    已经试过了。就是不行。估计不是对话框背景问题,是slider问题,也就是说OnCtlColor里面出问题,挡了slider后我在原位置点击又能显示出来的
      

  10.   

    HBRUSH CPhotoXDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){    HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);     if (pWnd->GetDlgCtrlID()==IDC_SLIDERFONTSIZE)    {        CRect    rect;        CRect    clientrect;        GetDlgItem(IDC_SLIDERFONTSIZE)->GetWindowRect(&rect);         GetWindowRect(&clientrect);        //CDC    *pDC=GetDC();          CDC    memdc;           memdc.CreateCompatibleDC(pDC);           CBitmap    bitmap;           int wi=rect.left-clientrect.left;        int hi=rect.top-clientrect.top;        //从资源中载入位图           bitmap.LoadBitmap(IDB_BITMAP1);           memdc.SelectObject(bitmap);           pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memdc,wi,hi,SRCCOPY);         return (HBRUSH)::GetStockObject(NULL_BRUSH);  // 设置背景色    }     return hbr;}
    我让这个只刷新一次的话,最小化后slider背景不会挡slider控件,不过滑块拖动会有卡痕
      

  11.   

    下载我的“Slider自绘.zip”0分
    http://download.csdn.net/detail/schlafenhamster/4671464
      

  12.   

    楼上的自绘好像不太好用,还是用继承slider,重写自绘方法就可以了。
    最终解决方法+例子
    http://blog.7cdi.com/aaaa/showtopic_126.html谢谢大家的回复。