特点:
1.Dialog窗体完全透明。
2.窗体上的控件不透明、DC绘制的图形不透明。
3.拖动窗体上用DC绘制的图形可以移动窗体。
缺点:
1.窗体设置透明使用是掩码颜色,所以在窗体上用DC绘图的过程当中如果采用了和透明掩码颜色相同的颜色将不会显示出来。
2.如果将Border属性设置成了NONE,那么想通过响应WM_NCHITEST消息来实现窗体拖动就无法完成了。只能通过在窗体中增加DC绘图的方式来完成。
3.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);
- }
- SetDlgItemText( IDC_LEFTTOP,"左上");
- SetDlgItemText( IDC_LEFTBTM,"左下");
- SetDlgItemText( IDC_RIHTTOP,"右上");
- SetDlgItemText( IDC_RIHTBTM,"右下");
- return TRUE;
- }
- void CDlgBmp::OnPaint()
- {
- CPaintDC dc(this);
- CDC picDC; picDC.CreateCompatibleDC (&dc); //创建兼容DC
- CBitmap * pOldBmp = picDC.SelectObject (&m_bmp); //将颜色为纯白色的图片选定为内存DC的绘图区域
- BITMAP bm; m_bmp.GetBitmap(&bm);
- dc.BitBlt (0,0,bm.bmWidth ,bm.bmHeight,&picDC,0,0,SRCCOPY); //将内存DC图贴回原DC
- dc.SelectObject(pOldBmp);
- Graphics gra(dc.m_hDC);
- CRect rt;
- GetClientRect( &rt );
- RectF rtF; rtF.X = rt.left; rtF.Y = rt.top; rtF.Width = rt.right - rt.left; rtF.Height = 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 );
- }