窗体透明、窗体上控件和DC绘图不透明

BOOL CDlgBmp::OnInitDialog() 
{
    CDlgBase::OnInitDialog();
    CClientDC dc(this);
    COLORREF maskColor = RGB(255,255,255);   //掩码颜色
    
    SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE, GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)| 0x80000);  //设定窗体使用扩展模式 
    /*HINSTANCE hInst = LoadLibrary("User32.DLL"); 
    if( hInst ) 
    { 
        typedef BOOL( WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD); 
        MYFUNC AlphaFunc = NULL; 
        AlphaFunc=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes"); 
        if(AlphaFunc)AlphaFunc(this->GetSafeHwnd(),maskColor,255,1);                   //将与掩码颜色相同的窗体部分置为透明
        FreeLibrary(hInst); 
    }*/
    ::SetLayeredWindowAttributes(this->GetSafeHwnd(),maskColor,255,1);
    SetDlgItemText( IDC_LEFTTOP,"左上");
    SetDlgItemText( IDC_LEFTBTM,"左下");
    SetDlgItemText( IDC_RIHTTOP,"右上");
    SetDlgItemText( IDC_RIHTBTM,"右下");
    return TRUE;
} 



BOOL CDlgBmp::OnEraseBkgnd(CDC* pDC)
{
	CPaintDC dc(this);
	CDC picDC; picDC.CreateCompatibleDC (&dc);          //创建兼容DC
	Graphics gra(dc.m_hDC);
	CRect rt;
	GetClientRect( &rt );
	RectF rtF;
	rtF.X = (REAL)rt.left;
	rtF.Y = (REAL)rt.top;
	rtF.Width = (REAL)(rt.right - rt.left); 
	rtF.Height =(REAL)( rt.bottom -  rt.top);
	Pen pn( Color( 128,  255, 0, 0 ), 2 );     //在Client区域边界绘制了一个不填充的矩形
	gra.DrawRectangle( &pn, rtF );
	SolidBrush br(Color( 255,255,0,0 ));       //在Client区域绘制了一个矩形填充区域
	gra.FillRectangle( &br, 100,75,200,150 );
	return TRUE;
}

特点:
    1.Dialog窗体完全透明。
    2.窗体上的控件不透明、DC绘制的图形不透明。
    3.拖动窗体上用DC绘制的图形可以移动窗体。
   缺点:
    1.窗体设置透明使用是掩码颜色,所以在窗体上用DC绘图的过程当中如果采用了和透明掩码颜色相同的颜色将不会显示出来。
    2.如果将Border属性设置成了NONE,那么想通过响应WM_NCHITEST消息来实现窗体拖动就无法完成了。只能通过在窗体中增加DC绘图的方式来完成。
    3.DC绘图时虽然支持半透明绘图,但是透明绘图区域不透明。

效果图如下:

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值