我现在学习CStatic控件,我在对话框的OK按钮里写了如下代码,生成一个CStatic显示图片;        CStatic *pStatic = new CStatic;
pStatic->Create(_T(""), WS_CHILD | WS_VISIBLE | SS_BITMAP, CRect(0, 0, 100, 100), this, 0x1100); CBitmap m_bitmap;
HBITMAP m_hmap;
m_hmap = (HBITMAP)LoadImage(NULL, _T("d:/123.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
m_bitmap.Attach(m_hmap); CWnd *pWnd = GetDlgItem(0x1100);
CDC *pdc = pWnd->GetDC();
        CDC memdc;
memdc.CreateCompatibleDC(NULL); memdc.SelectObject(&m_bitmap); pdc->BitBlt(0, 0, 95, 95, &memdc, 0, 0, SRCCOPY);但问题是 我一点击OK按钮,图片是显示出来了,同时确使对话框重画了,也就是onpaint()函数被执行了,瞬间图片就被刷新掉了。
请问我要怎么样处理,图片才会一直显示在对话框上呢?

解决方案 »

  1.   

    把显示图片的代码放到static的onpaint里面
      

  2.   

    把你绘图的代码放到OnPaint中去做
      

  3.   

    这个CStatic是在OK按钮里面动态建立的,怎么把显示图片的代码放到onpaint里面???
    不明白啊。
      

  4.   

    哦,你们的意思是放到对话框的onpaint里面是吧,我试下。
      

  5.   

    把你刷界面的代码放到在OnPaint中
    另外:
    GetDC()后必须ReleaseDC否则会有内存泄漏
      

  6.   


    那就分开放,创建的部分放到OK按钮中,画图的部分放到OnPaint中
      

  7.   

    我一般建议通过自定义控件实现此类需求
    具体可以参阅此篇文章
    http://blog.csdn.net/xianglitian/archive/2010/12/14/6075653.aspx
      

  8.   

    我把显示图片的代码放到对话框的OnPaint里面,但是图片一直闪烁啊,
    我如果把这句加上CDialog::OnPaint();就看不到图片;
    如果把它去掉,图片就一直闪烁。
      

  9.   


    CStatic *pStatic = NULL; // 最后记得delete掉void CXXXDlg::OnOK() 
    {
    // TODO: Add extra validation here
    if(NULL == pStatic)
    {
    pStatic = new CStatic;
    pStatic->Create(_T(""), WS_CHILD | WS_VISIBLE | SS_BITMAP, CRect(0, 0, 100, 100), this, 0x1100);
    }
    }void CXXXDlg::OnPaint() 
    {
    CPaintDC dc(this); // 下面的LoadImage完全可以放到OnInitDialog中去做,没有必要放到OnPaint中
    CBitmap m_bitmap;
        HBITMAP m_hmap;
        m_hmap = (HBITMAP)LoadImage(NULL, _T("F:\\11.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
        m_bitmap.Attach(m_hmap);

        CWnd *pWnd = GetDlgItem(0x1100);
    if(pWnd && pWnd->GetSafeHwnd())
    {
    CDC *pdc = pWnd->GetDC();
    CDC memdc;
    memdc.CreateCompatibleDC(pdc);

    CBitmap* pOldBitmap = (CBitmap*)memdc.SelectObject(&m_bitmap);

    pdc->BitBlt(0, 0, 95, 95, &memdc, 0, 0, SRCCOPY);

    memdc.SelectObject(pOldBitmap);
    m_bitmap.DeleteObject();
    memdc.DeleteDC();
    pWnd->ReleaseDC(pdc);
    }
    }
      

  10.   

    两种方法:
    1.继承CStatic类,自己重写OnPaint方法,在新继承类的OnPaint方法里面处理图片显示
    2.在Dialog的OnPaint方法中处理图片显示,但要用CStatic窗口的DC来画。
      

  11.   

    为什么要用DC画呢,直接调用函数SetBitmap不可以吗?
    CStatic *pStatic = new CStatic;
    pStatic->Create(_T(""), WS_CHILD | WS_VISIBLE | SS_BITMAP, CRect(0, 0, 100, 100), this, 0x1100);HBITMAP m_hmap = (HBITMAP)LoadImage(NULL, _T("d:/123.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    pStatic->SetBitmap(m_hmap);