MFC : 在主窗口不透明的情况下, 建立一个半透明的子窗体带透明的TreeCtrl

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

先是将透明的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);
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值