C# [Win32] [API] Layered Windows

 

  1         static void* WndProc(void* hwnd, uint uMsg, void* wParam, void* lParam)
  2         {
  3             switch (uMsg)
  4             {
  5                 case WM_PAINT:
  6                 case WM_CTLCOLORMSGBOX:
  7                 case WM_CTLCOLOREDIT:
  8                 case WM_CTLCOLORLISTBOX:
  9                 case WM_CTLCOLORBTN:
 10                 case WM_CTLCOLORDLG:
 11                 case WM_CTLCOLORSCROLLBAR:
 12                 case WM_CTLCOLORSTATIC:
 13                 case WM_CAPTURECHANGED:
 14                     {
 15                         if (_pimg != null)
 16                         {
 17                             void* _hwnd = GetAncestor(hwnd, GA_ROOT);
 18 
 19                             uint uw, uh;
 20                             GdipGetImageWidth(_pimg, &uw); GdipGetImageHeight(_pimg, &uh);
 21 
 22                             RECT rcc, rcs;
 23                             GetClientRect(_hwnd, &rcc);
 24                             GetWindowRect(_hwnd, &rcs);
 25 
 26                             PAINTSTRUCT ps;
 27                             void* hdc = BeginPaint(_hwnd, &ps); //GetDC(hwnd);
 28                             void* hdcmem = CreateCompatibleDC(hdc);                            
 29 
 30 
 31                             BITMAPINFO bi;
 32                             bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
 33                             bi.bmiHeader.biWidth = (int)uw;
 34                             bi.bmiHeader.biHeight = (int)uh;
 35                             bi.bmiHeader.biPlanes = 1;
 36                             bi.bmiHeader.biBitCount = 32;
 37                             bi.bmiHeader.biCompression = BI_RGB;
 38                             bi.bmiHeader.biClrUsed = 0;
 39                             bi.bmiHeader.biSizeImage = 0;
 40 
 41                             void* pvbits;
 42                             void* hbmpmem = CreateDIBSection(hdc, &bi, DIB_RGB_COLORS, &pvbits, null, 0u);
 43 
 44                             if (hbmpmem != null)
 45                             {
 46                                 SelectObject(hdcmem, hbmpmem);
 47 
 48                                 GpGraphics* g;
 49                                 if (GdipCreateFromHDC(hdcmem, &g) == 0)
 50                                 {
 51                                     GdipDrawImageRectI(g, _pimg, 0, 0, (int)uw, (int)uh);
 52 
 53 #if true
 54                                     RECT rc;
 55                                     for (int i = 0; i < 3; i++)
 56                                     {
 57                                         void* h = GetDlgItem(_hwnd, i);
 58                                         if (IsWindowVisible(h) == 1)
 59                                         {
 60                                             GetWindowRect(h, &rc);
 61                                             MapWindowPoints(null, _hwnd, (POINT*)&rc, 2);
 62                                             GpBitmap* gpbmp;
 63                                             GdipCreateBitmapFromScan0(rc.right - rc.left, rc.bottom - rc.top, 0, PixelFormat32bppARGB, null, &gpbmp);
 64                                             GpGraphics* gpg;
 65                                             if (GdipGetImageGraphicsContext((GpImage*)gpbmp, &gpg) == 0)
 66                                             {
 67                                                 void* hdc2;
 68                                                 GdipGetDC(gpg, &hdc2);
 69                                                 SendMessageW(h, WM_PRINT, hdc2, (void*)(PRF_NONCLIENT | PRF_CLIENT | PRF_ERASEBKGND | PRF_CHILDREN));
 70                                                 GdipReleaseDC(gpg, hdc2);
 71                                                 GdipDeleteGraphics(gpg);
 72                                             }
 73                                             GdipDrawImageRectI(g, (GpImage*)gpbmp, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top);
 74                                             GdipDisposeImage((GpImage*)gpbmp);
 75                                         }
 76                                     }
 77 #endif
 78 
 79                                     POINT ptscr;
 80 
 81                                     POINT ptdst;
 82                                     ptdst.x = rcs.left;
 83                                     ptdst.y = rcs.top;
 84 
 85                                     SIZE szwnd;
 86                                     szwnd.cx = (int)uw;
 87                                     szwnd.cy = (int)uh;
 88 
 89                                     BLENDFUNCTION bf;
 90                                     bf.BlendOp = AC_SRC_OVER;
 91                                     bf.BlendFlags = 0x0;
 92                                     bf.SourceConstantAlpha = 0xff;
 93                                     bf.AlphaFormat = AC_SRC_ALPHA;
 94 
 95 
 96                                     UPDATELAYEREDWINDOWINFO ulwi;
 97                                     ulwi.cbSize = sizeof(UPDATELAYEREDWINDOWINFO);
 98                                     ulwi.hdcDst = hdc;
 99                                     ulwi.pptDst = &ptdst;
100                                     ulwi.psize = &szwnd;
101                                     ulwi.hdcSrc = hdcmem;
102                                     ulwi.pptSrc = &ptscr;
103                                     ulwi.crKey = (COLORREF)0u;
104                                     ulwi.pblend = &bf;
105                                     ulwi.dwFlags = ULW_ALPHA;
106                                     ulwi.prcDirty = null;
107 
108                                     //UpdateLayeredWindow(_hWnd, hdc, &ptdst, &szwnd, hdcmem, &ptscr, (COLORREF)0u, &bf, ULW_ALPHA);
109                                     UpdateLayeredWindowIndirect(_hwnd, &ulwi);
110 
111                                     GdipDeleteGraphics(g);
112                                 }
113                                 DeleteObject(hbmpmem);
114                             }
115 
116                             DeleteDC(hdcmem);
117                             //ReleaseDC(hwnd, hdc);
118                             EndPaint(_hwnd, &ps);
119                         }
120                     }
121                     break;
122             }
123             return DefWindowProcW(hwnd, uMsg, wParam, lParam);
124         }

 

 

 

 

转载于:https://www.cnblogs.com/shitekudasai/p/10660553.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LayeredForm : 支持窗体动画特效,透明,可以和LayeredControl实现任意透明效果等。。。包含LayeredWindowForm的功能 支持一部分带有Paint事件的普通控件,但是不能实现普通控件的背景透明效果! 控件类:Controls HotKey:支持全局热键绑定,事件驱动,可以开启和关闭 LayeredButton:按钮控件,支持按钮颜色设置,图片按钮,如果只设置一张正常状态下的按钮图片,则有鼠标移入加亮效果和鼠标按下变暗效果。边框设置,文字效果设置。 LayeredCheckButton:对LayeredButton的扩展,支持状态切换。 LayeredDragBar:支持对父容器的尺寸拖拽调整 LayeredFlashBox:支持透明Flash播放(当前版本不可用,请勿使用!) LayeredLabel:对文字的显示,文字效果设置 LayeredListBox:支自定义列表项目,支持横向和纵向滚动,支持平滑滚动。 LayeredPanel:在Layered模式下的容器控件 LayeredPictureBox:支持Gif 播放,支持多张图片合成动画播放。播放Gif时候不要频繁暂停和播放动画,容易导致线程阻塞。 LayeredTextBox:Layered模式下的文本编辑器。支持水印文字设置 LayeredTrackBar:进度条控件,支持图片进度条定义 动画类:Animations 通过设置LayeredForm的Animation.Effect属性来定义窗体动画特效。 包含了以下特效类:BlindWindowEffect、FadeinFadeoutEffect、GradualCurtainEffect、LevelScrollEffect、RandomCurtainEffect、RotateZoomEffect、ThreeDTurn、ZoomEffect 可以通过实现IEffects接口来实现自定义特效 DirectUI类:DirectUI 包含几个DirectUI控件。用于对以上控件的扩展和美化。部分LayeredControl包含DUIControl属性可以向其添加DirectUI控件。支持通过集合编辑器里面添加,只是不能在集合编辑器里面绑定事件,需要手动写代码绑定。通过集合编辑器添加的控件不一定能马上在设计器里看到效果,因为会有图像缓存,可能需要尝试调整控件大小等方式强制控件重绘,就可以看到效果了。 LayeredControl可以支持在普通窗体上使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值