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);

}

  好了,运行效果如下:

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

你可能感兴趣的:(mfc)