MFC : 在主窗口不透明的情况下, 建立一个半透明的子窗体带透明的TreeCtrl
发布日期:2021-06-30 22:06:11 浏览次数:3 分类:技术文章

本文共 2907 字,大约阅读时间需要 9 分钟。

前段时间和别人讨论问题, 他说要在一个不透明的主窗体上, 建立一个透明的子窗体, 在该子窗体上再建立透明的TreeCtrl.

先是将透明的TreeCtrl实现了, 

在实现子窗口体透明时, 他说已经试验过设置窗体扩展风格 WS_EX_LAYERED的方法, 当主窗体不透明时, 子窗体无法实现透明.

 所以当时就按照"取主窗体背景贴到子窗体背景的方法来模拟子窗体透明"来实验.

最终发现不行, 原因 : 当子窗体在主窗体中移动时, 取主窗体的背景时, 背景上有子窗体的图像..., 这样搞, 取到的背景就不是纯的主窗体背景.

今天想起这事, 决定自己做个实验, 看看当主窗体不透明时, 建立一个透明的子窗体, 看行不行.

实验结果是 :  可以 :( ,  感到非常不爽.

我当时和别人讨论问题时听错了?

工程下载点: 

这个效果是可以接受的, 类似于CAD, 当主窗体(当然是不透明的)出来后, 拖动一个控件到布局窗口, 只要是半透明就可以接受了.

一般的CAD, 拖放控件时, 都不是透明的, 如果做到半透明, 其实也是可以的, 看领导怎么要求.

一般的CAD控件拖放后的效果如下图(不透明): 

实验过的效果图(主窗体不透明, 建立一个半透明的子窗体, 该子窗体中, 有一个透明的TreeCtrl)如下:

代码预览:

建立透明子窗体:

没特别的, 就是建立一个普通的MFC对话框

void CtestTreeCtrlDlg::OnBnClickedButtonCreateTransparentsubdlg(){    // TODO: Add your control notification handler code here    CTransparentSubDlg Dlg;    Dlg.DoModal();}
透明子窗体实现:

#pragma once#include "mytreectrl.h"// CTransparentSubDlg dialogclass CTransparentSubDlg : public CDialogEx{	DECLARE_DYNAMIC(CTransparentSubDlg)public:	CTransparentSubDlg(CWnd* pParent = NULL);   // standard constructor	virtual ~CTransparentSubDlg();// Dialog Data	enum { IDD = IDD_SUB_DIALOG };protected:	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support	DECLARE_MESSAGE_MAP()public:    virtual BOOL OnInitDialog();private:    void TreeInit();    void ToggleTransparency(HWND hWnd);private:    CMyTreeCtrl m_MyTreeCtrl;};
// TransparentSubDlg.cpp : implementation file//#include "stdafx.h"#include "testTreeCtrl.h"#include "TransparentSubDlg.h"#include "afxdialogex.h"// CTransparentSubDlg dialogIMPLEMENT_DYNAMIC(CTransparentSubDlg, CDialogEx)CTransparentSubDlg::CTransparentSubDlg(CWnd* pParent /*=NULL*/)	: CDialogEx(CTransparentSubDlg::IDD, pParent){}CTransparentSubDlg::~CTransparentSubDlg(){}void CTransparentSubDlg::DoDataExchange(CDataExchange* pDX){    CDialogEx::DoDataExchange(pDX);    DDX_Control(pDX, IDC_MY_TREE, m_MyTreeCtrl);}BEGIN_MESSAGE_MAP(CTransparentSubDlg, CDialogEx)END_MESSAGE_MAP()// CTransparentSubDlg message handlersBOOL CTransparentSubDlg::OnInitDialog(){    CDialogEx::OnInitDialog();    // TODO:  Add extra initialization here    ToggleTransparency(this->m_hWnd);    TreeInit();    return TRUE;  // return TRUE unless you set the focus to a control    // EXCEPTION: OCX Property Pages should return FALSE}void CTransparentSubDlg::TreeInit(){    HTREEITEM item = NULL;    HTREEITEM itemSub = NULL;    item = m_MyTreeCtrl.InsertItem(L"根节点[子对话框]", NULL);    if (NULL != item)    {        itemSub = m_MyTreeCtrl.InsertItem(L"子节点1", item);        itemSub = m_MyTreeCtrl.InsertItem(L"子节点2", item);        m_MyTreeCtrl.Expand(item, TVE_EXPAND);    }}void CTransparentSubDlg::ToggleTransparency(HWND hWnd){    ::SetWindowLong(        hWnd,        GWL_EXSTYLE,        GetWindowLong(hWnd,GWL_EXSTYLE)^WS_EX_LAYERED);    // When bAlpha is 0, the window is completely transparent.     // When bAlpha is 255, the window is opaque.    ::SetLayeredWindowAttributes(hWnd, RGB(0,0,0), 222, LWA_ALPHA);}

转载地址:https://lostspeed.blog.csdn.net/article/details/47001109 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:在服务中以当前用户身份启动一个程序
下一篇:DuiLib : 做一个没有任务栏图标的Dialog

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月27日 21时05分34秒