MFC : 在主窗口不透明的情况下, 建立一个半透明的子窗体带透明的TreeCtrl
2015-07-22 12:10
549 查看
前段时间和别人讨论问题, 他说要在一个不透明的主窗体上, 建立一个透明的子窗体, 在该子窗体上再建立透明的TreeCtrl.
先是将透明的TreeCtrl实现了, MFC : Transparent TreeCtrl from CTreeCtrl
在实现子窗口体透明时, 他说已经试验过设置窗体扩展风格 WS_EX_LAYERED的方法, 当主窗体不透明时, 子窗体无法实现透明.
所以当时就按照"取主窗体背景贴到子窗体背景的方法来模拟子窗体透明"来实验.
最终发现不行, 原因 : 当子窗体在主窗体中移动时, 取主窗体的背景时, 背景上有子窗体的图像..., 这样搞, 取到的背景就不是纯的主窗体背景.
今天想起这事, 决定自己做个实验, 看看当主窗体不透明时, 建立一个透明的子窗体, 看行不行.
实验结果是 : 可以 :( , 感到非常不爽.
我当时和别人讨论问题时听错了?
工程下载点: src_testTransparentTreeCtrl_2015_0722_1138.rar
这个效果是可以接受的, 类似于CAD, 当主窗体(当然是不透明的)出来后, 拖动一个控件到布局窗口, 只要是半透明就可以接受了.
一般的CAD, 拖放控件时, 都不是透明的, 如果做到半透明, 其实也是可以的, 看领导怎么要求.
一般的CAD控件拖放后的效果如下图(不透明):
实验过的效果图(主窗体不透明, 建立一个半透明的子窗体, 该子窗体中, 有一个透明的TreeCtrl)如下:
代码预览:
建立透明子窗体:
没特别的, 就是建立一个普通的MFC对话框
先是将透明的TreeCtrl实现了, MFC : Transparent TreeCtrl from CTreeCtrl
在实现子窗口体透明时, 他说已经试验过设置窗体扩展风格 WS_EX_LAYERED的方法, 当主窗体不透明时, 子窗体无法实现透明.
所以当时就按照"取主窗体背景贴到子窗体背景的方法来模拟子窗体透明"来实验.
最终发现不行, 原因 : 当子窗体在主窗体中移动时, 取主窗体的背景时, 背景上有子窗体的图像..., 这样搞, 取到的背景就不是纯的主窗体背景.
今天想起这事, 决定自己做个实验, 看看当主窗体不透明时, 建立一个透明的子窗体, 看行不行.
实验结果是 : 可以 :( , 感到非常不爽.
我当时和别人讨论问题时听错了?
工程下载点: src_testTransparentTreeCtrl_2015_0722_1138.rar
这个效果是可以接受的, 类似于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 dialog class 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 dialog IMPLEMENT_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 handlers BOOL 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); }
相关文章推荐
- c/c++开源
- POJ 3250 Bad Hair Day(单调栈)
- 使用正则替换文本
- TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端
- CENTOS6.5 yum配置
- expect用法[自动连接远程机器脚本]
- apicloud
- 需要MARK一下,奇怪的ANDROID SDK自带的APK加密功能的问题
- CentoOS7配置samba服务
- Yii2-整合PayPal-PHP-SDK,实测
- 正则表达式学习笔记
- 根据日期 获取两个日期相差的天数
- GRE写作必备句型
- 在OC的h头文件声明使用C++ class,不引用C++的h文件
- Java switch中使用string作为分支条件
- 解题报告:最多有多少个点在一条直线上
- poj 3083 Children of the Candy Corn dfs+bfs
- C#获取关键字附近文字算法实例
- 关于Eclipse
- HDOJ 2036 改革春风吹满地(叉乘定理)