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 );
剩下的就是CEdit的贴图了,如想制作长椭圆外形的CEdit咋贴图,最好再介绍下Tab控件,ListCtrl控件和树形控件的贴图方法,不胜感激
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);
代码要稍作修改
还有,做界面库的话,没有太大的必要去管Tab控件,因为可以用radiobutton控件来代码,效果更好。
list、tree贴图本身很简单,处理WM_PAINT就可以(90%以上的都是处理WM_PAINT,对于mfc提供的虚函数自绘,可以忽略,有很多问题)。list的header和scroll bar贴图,有一点点难度,你还要支持可变高度的header或可变宽度的scrollbar.
对于tree,你更多的是对item的处理,而不是tree本身,比如做QQ好友列表的tree,每个item的高度可以不一样等等。
最后,祝你成功。
我博客里CEdit贴图一定是可以的,我们LibUIDK界面库就是这样贴上去的。不过这篇文件是简化版,真正实现时,还有一些细节要处理,比如CEdit这个控件,在不同的操作系统下,或者在相同操作系统,但不同桌面主题下,或者CEdit有不同属性时,比如是否多行。绘制时有点不同。
以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的时候,试下看,反正按照上面那代码改好像还不行,
那说明你网上找的就是转载我写的,两篇文章是一样的。我那个是原创。
另外,你的Edit是在对话框中通过资源管理器拖进去,然后绑定CEdit类型,然后再改成CSkinEdit吗?如果是这样,你可以试试直接动态创建,就是定义CSkinEdit变量m_edt,然后在OnCreate中,m_edt.Create(...)