2 using System.Drawing;
\r
3 using System.Windows.Forms;
\r
5 using System.Runtime.InteropServices;
\r
7 namespace AppliStation.Util
\r
9 public class DisplayDeviceContext : IDeviceContext, IDisposable
\r
11 private HandleRef hWnd;
\r
13 private bool isGottenDc;
\r
18 /// <param name="hWnd">ウィンドウハンドル</param>
\r
19 public DisplayDeviceContext(IntPtr hWnd)
\r
20 : this(new HandleRef(null, hWnd))
\r
27 /// <param name="hWnd">ウィンドウハンドル</param>
\r
28 public DisplayDeviceContext(HandleRef hWnd)
\r
31 this.hDc = GetDC(hWnd);
\r
32 this.isGottenDc = true;
\r
35 protected DisplayDeviceContext(IntPtr hDc, bool isGottenDc)
\r
38 this.isGottenDc = isGottenDc;
\r
41 public static DisplayDeviceContext FromHdc(IntPtr hDc)
\r
43 return new DisplayDeviceContext(hDc, false);
\r
46 public DisplayDeviceContext CreateCompatibleDisplayDeviceContext()
\r
48 return FromHdc(CreateCompatibleDC(hDc));
\r
51 public IntPtr GetHdc()
\r
56 public void ReleaseHdc()
\r
58 if (this.isGottenDc) { // GetDC 関数を使って取得した場合
\r
59 int result = ReleaseDC(hWnd, hDc);
\r
61 throw new System.ComponentModel.Win32Exception();
\r
68 public void Dispose()
\r
71 GC.SuppressFinalize(this);
\r
75 /// 指定されたデバイスコンテキストのオブジェクトを選択
\r
78 /// context.SelectObject(bitmap.GetHbitmap(Color.FromArgb(0)));
\r
79 /// </code></example>
\r
80 /// <param name="hGdiObj">選択するオブジェクトのハンドル</param>
\r
81 /// <returns>置き換えが発生する前のオブジェクトのハンドル</returns>
\r
82 public IntPtr SelectObject(IntPtr hGdiObj)
\r
84 return SelectObject(hDc, hGdiObj);
\r
89 [DllImport("user32.dll")]
\r
90 private static extern IntPtr GetDC(HandleRef hWnd);
\r
92 [DllImport("user32.dll")]
\r
93 private static extern int ReleaseDC(HandleRef hWnd, IntPtr hDC);
\r
95 [DllImport("gdi32.dll", SetLastError=true)]
\r
96 private static extern IntPtr CreateCompatibleDC(IntPtr hdc);
\r
98 [DllImport("gdi32.dll", ExactSpelling=true, PreserveSig=true, SetLastError=true)]
\r
99 private static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
\r
101 [DllImport("gdi32.dll")]
\r
102 [return: MarshalAs(UnmanagedType.Bool)]
\r
103 private static extern bool DeleteObject(IntPtr hObject);
\r
108 public class SprashScreenLayered : Form
\r
110 public static Form CreateSprashScreenLayered(Image img, Color bgColor)
\r
113 SprashScreenLayered ss = null;
\r
115 if (OSFeature.Feature.IsPresent(OSFeature.LayeredWindows)) {
\r
116 form = ss = new SprashScreenLayered();
\r
117 form.BackgroundImage = img;
\r
120 form.BackgroundImage = img;
\r
121 form.BackColor = bgColor;
\r
123 //form.ShowInTaskbar = false;
\r
124 form.ControlBox = false;
\r
125 form.FormBorderStyle = FormBorderStyle.None;
\r
126 form.StartPosition = FormStartPosition.CenterScreen;
\r
127 form.Size = img.Size;
\r
130 ss.CenterToScreen2();
\r
136 public SprashScreenLayered()
\r
140 protected internal void CenterToScreen2()
\r
142 base.CenterToScreen();
\r
145 protected override CreateParams CreateParams {
\r
147 CreateParams param = base.CreateParams;
\r
148 // param.ExStyle |= WS_EX_LAYERED;
\r
149 param.ExStyle |= 0x00080000;
\r
154 public override Image BackgroundImage {
\r
156 base.BackgroundImage = value;
\r
157 updateLayeredWindow();
\r
161 #region UpdateLayeredWindow関連
\r
163 [DllImport("user32.dll", ExactSpelling=true, SetLastError=true)]
\r
164 [return: MarshalAs(UnmanagedType.Bool)]
\r
165 private static extern bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst,
\r
166 [In] ref Point pptDst, [In] ref Size psize,
\r
167 IntPtr hdcSrc, [In] ref Point pptSrc,
\r
169 [In] ref BLENDFUNCTION pblend,
\r
172 private static Bitmap convertBitmap(Image img)
\r
176 bitmap = img as Bitmap;
\r
177 if (bitmap == null) {
\r
178 bitmap = new Bitmap(img.Width, img.Height, img.PixelFormat);
\r
179 Graphics.FromImage(bitmap).DrawImage(img, 0, 0);
\r
184 protected void updateLayeredWindow()
\r
186 Point ptDest = this.Location;
\r
187 Point ptSrc = Point.Empty;
\r
188 Size size = BackgroundImage.Size;
\r
190 BLENDFUNCTION blend = new BLENDFUNCTION();
\r
191 blend.BlendOp = 0; // AC_SRC_OVER
\r
192 blend.BlendFlags = 0;
\r
193 blend.SourceConstantAlpha = 255;
\r
194 blend.AlphaFormat = 1; // AC_SRC_ALPHA
\r
196 using(DisplayDeviceContext screen = new DisplayDeviceContext(IntPtr.Zero))
\r
197 using(DisplayDeviceContext mem = screen.CreateCompatibleDisplayDeviceContext())
\r
198 using(DisplayDeviceContext hBitmap = DisplayDeviceContext.FromHdc(
\r
199 convertBitmap(BackgroundImage).GetHbitmap(Color.FromArgb(0))
\r
201 IntPtr hOldBitmap = IntPtr.Zero;
\r
204 hOldBitmap = mem.SelectObject(hBitmap.GetHdc());
\r
206 UpdateLayeredWindow(this.Handle, screen.GetHdc(),
\r
207 ref ptSrc, ref size,
\r
208 mem.GetHdc(), ref ptDest,
\r
211 2 /* ULW_ALPHA */);
\r
213 if (hBitmap.GetHdc() != IntPtr.Zero) {
\r
214 mem.SelectObject(hOldBitmap);
\r
220 [StructLayout(LayoutKind.Sequential, Pack=1)]
\r
221 protected internal struct BLENDFUNCTION
\r
223 public byte BlendOp;
\r
224 public byte BlendFlags;
\r
225 public byte SourceConstantAlpha;
\r
226 public byte AlphaFormat;
\r