文档章节

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

妆台秋思
 妆台秋思
发布于 2017/08/14 14:29
字数 443
阅读 0
收藏 0
转载请注明来源: 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);
}

  好了,运行效果如下:

© 著作权归作者所有

妆台秋思
粉丝 0
博文 66
码字总数 67163
作品 0
深圳
Android工程师
私信 提问
CEdit 用做滚屏显示

在写代码中,我们经常喜欢用CEdit控件来动态滚屏显示内容,如在串口程序中,用CEdit控件来显示串口的信息,显示完一行数据,自动跳到下一行,如果超出一屏,那么自动滚屏. 为了确保上述功能,得按以下...

长平狐
2013/03/19
69
0
VC++中四种进程或线程同步互斥的控制方法

现在流行的进程线程同步互斥的控制机制,其实是由最原始最基本的4种方法实现的。由这4种方法组合优化就有了.Net和Java下灵活多变的,编程简便的线程进程控制手段。 这4种方法具体定义如下 在...

长平狐
2013/01/06
694
0
VC++中四种进程或线程同步互斥的控制方法

现在流行的进程线程同步互斥的控制机制,其实是由最原始最基本的4种方法实现的。由这4种方法组合优化就有了.Net和Java下灵活多变的,编程简便的线程进程控制手段。 这4种方法具体定义如下 在...

晨曦之光
2012/03/02
874
0
mfc控件与其对应的对象的关联方法

对话框的控件与其对应类的对象相关联:(两种方法) (1) 通过CWnd::DoDataExchange函数进行关联; 用VC++6.0的MFC ClassWizard中的Member Variables页面的Add Variable关联一个变量 然后在...

长平狐
2012/10/08
218
0
GStreamer 1.12 发布,多媒体开发框架

GStreamer 1.12 发布了。GStreamer 是 GNOME 桌面环境下用来构建流媒体应用的多媒体框架(framework),其目标是要简化音/视频应用程序的开发,目前已经能够被用来处理像 MP3、Ogg、MPEG1、M...

达尔文
2017/05/05
938
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
1K
12
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
38
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
59
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部