MFC edit控件

lcsmwp 2011-01-27 03:06:01
我用图片作为一对话框背景,再在对话框上放 edti控件,运行后edit部分为白色,我想问一下怎么让edit部分显示对应的背景图片部分,
BRUSH CxxxDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
这种方法用过了,不行
希望大家帮帮忙
...全文
401 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2011-02-06
  • 打赏
  • 举报
回复
下面是使用隐藏edit的方法,略简单些,不再使用pDCex:

BOOL CDrawEditDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
// add edit rect,must here!
if(!m_blInitEditBr) m_SelEdit.ShowWindow(SW_HIDE);
// normal
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);//DeleteDC needed
CBitmap* pOldBitmap = dcMem.SelectObject(&m_bitmap);
// Retrieve the size of our bitmap...
BITMAP bmp;
m_bitmap.GetObject(sizeof(bmp),&bmp);
// and the size of our window's client area
CRect rect;
GetClientRect(&rect);
pDC->StretchBlt(rect.left, rect.top,rect.Width(), rect.Height(),
&dcMem,0, 0, bmp.bmWidth, bmp.bmHeight,SRCCOPY);
//
if(!m_blInitEditBr)
{// Create Edit background brush; only once !
CRect selEditRc;
m_SelEdit.GetWindowRect(selEditRc);
//we create the background brush of SelEdit
CDC dcMemEd;
dcMemEd.CreateCompatibleDC(pDC);//DeleteDC needed
//
CBitmap EditBmp;//DeleteObject needed
EditBmp.CreateCompatibleBitmap(pDC,selEditRc.Width(),selEditRc.Height());
//
CBitmap* pOld = dcMemEd.SelectObject(&EditBmp);
ScreenToClient(&selEditRc);
MapWindowPoints(this,selEditRc);
dcMemEd.BitBlt(0,0,selEditRc.Width(),selEditRc.Height(),
pDC,selEditRc.left, selEditRc.top, SRCCOPY);
CBitmap *nowBMP=dcMemEd.SelectObject(pOld);
// copy to CB for checking
#ifdef TEST
OpenClipboard();
EmptyClipboard();
SetClipboardData(CF_BITMAP,nowBMP->GetSafeHandle());
CloseClipboard();
#endif
m_pbrEd=new CBrush;
m_pbrEd->CreatePatternBrush(nowBMP);
m_blInitEditBr=TRUE;
//
DeleteObject(EditBmp);
dcMemEd.DeleteDC();
//
m_SelEdit.ShowWindow(SW_SHOW);
}
//
dcMem.SelectObject(pOldBitmap);
dcMem.DeleteDC();
//
return TRUE;
// return CDialog::OnEraseBkgnd(pDC);
}

if(!m_blInitEditBr) m_SelEdit.ShowWindow(SW_HIDE);必须在CreateCompatibleDC(pDC)前
schlafenhamster 2011-02-05
  • 打赏
  • 举报
回复
给你写了一个例子,不知道你好用否:
1》dlg头:
CDrawEditDlg::~CDrawEditDlg();
CBitmap m_bitmap;
CBrush *m_pbrEd;
BOOL m_blInitEditBr;
1+》
CDrawEditDlg::CDrawEditDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDrawEditDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDrawEditDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_bitmap.LoadBitmap(IDB_CLOUDS);
m_pbrEd=0;
m_blInitEditBr=FALSE;
}

2》//
CDrawEditDlg::~CDrawEditDlg()
{
if(m_pbrEd)
{
DeleteObject(m_pbrEd);
delete m_pbrEd;
}
}
3》在第一次EraseBkgnd时生成PatternBrush,注意edit的背景被加上了。

BOOL CDrawEditDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);//DeleteDC needed
CBitmap* pOldBitmap = dcMem.SelectObject(&m_bitmap);
// Retrieve the size of our bitmap...
BITMAP bmp;
m_bitmap.GetObject(sizeof(bmp),&bmp);
// and the size of our window's client area
CRect rect;
GetClientRect(&rect);
// Create Edit background brush; only once !
if(!m_blInitEditBr)
{// add edit rect
CRgn prgnClip;
CRect selEditRc;
m_SelEdit.GetWindowRect(selEditRc);
prgnClip.CreateRectRgnIndirect(selEditRc);//DeleteObject needed
CDC* pDCex=GetDCEx(&prgnClip,DCX_PARENTCLIP);//ReleaseDC needed
// Fill the client area of dlg,include SelEdit with our bitmap
pDCex->StretchBlt(rect.left, rect.top,rect.Width(), rect.Height(),
&dcMem,0, 0, bmp.bmWidth, bmp.bmHeight,SRCCOPY);
//we create the background brush of SelEdit
CDC dcMemEd;
dcMemEd.CreateCompatibleDC(pDCex);//DeleteDC needed
CBitmap EditBmp;//DeleteObject needed
EditBmp.CreateCompatibleBitmap(pDCex,selEditRc.Width(),selEditRc.Height());
pOldBitmap = dcMemEd.SelectObject(&EditBmp);
ScreenToClient(&selEditRc);
MapWindowPoints(this,selEditRc);
dcMemEd.BitBlt(0,0,selEditRc.Width(),selEditRc.Height(),
pDCex,selEditRc.left, selEditRc.top, SRCCOPY);
CBitmap *nowBMP=dcMemEd.SelectObject(pOldBitmap);
// copy to CB for checking
#ifdef TEST
OpenClipboard();
EmptyClipboard();
SetClipboardData(CF_BITMAP,nowBMP->GetSafeHandle());
CloseClipboard();
#endif
m_pbrEd=new CBrush;
m_pbrEd->CreatePatternBrush(nowBMP);
m_blInitEditBr=TRUE;
//
DeleteObject(prgnClip);
DeleteObject(EditBmp);
ReleaseDC(pDCex);
dcMemEd.DeleteDC();
}
else
{// MORMAL
pDC->StretchBlt(rect.left, rect.top,rect.Width(), rect.Height(),
&dcMem,0, 0, bmp.bmWidth, bmp.bmHeight,SRCCOPY);
}
dcMem.SelectObject(pOldBitmap);
dcMem.DeleteDC();
//
return TRUE;
// return CDialog::OnEraseBkgnd(pDC);
}

4》要设置SetBkMode
HBRUSH CDrawEditDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
if((CTLCOLOR_EDIT==nCtlColor) && (*pWnd == m_SelEdit))
{
pDC->SetBkMode(TRANSPARENT);
return 0;
}
return hbr;
}
5》派生Edit (m_SelEdit)CSelEdit
6》注意 Invalidate();
void CSelEdit::OnChange()
{
// TODO: Add your control notification handler code here
Invalidate();
}
7》用PatternBrush刷背景
BOOL CSelEdit::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CDrawEditDlg *pdlg=(CDrawEditDlg*)GetParent();
CRect rc;
GetWindowRect(&rc);
ScreenToClient(&rc);
// afxDump << rc << "\n";
pDC->FillRect(rc,pdlg->m_pbrEd);
return TRUE;
// return CEdit::OnEraseBkgnd(pDC);
}
8》击键太快时有闪烁。
心留 2011-02-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pcgg5244 的回复:]
GetWindowRect(&rect);错了,应该得到EDIT的矩形
pWnd->GetWindowRect(&rect);
[/Quote]

问题还是要自己多发现
wyx100 2011-02-04
  • 打赏
  • 举报
回复
1,在oninitialdialog里用createpatternbrush以你的图片作为参数创建brush
2,在onCtrlcolor里返回刚才创建的brush就行了

schlafenhamster 2011-02-04
  • 打赏
  • 举报
回复
不好搞的。
1》对话框的背景一般用StretchBlt,这样edit部分的位置和大小难定。
2》对话框画背景时edit部分是Clip掉的,除非edit被hide。
3》如果edit使能scroll那么edit的背景(即对话框的某部分)会scroll而不在原位置)。
Fireway2008 2011-02-03
  • 打赏
  • 举报
回复
Edit 控件也是窗体类,继承CWnd
所以可以直接在其OnEraseBkgnd()内用5楼代码做处理贴图即可。
pcgg5244 2011-01-31
  • 打赏
  • 举报
回复
还漏了个SetBkMode(TRANSPARENT);
pcgg5244 2011-01-31
  • 打赏
  • 举报
回复
GetWindowRect(&rect);错了,应该得到EDIT的矩形
pWnd->GetWindowRect(&rect);
pcgg5244 2011-01-31
  • 打赏
  • 举报
回复
[C/C++]
HBRUSH CxxxDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
在OnCtlColor里面:

if(IDC_EDIT1==pWnd->GetDlgCtrlID())
{
CRect rect;
GetWindowRect(&rect);
ScreenToClient(&rect);
static BOOL Init=FALSE;
CDC memDC;
CBitmap bitmap;
if(!Init)
{
memDC.CreateCompatibleDC(pDC);
bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
memDC.SelectObject(&bitmap);
memDC.BitBlt(0,0,rect.Width(),rect.Height(),pDC,0,0,SRCCOPY);
Init=TRUE;
}
else
{
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,SCRCOPY);
}
static HBRUSH hbr=::CreatePatternBrush(bitmap);
return hbr;
}
大概是这么写的,我这没编译器,用记事本打的,可能有些拼写错误^^
varding 2011-01-31
  • 打赏
  • 举报
回复
1,在oninitialdialog里用createpatternbrush以你的图片作为参数创建brush
2,在onCtrlcolor里返回刚才创建的brush就行了
lyingbo 2011-01-28
  • 打赏
  • 举报
回复
看有没办法把edit弄成透明色
lcsmwp 2011-01-28
  • 打赏
  • 举报
回复
不用bmp图片,用png图片 最要好给个能批量处理的方法,因为要用好多edit控件
羽飞 2011-01-27
  • 打赏
  • 举报
回复
绘制自己的Edit,OnCtlColor里面又不能画图,自己绘制背景,处理按键消息

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧