C# [Win32] [API] Layered Window
2021-06-09 11:03
标签:win stat nes ant psi cti blend size end C# [Win32] [API] Layered Window 标签:win stat nes ant psi cti blend size end 原文地址:https://www.cnblogs.com/shitekudasai/p/10660553.html 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 }
文章标题:C# [Win32] [API] Layered Window
文章链接:http://soscw.com/index.php/essay/92644.html