MFC基于对话框的程序,要实现对话框中编辑框透明效果,融合对话框的背景图片,且对话框背景图片每隔几秒显示一张,不影响编辑框的透明效果。。(编辑框显示对话框背景图片的效果)
下面是我的部分代码:
我继承了CEdit的类,写了个编辑框的类CEditTrans。处理编辑框的透明效果。EditTrans.h 文件:private:
COLORREF m_TextColor;
COLORREF m_BackColor;
CBrush m_Brush;// Operations
public:
void SetTextColor(COLORREF col) { m_TextColor = col;
UpdateCtrl(); }
void SetBackColor(COLORREF col) { m_BackColor = col;
UpdateCtrl(); }
private:
void UpdateCtrl();//---------------------------------------------------------------
EditTrans.cpp 文件:#include "stdafx.h"
#include "EditTrans.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/////////////////////////////////////////////////////////////////////////////
// CEditTransCEditTrans::CEditTrans()
{
m_TextColor = RGB(0, 0, 0);
m_BackColor = TRANS_BACK;
}CEditTrans::~CEditTrans()
{
}
BEGIN_MESSAGE_MAP(CEditTrans, CEdit)
//{{AFX_MSG_MAP(CEditTrans)
ON_WM_CTLCOLOR_REFLECT()
ON_CONTROL_REFLECT(EN_UPDATE, OnUpdate)
ON_WM_LBUTTONDOWN()
ON_CONTROL_REFLECT(EN_KILLFOCUS, OnKillfocus)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CEditTrans message handlersHBRUSH CEditTrans::CtlColor(CDC* pDC, UINT nCtlColor)
{
m_Brush.DeleteObject(); if (m_BackColor == TRANS_BACK) {
m_Brush.CreateStockObject(HOLLOW_BRUSH);
pDC->SetBkMode(TRANSPARENT);
}
else {
m_Brush.CreateSolidBrush(m_BackColor);
pDC->SetBkColor(m_BackColor);
} pDC->SetTextColor(m_TextColor); return (HBRUSH)m_Brush;
}
void CEditTrans::OnKillfocus()
{
UpdateCtrl();
}
void CEditTrans::OnUpdate()
{
UpdateCtrl();
}
void CEditTrans::OnLButtonDown(UINT nFlags, CPoint point)
{
UpdateCtrl();
CEdit::OnLButtonDown(nFlags, point);
}
void CEditTrans::UpdateCtrl()
{
CWnd* pParent = GetParent();
CRect rect;
GetWindowRect(rect);
pParent->ScreenToClient(rect);
rect.DeflateRect(2, 2);
pParent->InvalidateRect(rect, FALSE);
}
然后我在CTestEditDlg.h CTestEditDlg.cpp 文件中调用,但是显示不出透明的效果,编译运行都是正确的。就是不能显示透明效果,编辑的背景色不是对话框背景图片的颜色。。
望高手们帮忙解决。 谢谢! 然后我用关联的CEdit变量去调用,就是显示不出透明效果。CTestEditDlg.h 文件:public:
CFont m_EditFontTime;
CEditTrans m_EditTime; CFont m_EditFontScore;
CEditTrans m_EditScore;
下面是我的部分代码:
我继承了CEdit的类,写了个编辑框的类CEditTrans。处理编辑框的透明效果。EditTrans.h 文件:private:
COLORREF m_TextColor;
COLORREF m_BackColor;
CBrush m_Brush;// Operations
public:
void SetTextColor(COLORREF col) { m_TextColor = col;
UpdateCtrl(); }
void SetBackColor(COLORREF col) { m_BackColor = col;
UpdateCtrl(); }
private:
void UpdateCtrl();//---------------------------------------------------------------
EditTrans.cpp 文件:#include "stdafx.h"
#include "EditTrans.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/////////////////////////////////////////////////////////////////////////////
// CEditTransCEditTrans::CEditTrans()
{
m_TextColor = RGB(0, 0, 0);
m_BackColor = TRANS_BACK;
}CEditTrans::~CEditTrans()
{
}
BEGIN_MESSAGE_MAP(CEditTrans, CEdit)
//{{AFX_MSG_MAP(CEditTrans)
ON_WM_CTLCOLOR_REFLECT()
ON_CONTROL_REFLECT(EN_UPDATE, OnUpdate)
ON_WM_LBUTTONDOWN()
ON_CONTROL_REFLECT(EN_KILLFOCUS, OnKillfocus)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CEditTrans message handlersHBRUSH CEditTrans::CtlColor(CDC* pDC, UINT nCtlColor)
{
m_Brush.DeleteObject(); if (m_BackColor == TRANS_BACK) {
m_Brush.CreateStockObject(HOLLOW_BRUSH);
pDC->SetBkMode(TRANSPARENT);
}
else {
m_Brush.CreateSolidBrush(m_BackColor);
pDC->SetBkColor(m_BackColor);
} pDC->SetTextColor(m_TextColor); return (HBRUSH)m_Brush;
}
void CEditTrans::OnKillfocus()
{
UpdateCtrl();
}
void CEditTrans::OnUpdate()
{
UpdateCtrl();
}
void CEditTrans::OnLButtonDown(UINT nFlags, CPoint point)
{
UpdateCtrl();
CEdit::OnLButtonDown(nFlags, point);
}
void CEditTrans::UpdateCtrl()
{
CWnd* pParent = GetParent();
CRect rect;
GetWindowRect(rect);
pParent->ScreenToClient(rect);
rect.DeflateRect(2, 2);
pParent->InvalidateRect(rect, FALSE);
}
然后我在CTestEditDlg.h CTestEditDlg.cpp 文件中调用,但是显示不出透明的效果,编译运行都是正确的。就是不能显示透明效果,编辑的背景色不是对话框背景图片的颜色。。
望高手们帮忙解决。 谢谢! 然后我用关联的CEdit变量去调用,就是显示不出透明效果。CTestEditDlg.h 文件:public:
CFont m_EditFontTime;
CEditTrans m_EditTime; CFont m_EditFontScore;
CEditTrans m_EditScore;
我不知道怎么截图,粘贴早CSDN的回帖中,不然我截个图,就很明白了。 怎么在CSDN回帖中贴图片,截图。
在OnEraseBkGnd()这个函数里面把返回值改成TRUE;
在OnPaint()这个函数里面添加显示文本的代码,添加如下代码:
CRect rcClient;
GetClientRect(rcClient);
CString strText;
GetWindowText(strText);
dc.TextOut(rcClient.left,rcClient.top,strText);
这样子应该改就可以实现你要的功能
1。隐藏edit(SW_HIDE),让dlg在edit区画背景。
2。OnEraseBkgn时把edit区的背景产生成一个patBrush
m_pbrEd=new CBrush;
m_pbrEd->CreatePatternBrush(nowBMP);
m_blInitEditBr=TRUE;3。显示edit。
4。派生edit。
//
#define ONE_DC
#ifdef ONE_DC
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);
}
#else
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);
}
#endif//注意edit 是无border的,多行(ctrl cr 回车 换行)
//派生edit的3个函数如下:class CSelEdit : public CEdit
void CSelEdit::OnChange()
{
// TODO: Add your control notification handler code here
Invalidate();
}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);//PatternBrush
return TRUE;
// return CEdit::OnEraseBkgnd(pDC);
}void CSelEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
if((nChar==VK_LEFT) || (nChar==VK_RIGHT) || (nChar==VK_UP) ||(nChar==VK_DOWN))
{
afxDump << nChar<< "\n";
CPoint pt=GetCaretPos();
afxDump << pt << "\n";
afxDump << "Column:" << pt.x/7+1 << "\n";
afxDump << "Row:" << pt.y/8+1 << "\n";
}
}
{
// 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);//PatternBrush
return TRUE;
// return CEdit::OnEraseBkgnd(pDC);
}CDrawEditDlg这是主对话框的类名,在子类中编译的时候出错。 pdlg->m_pbrEd中的m_pbrEd未定义,可是定义之后也编译出错。 麻烦您在帮忙看看。解释一下,谢谢!
class CDrawEditDlg : public CDialog
{
// Construction
public:
CDrawEditDlg(CWnd* pParent = NULL); // standard constructor
~CDrawEditDlg();
CBitmap m_bitmap;
CBrush *m_pbrEd;
BOOL m_blInitEditBr;