MFC10环境下用MFC4的方法实现CEdit透明

转载请注明来源:http://www.cnblogs.com/xuesongshu/

  在创建MFC项目的时候最后一步把窗口继承的类由CDialogEx改为CDialog。这一步很重要哦。

  用类向导实现窗口的WM_CTLCOLOR,代码如下:

HBRUSH CAlphaEditMfc10Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	//HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO:  在此更改 DC 的任何特性
	pDC->SetBkMode(TRANSPARENT);
	return (HBRUSH)GetStockObject(NULL_BRUSH);
	// TODO:  如果默认的不是所需画笔,则返回另一个画笔
	//return hbr;
}

  导入一张位图,把OnPaint改一改:

void CAlphaEditMfc10Dlg::OnPaint()
{
	CPaintDC dc(this); // 用于绘制的设备上下文
	CRect rect;
	GetClientRect(&rect);
	if (IsIconic())
	{
		

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		//CDialog::OnPaint();
		CBitmap bmp;
		bmp.LoadBitmap(IDB_BITMAP1);
		CBrush br;
		br.CreatePatternBrush(&bmp);
		dc.FillRect(&rect,&br);
	}
}

  用代码改为全透明之后下面的按钮太难看,把它子类化,实现WM_PAINT消息:

void CMyButton::OnPaint()
{
	PAINTSTRUCT ps;
	CPaintDC* dc=(CPaintDC*)BeginPaint(&ps); // device context for painting
	// TODO: 在此处添加消息处理程序代码
	// 不为绘图消息调用 CButton::OnPaint()
	dc->SetBkMode(TRANSPARENT);
	dc->SelectObject(GetStockObject(NULL_BRUSH));
	dc->SelectObject(CreatePen(PS_DOT,1,RGB(255,0,0)));
	LOGFONT lf;
	memset(&lf,0,sizeof(LOGFONT));
	lstrcpy(lf.lfFaceName,L"微软雅黑");
	lf.lfHeight=24;
	dc->SelectObject(CreateFontIndirect(&lf));
	dc->Rectangle(ps.rcPaint.left,ps.rcPaint.top,ps.rcPaint.right,ps.rcPaint.bottom);
	dc->DrawText(L"确定",2,&ps.rcPaint,DT_CENTER|DT_VCENTER);
	EndPaint(&ps);
}

  CEdit透明之后需要实现一个EN_CHANGE消息,否则文件删除就像没删一样:

void CAlphaEditMfc10Dlg::OnChangeEdit1()
{
	// TODO:  如果该控件是 RICHEDIT 控件,它将不
	// 发送此通知,除非重写 CDialog::OnInitDialog()
	// 函数并调用 CRichEditCtrl().SetEventMask(),
	// 同时将 ENM_CHANGE 标志“或”运算到掩码中。

	// TODO:  在此添加控件通知处理程序代码
	RECT r;
	GetDlgItem(IDC_EDIT1)->GetWindowRect(&r);
	ScreenToClient(&r);
	InvalidateRect(&r,TRUE);
}

  好了,运行效果如下:

posted @ 2013-03-13 04:50  岬淢箫声  阅读(1246)  评论(0编辑  收藏  举报