网上有一个可以Buttion按钮贴图的例子,看了,不错,实现原理大至是用两幅完全一黑一白的图片来实现美观的BUTTION的,这种方法可能也可以用于CEdit,有人实现过吗,类似的还有tab控件,ListCtrl控件,还有想知道如何让给对话框贴的图片随对话框做拉伸变化,

解决方案 »

  1.   

    拉伸的话用 StretchBlt();不过感觉这样的话,显示出来的也许会很难看,变廋了或者压扁了的图像,肯定不好看
      

  2.   

    知道怎么处理了,还是尽量给对话框贴一幅尽量大的图片,但是图片上的元素位置都要与程序初始时的窗口上适应,其它区域的颜色只要与图片主色调一致就行了,这样最大化时可以显示出一幅图(不是几幅一样的图的拼图),反正控件都可以伸缩的,图片就不动了,这样处理应该就可以了,恩,这是对话框贴图最好的解决办法了,我觉得
        剩下的就是CEdit的贴图了,如想制作长椭圆外形的CEdit咋贴图,最好再介绍下Tab控件,ListCtrl控件和树形控件的贴图方法,不胜感激
      

  3.   

    重载OnCtlColor
    CClientDC dc((CEdit*)(this->GetDlgItem(nID)));
    CRect rect;
    this->GetDlgItem(nID)->GetClientRect(&rect);
     //  CDC dc1;
       pDC->Attach(dc.m_hDC);//&rect,
    CBitmap bitmap;
    bitmap.LoadBitmap(IDB_BRUSH1);
    CBrush br, *pOldBrush;
    br.CreatePatternBrush(&bitmap);
    pOldBrush=dc1.SelectObject(&br);
    pDC->FillRect(&rect,&br);
    //显示文字
    //选择系统字体
    pDC->SetBkMode(TRANSPARENT);
    代码要稍作修改
      

  4.   

    楼主既然想做界面库,应该下载个界面库先研究,吸收一些经验,关于CEdit贴图,去我的博客找找,几年前我写过一篇CEdit贴图的文件,关于用图片做窗口背景,并且缩放,有种方法叫9宫格,你可以去我们网站www.iuishop.com上找LibUIDK缩放原理,上面有详细的图文教程,或者下载LibUIDK试用版,帮助文档也有介绍,并且用LibUIDK创建出来的基本界面,就是支持图片缩放的,你可以看看效果。
    还有,做界面库的话,没有太大的必要去管Tab控件,因为可以用radiobutton控件来代码,效果更好。
    list、tree贴图本身很简单,处理WM_PAINT就可以(90%以上的都是处理WM_PAINT,对于mfc提供的虚函数自绘,可以忽略,有很多问题)。list的header和scroll bar贴图,有一点点难度,你还要支持可变高度的header或可变宽度的scrollbar.
    对于tree,你更多的是对item的处理,而不是tree本身,比如做QQ好友列表的tree,每个item的高度可以不一样等等。
    最后,祝你成功。
      

  5.   

    5楼的方法我看了,好像有点不行样啊,仅那样做,还不够,,,我目前手上的资料只有button贴图和对话框贴图,button贴图的原理还在研究当中,想照搬原理用在CEdit当中,但困惑的是CEdit的中间是空心的,边缘是要被贴图的,用掩码图片的话不知道能不能行,,这个弄会了再弄进度条和微调按钮,再弄listCtrl,请psbeond大虾继续指点!!  
        
      

  6.   

    CEDIT好像不支持位图,用CRICHEDIT吧,网上搜搜
      

  7.   


    我博客里CEdit贴图一定是可以的,我们LibUIDK界面库就是这样贴上去的。不过这篇文件是简化版,真正实现时,还有一些细节要处理,比如CEdit这个控件,在不同的操作系统下,或者在相同操作系统,但不同桌面主题下,或者CEdit有不同属性时,比如是否多行。绘制时有点不同。
      

  8.   

    这是在网上找的例子代码,整理后的:
    以CSkinEdit( public CEdit )为例:
      设置Edit的属性:Multiline, 无Border
      
    1.映射消息:
      ON_WM_CTLCOLOR_REFLECT()
      HBRUSH CSkinEdit::CtlColor(CDC* pDC, UINT nCtlColor) 
      {
          CBitmap bmp;
          bmp.LoadBitmap( IDB_BITMAP1 );
          m_Brush.Detach();
          m_Brush.CreatePatternBrush( &bmp );
          pDC->SetBkMode(TRANSPARENT);
          return (HBRUSH)m_Brush;
      }
      m_Brush为CSkinEdit里的CBrush类型的成员变量.
      特别注意:
      pDC的坐标原点为Edit控件左上角在父窗口的坐标, 所以IDB_BITMAP1左上角对应Edit父窗口的左上角,而不是Edit控件的左上角
      
    2.映射消息:
      ON_CONTROL_REFLECT(EN_CHANGE, OnChange)
      void CSkinEdit::OnChange() 
      {
      InvalidateRect( NULL );
      }这是你博客里的代码:
    设置Edit的属性:Multiline, 无Border1.定义类成员变量:CBitmap m_bmp;CBrush m_brush;在WM_CREATE消息中初始化它们:int CSkinEdit::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
     if (CEdit::OnCreate(lpCreateStruct) == -1)
      return -1;
     
     // TODO: Add your specialized creation code here
     HBITMAP hBmp = (HBITMAP)LoadImage( AfxGetInstanceHandle(), "C:\\background.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
     ASSERT( hBmp != NULL );
     m_bmp.Attach( hBmp ); m_brush.CreatePatternBrush( &m_bmp );
     
     return 0;
    }
    1.映射消息:
     ON_WM_CTLCOLOR_REFLECT()HBRUSH CSkinEdit::CtlColor(CDC* pDC, UINT nCtlColor) 
    {
     // TODO: Change any attributes of the DC here  pDC->SetBkMode(TRANSPARENT); return (HBRUSH)m_brush;
     
     // TODO: Return a non-NULL brush if the parent's handler should not be called
     return NULL;
    }特别注意:
    pDC的坐标原点为Edit控件左上角在父窗口的坐标, 所以C:\\background.bmp左上角对应Edit父窗口的左上角,而不是Edit控件的左上角2.映射消息:
     ON_CONTROL_REFLECT(EN_CHANGE, OnChange)void CSkinEdit::OnChange() 
    {
     // TODO: If this is a RICHEDIT control, the control will not
     // send this notification unless you override the CEdit::OnInitDialog()
     // function and call CRichEditCtrl().SetEventMask()
     // with the ENM_CHANGE flag ORed into the mask. // TODO: Add your control notification handler code here
     InvalidateRect( NULL );
     
    }本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/psbeond/archive/2005/06/02/386223.aspx
    区别就是在于在Create的时候,试下看,反正按照上面那代码改好像还不行,
      

  9.   


    那说明你网上找的就是转载我写的,两篇文章是一样的。我那个是原创。
    另外,你的Edit是在对话框中通过资源管理器拖进去,然后绑定CEdit类型,然后再改成CSkinEdit吗?如果是这样,你可以试试直接动态创建,就是定义CSkinEdit变量m_edt,然后在OnCreate中,m_edt.Create(...)
      

  10.   

    不行啊,那样跟5楼的效果的区别仅在于一个是将Edit的背景色变成了图片,而没有改变Edit的矩形形状,我看那个button的改变外形和响应区域的原理就是用一个黑白图形与原控件的DC进行bitblt时指定是OR或AND,以达到那样的效果的,有木有人这样试过