我在对话框上定义了一个CStatic成员   创建后加载了一幅图片   然后要在图片上写上一行字。   我是在Onpaint函数里写的。   但是显示时没有。
 
   只要一遮挡就显示出来了。   改到OniniteDlg函数里   只显示图片不显示字请问是什么问题啊 !

解决方案 »

  1.   

    这是什么类啊
    CSDN上都查不到??
    怎么用啊 !
      

  2.   

    把CStatic这个控件窗口这么整一下 ShowWindow(SW_HIDE);
    ShowWindow(SW_NORMAL);
      

  3.   

    楼上说的不行啊那相当于调用了InVilidate闪个不停在Onpaint里用的
      

  4.   

    以CWnd为基类实现一下,
    然后把CStatic定义为这个类或者把你的cstatic改为picture control
      

  5.   

    从cstatic下继承,然后在OnEraseBk  擦除背景的消息中绘制,不要再调用原来的擦除函数,return true。  增加接口 设置图片,文字。  在dlg中将 控件类型修改为新的类就可以了。 要使用标准的继承方式进行扩展, 在dlg中画,代码很难看,也没有模块性。
      

  6.   


    // 重载CStatic类型,在WM_PAINT消息的OnPaint函数中加载Bitmap位图和绘制文字
    void CNewStatic::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting
    // TODO: Add your message handler code here
    CString strText(_T("Hello,World!"));
    CDC memDC;
    memDC.CreateCompatibleDC(&dc);
    CRect rc;
    GetClientRect(&rc);
    CBitmap bmp;
    bmp.LoadBitmap(IDB_BITMAP1);
    HBITMAP hOldbmp = (HBITMAP)memDC.SelectObject(bmp);
    memDC.SetBkMode(TRANSPARENT);
    memDC.DrawText(strText, &rc, DT_CENTER|DT_VCENTER);
    dc.BitBlt(0, 0, rc.Width(), rc.Height(), &memDC, 0, 0, SRCCOPY);
    memDC.SelectObject(hOldbmp);
    bmp.DeleteObject();
    memDC.DeleteDC();
    // Do not call CStatic::OnPaint() for painting messages
    }
      

  7.   

    然后要在图片上写上一行字。  我是在Onpaint函数里写的
    -----------------------
    Onpaint函数里写的代码呢?从现象来看你是用主对话框的DC来写文字的,
    而你显示的图片却是由CStatic控件来管理的,当你启动的时候你主对话框的DC写出来的文字以后会被CStatic控件的刷新显示给覆盖掉。
    当你遮挡主对话框的时候就会产生ONPAINT消息来写文字,而此时CStatic控件并未被挡住,
    所有不会产生ONPAINT消息,所以文字就显示出来了。由于一个在子窗口更新,一个在主窗口更新,所有很难协调一致,最好的办法就是用楼上的方法,都放在重载的CSTATIC类中显示。