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

      好了,运行效果如下:

  • 相关阅读:
    Windows 创建 Redis 和 zookeeper 系统服务
    mysql 5.7 非正常安装,无法启动 服务没有报告任何错误
    将整个 project 资源打包
    使用Nexus3搭建Maven私服+上传第三方jar包到本地maven仓库
    所有子模块都要执行的checkstyle检查
    把项目通过maven生产源码包和文档包并发布到自己的私服上
    C#.NET常见问题(FAQ)-在VS程序如何取消.vshost的进程
    C#.NET常见问题(FAQ)-无法直接启动带有类库输出类型的项目怎么办
    C#.NET常见问题(FAQ)-VS如何整个项目中查找字符串
    C#.NET常见问题(FAQ)-如何在系统变量中加入新的环境变量
  • 原文地址:https://www.cnblogs.com/xuesongshu/p/2956914.html
Copyright © 2020-2023  润新知