1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 // Copyright (c) 2004-2006 Novell, Inc.
23 // Peter Bartok pbartok@novell.com
31 using System
.Drawing
.Imaging
;
32 using System
.ComponentModel
;
33 using System
.Collections
;
34 using System
.Diagnostics
;
36 using System
.Runtime
.InteropServices
;
41 namespace System
.Windows
.Forms
{
42 internal class XplatUIWin32
: XplatUIDriver
{
43 #region Local Variables
44 private static XplatUIWin32 instance
;
45 private static int ref_count
;
46 private static IntPtr FosterParent
;
48 internal static MouseButtons mouse_state
;
49 internal static Point mouse_position
;
50 internal static bool grab_confined
;
51 internal static IntPtr grab_hwnd
;
52 internal static Rectangle grab_area
;
53 internal static WndProc wnd_proc
;
54 internal static IntPtr prev_mouse_hwnd
;
55 internal static IntPtr override_cursor
;
56 internal static bool caret_visible
;
58 internal static bool themes_enabled
;
59 private Hashtable timer_list
;
60 private static Queue message_queue
;
61 private static IntPtr clip_magic
= new IntPtr(27051977);
62 private static int scroll_width
;
63 private static int scroll_height
;
64 private static Hashtable wm_nc_registered
;
65 private static RECT clipped_cursor_rect
;
66 private Hashtable registered_classes
;
67 private Hwnd HwndCreating
; // the Hwnd we are currently creating (see CreateWindow)
69 #endregion // Local Variables
71 #region Private Structs
72 [StructLayout(LayoutKind
.Sequential
, CharSet
=CharSet
.Unicode
)]
73 private struct WNDCLASS
{
75 internal WndProc lpfnWndProc
;
76 internal int cbClsExtra
;
77 internal int cbWndExtra
;
78 internal IntPtr hInstance
;
79 internal IntPtr hIcon
;
80 internal IntPtr hCursor
;
81 internal IntPtr hbrBackground
;
82 [MarshalAs(UnmanagedType
.LPWStr
)]
83 internal string lpszMenuName
;
84 [MarshalAs(UnmanagedType
.LPWStr
)]
85 internal string lpszClassName
;
88 [StructLayout(LayoutKind
.Sequential
)]
89 internal struct RECT
{
95 public RECT (int left
, int top
, int right
, int bottom
)
100 this.bottom
= bottom
;
103 #region Instance Properties
104 public int Height { get { return bottom - top + 1; }
}
105 public int Width { get { return right - left + 1; }
}
106 public Size Size { get { return new Size (Width, Height); }
}
107 public Point Location { get { return new Point (left, top); }
}
110 #region Instance Methods
111 public Rectangle
ToRectangle ()
113 return Rectangle
.FromLTRB (left
, top
, right
, bottom
);
116 public static RECT
FromRectangle (Rectangle rectangle
)
118 return new RECT (rectangle
.Left
, rectangle
.Top
, rectangle
.Right
, rectangle
.Bottom
);
121 public override int GetHashCode ()
123 return left ^
((top
<< 13) | (top
>> 0x13))
124 ^
((Width
<< 0x1a) | (Width
>> 6))
125 ^
((Height
<< 7) | (Height
>> 0x19));
128 public override string ToString ()
130 return String
.Format("RECT left={0}, top={1}, right={2}, bottom={3}, width={4}, height={5}", left
, top
, right
, bottom
, right
-left
, bottom
-top
);
134 #region Operator overloads
135 public static implicit operator Rectangle (RECT rect
)
137 return Rectangle
.FromLTRB (rect
.left
, rect
.top
, rect
.right
, rect
.bottom
);
140 public static implicit operator RECT (Rectangle rect
)
142 return new RECT (rect
.Left
, rect
.Top
, rect
.Right
, rect
.Bottom
);
147 internal enum SPIAction
{
148 SPI_GETKEYBOARDSPEED
= 0x000A,
149 SPI_GETKEYBOARDDELAY
= 0x0016,
150 SPI_GETWORKAREA
= 0x0030,
151 SPI_GETMOUSEHOVERWIDTH
= 0x0062,
152 SPI_GETMOUSEHOVERHEIGHT
= 0x0064,
153 SPI_GETMOUSEHOVERTIME
= 0x0066,
156 internal enum WindowPlacementFlags
{
160 SW_SHOWMINIMIZED
= 2,
161 SW_SHOWMAXIMIZED
= 3,
163 SW_SHOWNOACTIVATE
= 4,
166 SW_SHOWMINNOACTIVE
= 7,
170 SW_FORCEMINIMIZE
= 11,
174 [StructLayout(LayoutKind
.Sequential
)]
175 private struct WINDOWPLACEMENT
{
176 internal uint length
;
178 internal WindowPlacementFlags showCmd
;
179 internal POINT ptMinPosition
;
180 internal POINT ptMaxPosition
;
181 internal RECT rcNormalPosition
;
184 [StructLayout(LayoutKind
.Sequential
)]
185 internal struct NCCALCSIZE_PARAMS
{
189 internal IntPtr lppos
;
193 private enum TMEFlags
{
194 TME_HOVER
= 0x00000001,
195 TME_LEAVE
= 0x00000002,
196 TME_NONCLIENT
= 0x00000010,
197 TME_QUERY
= unchecked((int)0x40000000),
198 TME_CANCEL
= unchecked((int)0x80000000)
201 [StructLayout(LayoutKind
.Sequential
)]
202 private struct TRACKMOUSEEVENT
{
204 internal TMEFlags dwFlags
;
205 internal IntPtr hWnd
;
206 internal int dwHoverTime
;
209 [StructLayout(LayoutKind
.Sequential
)]
210 private struct PAINTSTRUCT
{
213 internal RECT rcPaint
;
214 internal int fRestore
;
215 internal int fIncUpdate
;
216 internal int Reserved1
;
217 internal int Reserved2
;
218 internal int Reserved3
;
219 internal int Reserved4
;
220 internal int Reserved5
;
221 internal int Reserved6
;
222 internal int Reserved7
;
223 internal int Reserved8
;
226 [StructLayout(LayoutKind
.Sequential
)]
227 internal struct KEYBDINPUT
{
229 internal short wScan
;
230 internal Int32 dwFlags
;
232 internal UIntPtr dwExtraInfo
;
235 [StructLayout(LayoutKind
.Sequential
)]
236 internal struct MOUSEINPUT
{
239 internal Int32 mouseData
;
240 internal Int32 dwFlags
;
242 internal UIntPtr dwExtraInfo
;
245 [StructLayout(LayoutKind
.Sequential
)]
246 internal struct HARDWAREINPUT
{
248 internal short wParamL
;
249 internal short wParamH
;
252 [StructLayout(LayoutKind
.Explicit
)]
253 internal struct INPUT
{
258 internal MOUSEINPUT mi
;
261 internal KEYBDINPUT ki
;
264 internal HARDWAREINPUT hi
;
268 internal enum InputFlags
{
269 KEYEVENTF_EXTENDEDKEY
= 0x0001,
270 KEYEVENTF_KEYUP
= 0x0002,
271 KEYEVENTF_SCANCODE
= 0x0003,
272 KEYEVENTF_UNICODE
= 0x0004,
275 internal enum ClassStyle
{
276 CS_VREDRAW
= 0x00000001,
277 CS_HREDRAW
= 0x00000002,
278 CS_KEYCVTWINDOW
= 0x00000004,
279 CS_DBLCLKS
= 0x00000008,
280 CS_OWNDC
= 0x00000020,
281 CS_CLASSDC
= 0x00000040,
282 CS_PARENTDC
= 0x00000080,
283 CS_NOKEYCVT
= 0x00000100,
284 CS_NOCLOSE
= 0x00000200,
285 CS_SAVEBITS
= 0x00000800,
286 CS_BYTEALIGNCLIENT
= 0x00001000,
287 CS_BYTEALIGNWINDOW
= 0x00002000,
288 CS_GLOBALCLASS
= 0x00004000,
291 CS_DROPSHADOW
= 0x00020000
294 internal enum SetWindowPosZOrder
{
302 internal enum SetWindowPosFlags
{
303 SWP_ASYNCWINDOWPOS
= 0x4000,
304 SWP_DEFERERASE
= 0x2000,
305 SWP_DRAWFRAME
= 0x0020,
306 SWP_FRAMECHANGED
= 0x0020,
307 SWP_HIDEWINDOW
= 0x0080,
308 SWP_NOACTIVATE
= 0x0010,
309 SWP_NOCOPYBITS
= 0x0100,
311 SWP_NOOWNERZORDER
= 0x0200,
312 SWP_NOREDRAW
= 0x0008,
313 SWP_NOREPOSITION
= 0x0200,
314 SWP_NOENDSCHANGING
= 0x0400,
316 SWP_NOZORDER
= 0x0004,
317 SWP_SHOWWINDOW
= 0x0040
320 internal enum GetSysColorIndex
{
322 COLOR_BACKGROUND
= 1,
323 COLOR_ACTIVECAPTION
= 2,
324 COLOR_INACTIVECAPTION
= 3,
327 COLOR_WINDOWFRAME
= 6,
329 COLOR_WINDOWTEXT
= 8,
330 COLOR_CAPTIONTEXT
= 9,
331 COLOR_ACTIVEBORDER
= 10,
332 COLOR_INACTIVEBORDER
= 11,
333 COLOR_APPWORKSPACE
= 12,
334 COLOR_HIGHLIGHT
= 13,
335 COLOR_HIGHLIGHTTEXT
= 14,
337 COLOR_BTNSHADOW
= 16,
340 COLOR_INACTIVECAPTIONTEXT
= 19,
341 COLOR_BTNHIGHLIGHT
= 20,
342 COLOR_3DDKSHADOW
= 21,
348 COLOR_GRADIENTACTIVECAPTION
= 27,
349 COLOR_GRADIENTINACTIVECAPTION
= 28,
350 COLOR_MENUHIGHLIGHT
= 29,
356 COLOR_3DHIGHLIGHT
= 20,
357 COLOR_3DHILIGHT
= 20,
358 COLOR_BTNHILIGHT
= 20,
359 COLOR_MAXVALUE
= 24,/* Maximum value */
362 private enum LoadCursorType
{
371 IDC_SIZENWSE
= 32642,
372 IDC_SIZENESW
= 32643,
378 IDC_APPSTARTING
= 32650,
384 private enum WindowLong
{
395 private enum LogBrushStyle
{
404 BS_DIBPATTERN8X8
= 8,
409 private enum LogBrushHatch
{
410 HS_HORIZONTAL
= 0, /* ----- */
411 HS_VERTICAL
= 1, /* ||||| */
412 HS_FDIAGONAL
= 2, /* \\\\\ */
413 HS_BDIAGONAL
= 3, /* ///// */
414 HS_CROSS
= 4, /* +++++ */
415 HS_DIAGCROSS
= 5, /* xxxxx */
418 internal struct COLORREF
{
425 [StructLayout(LayoutKind
.Sequential
)]
426 private struct LOGBRUSH
{
427 internal LogBrushStyle lbStyle
;
428 internal COLORREF lbColor
;
429 internal LogBrushHatch lbHatch
;
432 [StructLayout(LayoutKind
.Sequential
)]
433 internal struct TEXTMETRIC
{
434 internal int tmHeight
;
435 internal int tmAscent
;
436 internal int tmDescent
;
437 internal int tmInternalLeading
;
438 internal int tmExternalLeading
;
439 internal int tmAveCharWidth
;
440 internal int tmMaxCharWidth
;
441 internal int tmWeight
;
442 internal int tmOverhang
;
443 internal int tmDigitizedAspectX
;
444 internal int tmDigitizedAspectY
;
445 internal short tmFirstChar
;
446 internal short tmLastChar
;
447 internal short tmDefaultChar
;
448 internal short tmBreakChar
;
449 internal byte tmItalic
;
450 internal byte tmUnderlined
;
451 internal byte tmStruckOut
;
452 internal byte tmPitchAndFamily
;
453 internal byte tmCharSet
;
456 public enum TernaryRasterOperations
: uint
458 SRCCOPY
= 0x00CC0020,
459 SRCPAINT
= 0x00EE0086,
461 SRCINVERT
= 0x00660046,
462 SRCERASE
= 0x00440328,
463 NOTSRCCOPY
= 0x00330008,
464 NOTSRCERASE
= 0x001100A6,
465 MERGECOPY
= 0x00C000CA,
466 MERGEPAINT
= 0x00BB0226,
467 PATCOPY
= 0x00F00021,
468 PATPAINT
= 0x00FB0A09,
469 PATINVERT
= 0x005A0049,
470 DSTINVERT
= 0x00550009,
471 BLACKNESS
= 0x00000042,
472 WHITENESS
= 0x00FF0062
476 private enum ScrollWindowExFlags
{
478 SW_SCROLLCHILDREN
= 0x0001,
479 SW_INVALIDATE
= 0x0002,
481 SW_SMOOTHSCROLL
= 0x0010
484 internal enum SystemMetrics
{
501 SM_CXFULLSCREEN
= 16,
502 SM_CYFULLSCREEN
= 17,
503 SM_CYKANJIWINDOW
= 18,
504 SM_MOUSEPRESENT
= 19,
523 SM_CXICONSPACING
= 38,
524 SM_CYICONSPACING
= 39,
525 SM_MENUDROPALIGNMENT
= 40,
528 SM_CMOUSEBUTTONS
= 43,
529 SM_CXFIXEDFRAME
= SM_CXDLGFRAME
,
530 SM_CYFIXEDFRAME
= SM_CYDLGFRAME
,
531 SM_CXSIZEFRAME
= SM_CXFRAME
,
532 SM_CYSIZEFRAME
= SM_CYFRAME
,
536 SM_CXMINSPACING
= 47,
537 SM_CYMINSPACING
= 48,
560 SM_MIDEASTENABLED
= 74,
561 SM_MOUSEWHEELPRESENT
= 75,
562 SM_XVIRTUALSCREEN
= 76,
563 SM_YVIRTUALSCREEN
= 77,
564 SM_CXVIRTUALSCREEN
= 78,
565 SM_CYVIRTUALSCREEN
= 79,
567 SM_SAMEDISPLAYFORMAT
= 81,
569 SM_CXFOCUSBORDER
= 83,
570 SM_CYFOCUSBORDER
= 84,
576 // We'll only support _WIN32_IE < 0x0500 for now
577 internal enum NotifyIconMessage
{
578 NIM_ADD
= 0x00000000,
579 NIM_MODIFY
= 0x00000001,
580 NIM_DELETE
= 0x00000002,
584 internal enum NotifyIconFlags
{
585 NIF_MESSAGE
= 0x00000001,
586 NIF_ICON
= 0x00000002,
587 NIF_TIP
= 0x00000004,
590 [StructLayout(LayoutKind
.Sequential
, CharSet
=CharSet
.Unicode
)]
591 internal struct NOTIFYICONDATA
{
592 internal uint cbSize
;
593 internal IntPtr hWnd
;
595 internal NotifyIconFlags uFlags
;
596 internal uint uCallbackMessage
;
597 internal IntPtr hIcon
;
598 [MarshalAs(UnmanagedType
.ByValTStr
, SizeConst
=64)]
599 internal string szTip
;
603 internal enum DCExFlags
{
604 DCX_WINDOW
= 0x00000001,
605 DCX_CACHE
= 0x00000002,
606 DCX_NORESETATTRS
= 0x00000004,
607 DCX_CLIPCHILDREN
= 0x00000008,
608 DCX_CLIPSIBLINGS
= 0x00000010,
609 DCX_PARENTCLIP
= 0x00000020,
610 DCX_EXCLUDERGN
= 0x00000040,
611 DCX_INTERSECTRGN
= 0x00000080,
612 DCX_EXCLUDEUPDATE
= 0x00000100,
613 DCX_INTERSECTUPDATE
= 0x00000200,
614 DCX_LOCKWINDOWUPDATE
= 0x00000400,
615 DCX_USESTYLE
= 0x00010000,
616 DCX_VALIDATE
= 0x00200000
619 [StructLayout(LayoutKind
.Sequential
, CharSet
=CharSet
.Unicode
)]
620 internal struct CLIENTCREATESTRUCT
{
621 internal IntPtr hWindowMenu
;
622 internal uint idFirstChild
;
625 private enum ClassLong
: int {
627 GCL_HBRBACKGROUND
= -10,
631 GCL_CBWNDEXTRA
= -18,
632 GCL_CBCLSEXTRA
= -20,
640 internal enum GAllocFlags
: uint {
642 GMEM_MOVEABLE
= 0x0002,
643 GMEM_NOCOMPACT
= 0x0010,
644 GMEM_NODISCARD
= 0x0020,
645 GMEM_ZEROINIT
= 0x0040,
646 GMEM_MODIFY
= 0x0080,
647 GMEM_DISCARDABLE
= 0x0100,
648 GMEM_NOT_BANKED
= 0x1000,
650 GMEM_DDESHARE
= 0x2000,
651 GMEM_NOTIFY
= 0x4000,
652 GMEM_LOWER
= GMEM_NOT_BANKED
,
653 GMEM_VALID_FLAGS
= 0x7F72,
654 GMEM_INVALID_HANDLE
= 0x8000,
655 GHND
= (GMEM_MOVEABLE
| GMEM_ZEROINIT
),
656 GPTR
= (GMEM_FIXED
| GMEM_ZEROINIT
)
659 internal enum ROP2DrawMode
: int {
679 internal enum PenStyle
: int {
691 internal enum PatBltRop
: int {
693 PATINVERT
= 0x5a0049,
694 DSTINVERT
= 0x550009,
695 BLACKNESS
= 0x000042,
696 WHITENESS
= 0xff0062,
699 internal enum StockObject
: int {
706 HOLLOW_BRUSH
= NULL_BRUSH
,
711 ANSI_FIXED_FONT
= 11,
714 DEVICE_DEFAULT_FONT
= 14,
715 DEFAULT_PALETTE
= 15,
716 SYSTEM_FIXED_FONT
= 16
719 internal enum HatchStyle
: int {
729 internal enum SndFlags
: int {
732 SND_NODEFAULT
= 0x0002,
736 SND_NOWAIT
= 0x00002000,
737 SND_ALIAS
= 0x00010000,
738 SND_ALIAS_ID
= 0x00110000,
739 SND_FILENAME
= 0x00020000,
740 SND_RESOURCE
= 0x00040004,
742 SND_APPLICATION
= 0x0080,
746 internal enum LayeredWindowAttributes
: int {
754 #region Constructor & Destructor
755 private XplatUIWin32() {
756 // Handle singleton stuff first
759 mouse_state
= MouseButtons
.None
;
760 mouse_position
= Point
.Empty
;
762 message_queue
= new Queue();
764 themes_enabled
= false;
766 wnd_proc
= new WndProc(InternalWndProc
);
768 FosterParent
=Win32CreateWindow((int)WindowExStyles
.WS_EX_TOOLWINDOW
, "static", "Foster Parent Window", (int)WindowStyles
.WS_OVERLAPPEDWINDOW
, 0, 0, 0, 0, IntPtr
.Zero
, IntPtr
.Zero
, IntPtr
.Zero
, IntPtr
.Zero
);
770 if (FosterParent
==IntPtr
.Zero
) {
771 Win32MessageBox(IntPtr
.Zero
, "Could not create foster window, win32 error " + Win32GetLastError().ToString(), "Oops", 0);
774 scroll_height
= Win32GetSystemMetrics(SystemMetrics
.SM_CYHSCROLL
);
775 scroll_width
= Win32GetSystemMetrics(SystemMetrics
.SM_CXVSCROLL
);
777 timer_list
= new Hashtable ();
778 registered_classes
= new Hashtable ();
780 #endregion // Constructor & Destructor
782 #region Private Support Methods
784 private string RegisterWindowClass (int classStyle
)
788 lock (registered_classes
) {
789 class_name
= (string)registered_classes
[classStyle
];
791 if (class_name
!= null)
794 class_name
= string.Format ("Mono.WinForms.{0}.{1}", System
.Threading
.Thread
.GetDomainID ().ToString (), classStyle
);
798 wndClass
.style
= classStyle
;
799 wndClass
.lpfnWndProc
= wnd_proc
;
800 wndClass
.cbClsExtra
= 0;
801 wndClass
.cbWndExtra
= 0;
802 wndClass
.hbrBackground
= (IntPtr
)(GetSysColorIndex
.COLOR_WINDOW
+ 1);
803 wndClass
.hCursor
= Win32LoadCursor (IntPtr
.Zero
, LoadCursorType
.IDC_ARROW
);
804 wndClass
.hIcon
= IntPtr
.Zero
;
805 wndClass
.hInstance
= IntPtr
.Zero
;
806 wndClass
.lpszClassName
= class_name
;
807 wndClass
.lpszMenuName
= "";
809 bool result
= Win32RegisterClass (ref wndClass
);
812 Win32MessageBox (IntPtr
.Zero
, "Could not register the window class, win32 error " + Win32GetLastError ().ToString (), "Oops", 0);
814 registered_classes
[classStyle
] = class_name
;
820 private static bool RetrieveMessage(ref MSG msg
) {
823 if (message_queue
.Count
== 0) {
827 message
= (MSG
)message_queue
.Dequeue();
833 private static bool StoreMessage(ref MSG msg
) {
834 MSG message
= new MSG();
837 message_queue
.Enqueue(message
);
842 internal static String
AnsiToString(IntPtr ansi_data
) {
843 return (string)Marshal
.PtrToStringAnsi(ansi_data
);
846 internal static String
UnicodeToString(IntPtr unicode_data
) {
847 return (string)Marshal
.PtrToStringUni(unicode_data
);
850 internal static Image
DIBtoImage(IntPtr dib_data
) {
851 BITMAPINFOHEADER bmi
;
862 bmi
= (BITMAPINFOHEADER
)Marshal
.PtrToStructure(dib_data
, typeof(BITMAPINFOHEADER
));
864 ncolors
= (int)bmi
.biClrUsed
;
866 if (bmi
.biBitCount
< 24) {
867 ncolors
= (int)(1 << bmi
.biBitCount
);
870 //palettesize = ncolors * 4;
872 imagesize
= (int)bmi
.biSizeImage
;
873 if (imagesize
== 0) {
874 imagesize
= (int)(((((bmi
.biWidth
* bmi
.biBitCount
) + 31) & ~
31) >> 3) * bmi
.biHeight
);
877 switch(bmi
.biBitCount
) {
878 case 1: { // Monochrome
879 bmp
= new Bitmap(bmi
.biWidth
, bmi
.biHeight
, PixelFormat
.Format1bppIndexed
);
880 palette
= new int[2];
885 bmp
= new Bitmap(bmi
.biWidth
, bmi
.biHeight
, PixelFormat
.Format4bppIndexed
);
886 palette
= new int[16];
891 bmp
= new Bitmap(bmi
.biWidth
, bmi
.biHeight
, PixelFormat
.Format8bppIndexed
);
892 palette
= new int[256];
898 bmp
= new Bitmap(bmi
.biWidth
, bmi
.biHeight
, PixelFormat
.Format32bppArgb
);
899 palette
= new int[0];
904 throw new Exception("Unexpected number of bits:" + bmi
.biBitCount
.ToString());
908 if (bmi
.biBitCount
< 24) {
909 pal
= bmp
.Palette
; // Managed palette
910 Marshal
.Copy((IntPtr
)((int)dib_data
+ Marshal
.SizeOf(typeof(BITMAPINFOHEADER
))), palette
, 0, palette
.Length
);
912 for (int i
= 0; i
< ncolors
; i
++) {
913 pal
.Entries
[i
] = Color
.FromArgb(palette
[i
] | unchecked((int)0xff000000));
918 bytesPerLine
= (int)((((bmi
.biWidth
* bmi
.biBitCount
) + 31) & ~
31) >> 3);
919 bits
= bmp
.LockBits(new Rectangle(0, 0, bmp
.Width
, bmp
.Height
), ImageLockMode
.WriteOnly
, bmp
.PixelFormat
);
921 imagebits
= new byte[bytesPerLine
];
923 for (int y
= 0; y
< bmi
.biHeight
; y
++) {
924 // Copy from source to managed
925 Marshal
.Copy((IntPtr
)((int)dib_data
+ Marshal
.SizeOf(typeof(BITMAPINFOHEADER
)) + palette
.Length
* 4 + bytesPerLine
* y
), imagebits
, 0, bytesPerLine
);
927 // Copy from managed to dest
928 Marshal
.Copy(imagebits
, 0, (IntPtr
)((int)bits
.Scan0
+ bits
.Stride
* (bmi
.biHeight
- 1 - y
)), imagebits
.Length
);
931 bmp
.UnlockBits(bits
);
936 internal static byte[] ImageToDIB(Image image
) {
941 ms
= new MemoryStream();
942 image
.Save(ms
, ImageFormat
.Bmp
);
943 buffer
= ms
.GetBuffer();
945 // Filter out the file header
946 retbuf
= new byte[buffer
.Length
];
947 Array
.Copy(buffer
, 14, retbuf
, 0, buffer
.Length
- 14);
951 internal static IntPtr
DupGlobalMem(IntPtr mem
) {
957 len
= Win32GlobalSize(mem
);
958 mem_ptr
= Win32GlobalLock(mem
);
960 dup
= Win32GlobalAlloc(GAllocFlags
.GMEM_MOVEABLE
, (int)len
);
961 dup_ptr
= Win32GlobalLock(dup
);
963 Win32CopyMemory(dup_ptr
, mem_ptr
, (int)len
);
965 Win32GlobalUnlock(mem
);
966 Win32GlobalUnlock(dup
);
970 #endregion // Private Support Methods
972 #region Static Properties
973 internal override Keys ModifierKeys
{
978 key_state
= Keys
.None
;
980 state
= Win32GetKeyState(VirtualKeys
.VK_SHIFT
);
981 if ((state
& 0x8000) != 0) {
982 key_state
|= Keys
.Shift
;
984 state
= Win32GetKeyState(VirtualKeys
.VK_CONTROL
);
985 if ((state
& 0x8000) != 0) {
986 key_state
|= Keys
.Control
;
989 state
= Win32GetKeyState(VirtualKeys
.VK_MENU
);
990 if ((state
& 0x8000) != 0) {
991 key_state
|= Keys
.Alt
;
998 internal override MouseButtons MouseButtons
{
1004 internal override Point MousePosition
{
1006 return mouse_position
;
1010 internal override Size MouseHoverSize
{
1015 Win32SystemParametersInfo(SPIAction
.SPI_GETMOUSEHOVERWIDTH
, 0, ref width
, 0);
1016 Win32SystemParametersInfo(SPIAction
.SPI_GETMOUSEHOVERWIDTH
, 0, ref height
, 0);
1017 return new Size(width
, height
);
1021 internal override int MouseHoverTime
{
1025 Win32SystemParametersInfo(SPIAction
.SPI_GETMOUSEHOVERTIME
, 0, ref time
, 0);
1030 internal override int HorizontalScrollBarHeight
{
1032 return scroll_height
;
1036 internal override bool UserClipWontExposeParent
{
1043 internal override int VerticalScrollBarWidth
{
1045 return scroll_width
;
1049 internal override int MenuHeight
{
1051 return Win32GetSystemMetrics(SystemMetrics
.SM_CYMENU
);
1055 internal override bool DropTarget
{
1062 //throw new NotImplementedException("Need to figure out D'n'D for Win32");
1067 internal override int Caption
{
1069 return Win32GetSystemMetrics(SystemMetrics
.SM_CYCAPTION
);
1073 internal override Size CursorSize
{
1075 return new Size(Win32GetSystemMetrics(SystemMetrics
.SM_CXCURSOR
), Win32GetSystemMetrics(SystemMetrics
.SM_CYCURSOR
));
1079 internal override bool DragFullWindows
{
1085 internal override Size DragSize
{
1087 return new Size(Win32GetSystemMetrics(SystemMetrics
.SM_CXDRAG
), Win32GetSystemMetrics(SystemMetrics
.SM_CYDRAG
));
1091 internal override Size FrameBorderSize
{
1093 return new Size(Win32GetSystemMetrics(SystemMetrics
.SM_CXFRAME
), Win32GetSystemMetrics(SystemMetrics
.SM_CYFRAME
));
1097 internal override Size IconSize
{
1099 return new Size(Win32GetSystemMetrics(SystemMetrics
.SM_CXICON
), Win32GetSystemMetrics(SystemMetrics
.SM_CYICON
));
1103 internal override Size MaxWindowTrackSize
{
1105 return new Size(Win32GetSystemMetrics(SystemMetrics
.SM_CXMAXTRACK
), Win32GetSystemMetrics(SystemMetrics
.SM_CYMAXTRACK
));
1109 internal override Size MinimizedWindowSize
{
1111 return new Size(Win32GetSystemMetrics(SystemMetrics
.SM_CXMINIMIZED
), Win32GetSystemMetrics(SystemMetrics
.SM_CYMINIMIZED
));
1115 internal override Size MinimizedWindowSpacingSize
{
1117 return new Size(Win32GetSystemMetrics(SystemMetrics
.SM_CXMINSPACING
), Win32GetSystemMetrics(SystemMetrics
.SM_CYMINSPACING
));
1121 internal override Size MinimumWindowSize
{
1123 return new Size(Win32GetSystemMetrics(SystemMetrics
.SM_CXMIN
), Win32GetSystemMetrics(SystemMetrics
.SM_CYMIN
));
1127 internal override Size MinWindowTrackSize
{
1129 return new Size(Win32GetSystemMetrics(SystemMetrics
.SM_CXMINTRACK
), Win32GetSystemMetrics(SystemMetrics
.SM_CYMINTRACK
));
1133 internal override Size SmallIconSize
{
1135 return new Size(Win32GetSystemMetrics(SystemMetrics
.SM_CXSMICON
), Win32GetSystemMetrics(SystemMetrics
.SM_CYSMICON
));
1139 internal override int MouseButtonCount
{
1141 return Win32GetSystemMetrics(SystemMetrics
.SM_CMOUSEBUTTONS
);
1145 internal override bool MouseButtonsSwapped
{
1147 return Win32GetSystemMetrics(SystemMetrics
.SM_SWAPBUTTON
) != 0;
1151 internal override bool MouseWheelPresent
{
1153 return Win32GetSystemMetrics(SystemMetrics
.SM_MOUSEWHEELPRESENT
) != 0;
1157 internal override Rectangle VirtualScreen
{
1159 return new Rectangle( Win32GetSystemMetrics(SystemMetrics
.SM_XVIRTUALSCREEN
), Win32GetSystemMetrics(SystemMetrics
.SM_YVIRTUALSCREEN
),
1160 Win32GetSystemMetrics(SystemMetrics
.SM_CXVIRTUALSCREEN
), Win32GetSystemMetrics(SystemMetrics
.SM_CYVIRTUALSCREEN
));
1164 internal override Rectangle WorkingArea
{
1169 Win32SystemParametersInfo(SPIAction
.SPI_GETWORKAREA
, 0, ref rect
, 0);
1170 return new Rectangle(rect
.left
, rect
.top
, rect
.right
- rect
.left
, rect
.bottom
- rect
.top
);
1171 //return new Rectangle(0, 0, Win32GetSystemMetrics(SystemMetrics.SM.SM_CXSCREEN), Win32GetSystemMetrics(SystemMetrics.SM_CYSCREEN));
1175 internal override bool ThemesEnabled
{
1177 return XplatUIWin32
.themes_enabled
;
1182 #endregion // Static Properties
1184 #region Singleton Specific Code
1185 public static XplatUIWin32
GetInstance() {
1186 if (instance
==null) {
1187 instance
=new XplatUIWin32();
1193 public int Reference
{
1200 #region Public Static Methods
1201 internal override IntPtr
InitializeDriver() {
1205 internal override void ShutdownDriver(IntPtr token
) {
1206 Console
.WriteLine("XplatUIWin32 ShutdownDriver called");
1210 internal void Version() {
1211 Console
.WriteLine("Xplat version $revision: $");
1214 internal override void AudibleAlert() {
1215 Win32PlaySound("Default", IntPtr
.Zero
, SndFlags
.SND_ALIAS
| SndFlags
.SND_ASYNC
| SndFlags
.SND_NOSTOP
| SndFlags
.SND_NOWAIT
);
1218 internal override void GetDisplaySize(out Size size
) {
1221 Win32GetWindowRect(Win32GetDesktopWindow(), out rect
);
1223 size
= new Size(rect
.right
- rect
.left
, rect
.bottom
- rect
.top
);
1226 internal override void EnableThemes() {
1227 themes_enabled
=true;
1230 internal override IntPtr
CreateWindow(CreateParams cp
) {
1231 IntPtr WindowHandle
;
1232 IntPtr ParentHandle
;
1237 ParentHandle
=cp
.Parent
;
1239 if ((ParentHandle
==IntPtr
.Zero
) && (cp
.Style
& (int)(WindowStyles
.WS_CHILD
))!=0) {
1240 // We need to use our foster parent window until this poor child gets it's parent assigned
1241 ParentHandle
= FosterParent
;
1244 if ( ((cp
.Style
& (int)(WindowStyles
.WS_CHILD
| WindowStyles
.WS_POPUP
))==0) && ((cp
.ExStyle
& (int)WindowExStyles
.WS_EX_APPWINDOW
) == 0)) {
1245 // If we want to be hidden from the taskbar we need to be 'owned' by
1246 // something not on the taskbar. FosterParent is just that
1247 ParentHandle
= FosterParent
;
1252 string class_name
= RegisterWindowClass (cp
.ClassStyle
);
1253 HwndCreating
= hwnd
;
1255 WindowHandle
= Win32CreateWindow ((uint)cp
.ExStyle
, class_name
, cp
.Caption
, (uint)cp
.Style
, cp
.X
, cp
.Y
, cp
.Width
, cp
.Height
, ParentHandle
, IntPtr
.Zero
, IntPtr
.Zero
, IntPtr
.Zero
);
1257 HwndCreating
= null;
1259 if (WindowHandle
==IntPtr
.Zero
) {
1260 uint error
= Win32GetLastError();
1262 Win32MessageBox(IntPtr
.Zero
, "Error : " + error
.ToString(), "Failed to create window, class '"+cp
.ClassName
+"'", 0);
1265 hwnd
.ClientWindow
= WindowHandle
;
1267 Win32SetWindowLong(WindowHandle
, WindowLong
.GWL_USERDATA
, (uint)ThemeEngine
.Current
.DefaultControlBackColor
.ToArgb());
1269 return WindowHandle
;
1272 internal override IntPtr
CreateWindow(IntPtr Parent
, int X
, int Y
, int Width
, int Height
) {
1273 CreateParams create_params
= new CreateParams();
1275 create_params
.Caption
= "";
1276 create_params
.X
= X
;
1277 create_params
.Y
= Y
;
1278 create_params
.Width
= Width
;
1279 create_params
.Height
= Height
;
1281 create_params
.ClassName
=XplatUI
.DefaultClassName
;
1282 create_params
.ClassStyle
= 0;
1283 create_params
.ExStyle
=0;
1284 create_params
.Parent
=IntPtr
.Zero
;
1285 create_params
.Param
=0;
1287 return CreateWindow(create_params
);
1290 internal override void DestroyWindow(IntPtr handle
) {
1293 hwnd
= Hwnd
.ObjectFromHandle(handle
);
1294 Win32DestroyWindow(handle
);
1299 internal override void SetWindowMinMax(IntPtr handle
, Rectangle maximized
, Size min
, Size max
) {
1300 // We do nothing, Form has to handle WM_GETMINMAXINFO
1304 internal override FormWindowState
GetWindowState(IntPtr handle
) {
1307 style
= Win32GetWindowLong(handle
, WindowLong
.GWL_STYLE
);
1308 if ((style
& (uint)WindowStyles
.WS_MAXIMIZE
) != 0) {
1309 return FormWindowState
.Maximized
;
1310 } else if ((style
& (uint)WindowStyles
.WS_MINIMIZE
) != 0) {
1311 return FormWindowState
.Minimized
;
1313 return FormWindowState
.Normal
;
1316 internal override void SetWindowState(IntPtr hwnd
, FormWindowState state
) {
1318 case FormWindowState
.Normal
: {
1319 Win32ShowWindow(hwnd
, WindowPlacementFlags
.SW_RESTORE
);
1323 case FormWindowState
.Minimized
: {
1324 Win32ShowWindow(hwnd
, WindowPlacementFlags
.SW_MINIMIZE
);
1328 case FormWindowState
.Maximized
: {
1329 Win32ShowWindow(hwnd
, WindowPlacementFlags
.SW_MAXIMIZE
);
1335 internal override void SetWindowStyle(IntPtr handle
, CreateParams cp
) {
1339 Win32SetWindowLong(handle
, WindowLong
.GWL_STYLE
, (uint)cp
.Style
);
1340 Win32SetWindowLong(handle
, WindowLong
.GWL_EXSTYLE
, (uint)cp
.ExStyle
);
1342 if ((cp
.ExStyle
& (int) WindowExStyles
.WS_EX_TOOLWINDOW
) > 0)
1343 XplatUI
.RequestNCRecalc (handle
);
1346 internal override double GetWindowTransparency(IntPtr handle
)
1348 LayeredWindowAttributes lwa
;
1352 if (0 == Win32GetLayeredWindowAttributes (handle
, out clrRef
, out alpha
, out lwa
))
1355 return ((double)alpha
) / 255.0;
1358 internal override void SetWindowTransparency(IntPtr handle
, double transparency
, Color key
) {
1359 LayeredWindowAttributes lwa
= LayeredWindowAttributes
.LWA_ALPHA
;
1360 byte opacity
= (byte)(transparency
*255);
1361 COLORREF clrRef
= new COLORREF();
1362 if (key
!= Color
.Empty
) {
1366 lwa
= (LayeredWindowAttributes
)( (int)lwa
| (int)LayeredWindowAttributes
.LWA_COLORKEY
);
1371 Win32SetLayeredWindowAttributes(handle
, clrRef
, opacity
, lwa
);
1374 TransparencySupport support
;
1375 bool queried_transparency_support
;
1376 internal override TransparencySupport
SupportsTransparency() {
1377 if (queried_transparency_support
)
1381 support
= TransparencySupport
.None
;
1385 Win32SetLayeredWindowAttributes (IntPtr
.Zero
, new COLORREF (), 255, LayeredWindowAttributes
.LWA_ALPHA
);
1387 catch (EntryPointNotFoundException
) { flag = false; }
1388 catch { /* swallow everything else */ }
1390 if (flag
) support
|= TransparencySupport
.Set
;
1394 LayeredWindowAttributes lwa
;
1398 Win32GetLayeredWindowAttributes (IntPtr
.Zero
, out clrRef
, out alpha
, out lwa
);
1400 catch (EntryPointNotFoundException
) { flag = false; }
1401 catch { /* swallow everything else */ }
1403 if (flag
) support
|= TransparencySupport
.Get
;
1405 queried_transparency_support
= true;
1409 internal override void UpdateWindow(IntPtr handle
) {
1410 Win32UpdateWindow(handle
);
1413 internal override PaintEventArgs
PaintEventStart(IntPtr handle
, bool client
) {
1416 PaintEventArgs paint_event
;
1418 Rectangle clip_rect
;
1421 clip_rect
= new Rectangle();
1423 ps
= new PAINTSTRUCT();
1425 hwnd
= Hwnd
.ObjectFromHandle(handle
);
1428 if (Win32GetUpdateRect(handle
, ref rect
, false)) {
1429 hdc
= Win32BeginPaint(handle
, ref ps
);
1431 hwnd
.drawing_stack
.Push (ps
);
1433 clip_rect
= new Rectangle(ps
.rcPaint
.left
, ps
.rcPaint
.top
, ps
.rcPaint
.right
-ps
.rcPaint
.left
, ps
.rcPaint
.bottom
-ps
.rcPaint
.top
);
1435 hdc
= Win32GetDC(handle
);
1436 // FIXME: Add the DC to internal list
1438 hwnd
.drawing_stack
.Push (null);
1440 clip_rect
= new Rectangle(rect
.top
, rect
.left
, rect
.right
-rect
.left
, rect
.bottom
-rect
.top
);
1443 hdc
= Win32GetWindowDC (handle
);
1445 hwnd
.drawing_stack
.Push (hdc
);
1447 // HACK this in for now
1448 Win32GetWindowRect (handle
, out rect
);
1449 clip_rect
= new Rectangle(0, 0, rect
.right
-rect
.left
, rect
.bottom
-rect
.top
);
1452 Graphics dc
= Graphics
.FromHdc(hdc
);
1453 hwnd
.drawing_stack
.Push (dc
);
1455 paint_event
= new PaintEventArgs(dc
, clip_rect
);
1460 internal override void PaintEventEnd(IntPtr handle
, bool client
) {
1463 hwnd
= Hwnd
.ObjectFromHandle(handle
);
1465 Graphics dc
= (Graphics
)hwnd
.drawing_stack
.Pop();
1469 object o
= hwnd
.drawing_stack
.Pop();
1471 PAINTSTRUCT ps
= (PAINTSTRUCT
)o
;
1472 Win32EndPaint(handle
, ref ps
);
1475 IntPtr hdc
= (IntPtr
)hwnd
.drawing_stack
.Pop();
1476 Win32ReleaseDC(handle
, hdc
);
1481 internal override void SetWindowPos(IntPtr handle
, int x
, int y
, int width
, int height
) {
1482 Win32MoveWindow(handle
, x
, y
, width
, height
, true);
1486 internal override void GetWindowPos(IntPtr handle
, bool is_toplevel
, out int x
, out int y
, out int width
, out int height
, out int client_width
, out int client_height
) {
1491 Win32GetWindowRect(handle
, out rect
);
1492 width
= rect
.right
- rect
.left
;
1493 height
= rect
.bottom
- rect
.top
;
1498 parent
= Win32GetParent(handle
);
1499 Win32ScreenToClient(parent
, ref pt
);
1504 Win32GetClientRect(handle
, out rect
);
1505 client_width
= rect
.right
- rect
.left
;
1506 client_height
= rect
.bottom
- rect
.top
;
1510 internal override void Activate(IntPtr handle
) {
1511 Win32SetActiveWindow(handle
);
1514 internal override void Invalidate(IntPtr handle
, Rectangle rc
, bool clear
) {
1519 rect
.right
=rc
.Right
;
1520 rect
.bottom
=rc
.Bottom
;
1521 Win32InvalidateRect(handle
, ref rect
, clear
);
1525 internal override void InvalidateNC (IntPtr handle
)
1527 // found this gem at
1528 // http://www.dotnet247.com/247reference/msgs/58/292037.aspx
1529 Win32SetWindowPos(handle
, IntPtr
.Zero
,
1531 SetWindowPosFlags
.SWP_NOMOVE
|
1532 SetWindowPosFlags
.SWP_NOSIZE
|
1533 SetWindowPosFlags
.SWP_NOZORDER
|
1534 SetWindowPosFlags
.SWP_NOACTIVATE
|
1535 SetWindowPosFlags
.SWP_DRAWFRAME
);
1538 private IntPtr
InternalWndProc (IntPtr hWnd
, Msg msg
, IntPtr wParam
, IntPtr lParam
)
1540 if (HwndCreating
!= null && HwndCreating
.ClientWindow
== IntPtr
.Zero
)
1541 HwndCreating
.ClientWindow
= hWnd
;
1542 return NativeWindow
.WndProc (hWnd
, msg
, wParam
, lParam
);
1545 internal override IntPtr
DefWndProc(ref Message msg
) {
1546 msg
.Result
=Win32DefWindowProc(msg
.HWnd
, (Msg
)msg
.Msg
, msg
.WParam
, msg
.LParam
);
1550 internal override void HandleException(Exception e
) {
1551 StackTrace st
= new StackTrace(e
);
1552 Win32MessageBox(IntPtr
.Zero
, e
.Message
+st
.ToString(), "Exception", 0);
1553 Console
.WriteLine("{0}{1}", e
.Message
, st
.ToString());
1556 internal override void DoEvents() {
1557 MSG msg
= new MSG();
1559 if (override_cursor
!= IntPtr
.Zero
) {
1560 Cursor
.Current
= null;
1563 while (GetMessage(ref msg
, IntPtr
.Zero
, 0, 0, false)) {
1564 XplatUI
.TranslateMessage(ref msg
);
1565 XplatUI
.DispatchMessage(ref msg
);
1569 internal override bool PeekMessage(Object queue_id
, ref MSG msg
, IntPtr hWnd
, int wFilterMin
, int wFilterMax
, uint flags
) {
1570 return Win32PeekMessage(ref msg
, hWnd
, wFilterMin
, wFilterMax
, flags
);
1573 internal override void PostQuitMessage(int exitCode
) {
1574 Win32PostQuitMessage(exitCode
);
1577 internal override void RequestAdditionalWM_NCMessages(IntPtr hwnd
, bool hover
, bool leave
)
1579 if (wm_nc_registered
== null)
1580 wm_nc_registered
= new Hashtable ();
1582 TMEFlags flags
= TMEFlags
.TME_NONCLIENT
;
1584 flags
|= TMEFlags
.TME_HOVER
;
1586 flags
|= TMEFlags
.TME_LEAVE
;
1588 if (flags
== TMEFlags
.TME_NONCLIENT
) {
1589 if (wm_nc_registered
.Contains (hwnd
)) {
1590 wm_nc_registered
.Remove (hwnd
);
1593 if (!wm_nc_registered
.Contains (hwnd
)) {
1594 wm_nc_registered
.Add (hwnd
, flags
);
1596 wm_nc_registered
[hwnd
] = flags
;
1601 internal override void RequestNCRecalc(IntPtr handle
) {
1602 Win32SetWindowPos(handle
, IntPtr
.Zero
, 0, 0, 0, 0, SetWindowPosFlags
.SWP_FRAMECHANGED
| SetWindowPosFlags
.SWP_NOOWNERZORDER
| SetWindowPosFlags
.SWP_NOSIZE
| SetWindowPosFlags
.SWP_NOMOVE
| SetWindowPosFlags
.SWP_NOZORDER
| SetWindowPosFlags
.SWP_NOACTIVATE
);
1605 internal override void ResetMouseHover(IntPtr handle
) {
1606 TRACKMOUSEEVENT tme
;
1608 tme
= new TRACKMOUSEEVENT();
1609 tme
.size
= Marshal
.SizeOf(tme
);
1611 tme
.dwFlags
= TMEFlags
.TME_LEAVE
| TMEFlags
.TME_HOVER
;
1612 Win32TrackMouseEvent(ref tme
);
1616 internal override bool GetMessage(Object queue_id
, ref MSG msg
, IntPtr hWnd
, int wFilterMin
, int wFilterMax
) {
1617 return GetMessage(ref msg
, hWnd
, wFilterMin
, wFilterMax
, true);
1620 private bool GetMessage(ref MSG msg
, IntPtr hWnd
, int wFilterMin
, int wFilterMax
, bool blocking
) {
1624 if (RetrieveMessage(ref msg
)) {
1629 result
= Win32GetMessage(ref msg
, hWnd
, wFilterMin
, wFilterMax
);
1631 result
= Win32PeekMessage(ref msg
, hWnd
, wFilterMin
, wFilterMax
, (uint)PeekMessageFlags
.PM_REMOVE
);
1637 // We need to fake WM_MOUSE_ENTER
1638 switch (msg
.message
) {
1639 case Msg
.WM_LBUTTONDOWN
: {
1640 mouse_state
|= MouseButtons
.Left
;
1644 case Msg
.WM_MBUTTONDOWN
: {
1645 mouse_state
|= MouseButtons
.Middle
;
1649 case Msg
.WM_RBUTTONDOWN
: {
1650 mouse_state
|= MouseButtons
.Right
;
1654 case Msg
.WM_LBUTTONUP
: {
1655 mouse_state
&= ~MouseButtons
.Left
;
1659 case Msg
.WM_MBUTTONUP
: {
1660 mouse_state
&= ~MouseButtons
.Middle
;
1664 case Msg
.WM_RBUTTONUP
: {
1665 mouse_state
&= ~MouseButtons
.Right
;
1669 case Msg
.WM_ASYNC_MESSAGE
: {
1670 XplatUIDriverSupport
.ExecuteClientMessage((GCHandle
)msg
.lParam
);
1674 case Msg
.WM_MOUSEMOVE
: {
1675 if (msg
.hwnd
!= prev_mouse_hwnd
) {
1676 TRACKMOUSEEVENT tme
;
1678 // The current message will be sent out next time around
1679 StoreMessage(ref msg
);
1681 // This is the message we want to send at this point
1682 msg
.message
= Msg
.WM_MOUSE_ENTER
;
1684 prev_mouse_hwnd
= msg
.hwnd
;
1686 tme
= new TRACKMOUSEEVENT();
1687 tme
.size
= Marshal
.SizeOf(tme
);
1688 tme
.hWnd
= msg
.hwnd
;
1689 tme
.dwFlags
= TMEFlags
.TME_LEAVE
| TMEFlags
.TME_HOVER
;
1690 Win32TrackMouseEvent(ref tme
);
1696 case Msg
.WM_NCMOUSEMOVE
: {
1697 if (wm_nc_registered
== null || !wm_nc_registered
.Contains (msg
.hwnd
))
1700 TRACKMOUSEEVENT tme
;
1702 tme
= new TRACKMOUSEEVENT ();
1703 tme
.size
= Marshal
.SizeOf(tme
);
1704 tme
.hWnd
= msg
.hwnd
;
1705 tme
.dwFlags
= (TMEFlags
)wm_nc_registered
[msg
.hwnd
];
1706 Win32TrackMouseEvent (ref tme
);
1710 case Msg
.WM_DROPFILES
: {
1711 return Win32DnD
.HandleWMDropFiles(ref msg
);
1714 case Msg
.WM_MOUSELEAVE
: {
1715 prev_mouse_hwnd
= IntPtr
.Zero
;
1719 case Msg
.WM_TIMER
: {
1720 Timer timer
=(Timer
)timer_list
[(int)msg
.wParam
];
1722 if (timer
!= null) {
1732 internal override bool TranslateMessage(ref MSG msg
) {
1733 return Win32TranslateMessage(ref msg
);
1736 internal override IntPtr
DispatchMessage(ref MSG msg
) {
1737 return Win32DispatchMessage(ref msg
);
1740 internal override bool SetZOrder(IntPtr hWnd
, IntPtr AfterhWnd
, bool Top
, bool Bottom
) {
1742 Win32SetWindowPos(hWnd
, SetWindowPosZOrder
.HWND_TOP
, 0, 0, 0, 0, SetWindowPosFlags
.SWP_NOMOVE
| SetWindowPosFlags
.SWP_NOSIZE
);
1744 } else if (!Bottom
) {
1745 Win32SetWindowPos(hWnd
, AfterhWnd
, 0, 0, 0, 0, SetWindowPosFlags
.SWP_NOMOVE
| SetWindowPosFlags
.SWP_NOSIZE
);
1747 Win32SetWindowPos(hWnd
, (IntPtr
)SetWindowPosZOrder
.HWND_BOTTOM
, 0, 0, 0, 0, SetWindowPosFlags
.SWP_NOMOVE
| SetWindowPosFlags
.SWP_NOSIZE
);
1753 internal override bool SetTopmost(IntPtr hWnd
, IntPtr hWndOwner
, bool Enabled
) {
1755 Win32SetWindowPos(hWnd
, SetWindowPosZOrder
.HWND_TOPMOST
, 0, 0, 0, 0, SetWindowPosFlags
.SWP_NOMOVE
| SetWindowPosFlags
.SWP_NOSIZE
| SetWindowPosFlags
.SWP_NOACTIVATE
);
1758 Win32SetWindowPos(hWnd
, SetWindowPosZOrder
.HWND_NOTOPMOST
, 0, 0, 0, 0, SetWindowPosFlags
.SWP_NOMOVE
| SetWindowPosFlags
.SWP_NOSIZE
| SetWindowPosFlags
.SWP_NOACTIVATE
);
1763 internal override bool Text(IntPtr handle
, string text
) {
1764 Win32SetWindowText(handle
, text
);
1768 internal override bool GetText(IntPtr handle
, out string text
) {
1771 sb
= new StringBuilder(256);
1772 Win32GetWindowText(handle
, sb
, sb
.Capacity
);
1773 text
= sb
.ToString();
1777 internal override bool SetVisible (IntPtr handle
, bool visible
, bool activate
)
1780 Control c
= Control
.FromHandle (handle
);
1784 f
= (Form
)Control
.FromHandle (handle
);
1785 WindowPlacementFlags flags
= WindowPlacementFlags
.SW_SHOWNORMAL
;
1786 switch (f
.WindowState
) {
1787 case FormWindowState
.Normal
: flags
= WindowPlacementFlags
.SW_SHOWNORMAL
; break;
1788 case FormWindowState
.Minimized
: flags
= WindowPlacementFlags
.SW_MINIMIZE
; break;
1789 case FormWindowState
.Maximized
: flags
= WindowPlacementFlags
.SW_MAXIMIZE
; break;
1792 if (!f
.ActivateOnShow
)
1793 flags
= WindowPlacementFlags
.SW_SHOWNOACTIVATE
;
1795 Win32ShowWindow (handle
, flags
);
1798 if (c
.ActivateOnShow
)
1799 Win32ShowWindow (handle
, WindowPlacementFlags
.SW_SHOWNORMAL
);
1801 Win32ShowWindow (handle
, WindowPlacementFlags
.SW_SHOWNOACTIVATE
);
1805 Win32ShowWindow (handle
, WindowPlacementFlags
.SW_HIDE
);
1810 internal override bool IsEnabled(IntPtr handle
) {
1811 return IsWindowEnabled (handle
);
1814 internal override bool IsVisible(IntPtr handle
) {
1815 return IsWindowVisible (handle
);
1818 internal override IntPtr
SetParent(IntPtr handle
, IntPtr parent
) {
1819 Control c
= Control
.FromHandle (handle
);
1820 if (parent
== IntPtr
.Zero
) {
1822 Win32ShowWindow(handle
, WindowPlacementFlags
.SW_HIDE
);
1826 SetVisible (handle
, c
.is_visible
, true);
1828 if (parent
== IntPtr
.Zero
)
1829 return Win32SetParent (handle
, FosterParent
);
1831 return Win32SetParent(handle
, parent
);
1834 // If we ever start using this, we should probably replace FosterParent with IntPtr.Zero
1835 internal override IntPtr
GetParent(IntPtr handle
) {
1836 return Win32GetParent(handle
);
1839 internal override void GrabWindow(IntPtr hWnd
, IntPtr ConfineToHwnd
) {
1841 Win32SetCapture(hWnd
);
1843 if (ConfineToHwnd
!= IntPtr
.Zero
) {
1845 Win32GetWindowRect (ConfineToHwnd
, out window_rect
);
1846 Win32GetClipCursor (out clipped_cursor_rect
);
1847 Win32ClipCursor (ref window_rect
);
1851 internal override void GrabInfo(out IntPtr hWnd
, out bool GrabConfined
, out Rectangle GrabArea
) {
1853 GrabConfined
= grab_confined
;
1854 GrabArea
= grab_area
;
1857 internal override void UngrabWindow(IntPtr hWnd
) {
1858 if (!(clipped_cursor_rect
.top
== 0 && clipped_cursor_rect
.bottom
== 0 && clipped_cursor_rect
.left
== 0 && clipped_cursor_rect
.right
== 0)) {
1859 Win32ClipCursor (ref clipped_cursor_rect
);
1860 clipped_cursor_rect
= new RECT ();
1863 Win32ReleaseCapture();
1864 grab_hwnd
= IntPtr
.Zero
;
1867 internal override bool CalculateWindowRect(ref Rectangle ClientRect
, int Style
, int ExStyle
, Menu menu
, out Rectangle WindowRect
) {
1870 rect
.left
=ClientRect
.Left
;
1871 rect
.top
=ClientRect
.Top
;
1872 rect
.right
=ClientRect
.Right
;
1873 rect
.bottom
=ClientRect
.Bottom
;
1875 if (!Win32AdjustWindowRectEx(ref rect
, Style
, menu
!= null, ExStyle
)) {
1876 WindowRect
= new Rectangle(ClientRect
.Left
, ClientRect
.Top
, ClientRect
.Width
, ClientRect
.Height
);
1880 WindowRect
= new Rectangle(rect
.left
, rect
.top
, rect
.right
-rect
.left
, rect
.bottom
-rect
.top
);
1884 internal override void SetCursor(IntPtr window
, IntPtr cursor
) {
1885 Win32SetCursor(cursor
);
1889 internal override void ShowCursor(bool show
) {
1890 Win32ShowCursor(show
);
1893 internal override void OverrideCursor(IntPtr cursor
) {
1894 Win32SetCursor(cursor
);
1897 internal override IntPtr
DefineCursor(Bitmap bitmap
, Bitmap mask
, Color cursor_pixel
, Color mask_pixel
, int xHotSpot
, int yHotSpot
) {
1899 Bitmap cursor_bitmap
;
1907 // Win32 only allows creation cursors of a certain size
1908 if ((bitmap
.Width
!= Win32GetSystemMetrics(SystemMetrics
.SM_CXCURSOR
)) || (bitmap
.Width
!= Win32GetSystemMetrics(SystemMetrics
.SM_CXCURSOR
))) {
1909 cursor_bitmap
= new Bitmap(bitmap
, new Size(Win32GetSystemMetrics(SystemMetrics
.SM_CXCURSOR
), Win32GetSystemMetrics(SystemMetrics
.SM_CXCURSOR
)));
1910 cursor_mask
= new Bitmap(mask
, new Size(Win32GetSystemMetrics(SystemMetrics
.SM_CXCURSOR
), Win32GetSystemMetrics(SystemMetrics
.SM_CXCURSOR
)));
1912 cursor_bitmap
= bitmap
;
1916 width
= cursor_bitmap
.Width
;
1917 height
= cursor_bitmap
.Height
;
1919 cursor_bits
= new Byte
[(width
/ 8) * height
];
1920 mask_bits
= new Byte
[(width
/ 8) * height
];
1922 for (int y
= 0; y
< height
; y
++) {
1923 for (int x
= 0; x
< width
; x
++) {
1924 pixel
= cursor_bitmap
.GetPixel(x
, y
);
1926 if (pixel
== cursor_pixel
) {
1927 cursor_bits
[y
* width
/ 8 + x
/ 8] |= (byte)(0x80 >> (x
% 8));
1930 pixel
= cursor_mask
.GetPixel(x
, y
);
1932 if (pixel
== mask_pixel
) {
1933 mask_bits
[y
* width
/ 8 + x
/ 8] |= (byte)(0x80 >> (x
% 8));
1938 cursor
= Win32CreateCursor(IntPtr
.Zero
, xHotSpot
, yHotSpot
, width
, height
, mask_bits
, cursor_bits
);
1943 [MonoTODO("Define the missing cursors")]
1944 internal override IntPtr
DefineStdCursor(StdCursor id
) {
1946 case StdCursor
.AppStarting
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_APPSTARTING
);
1947 case StdCursor
.Arrow
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_ARROW
);
1948 case StdCursor
.Cross
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_CROSS
);
1949 case StdCursor
.Default
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_ARROW
);
1950 case StdCursor
.Hand
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_HAND
);
1951 case StdCursor
.Help
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_HELP
);
1952 case StdCursor
.HSplit
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_ARROW
); // FIXME
1953 case StdCursor
.IBeam
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_IBEAM
);
1954 case StdCursor
.No
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_NO
);
1955 case StdCursor
.NoMove2D
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_ARROW
); // FIXME
1956 case StdCursor
.NoMoveHoriz
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_ARROW
); // FIXME
1957 case StdCursor
.NoMoveVert
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_ARROW
); // FIXME
1958 case StdCursor
.PanEast
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_ARROW
); // FIXME
1959 case StdCursor
.PanNE
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_ARROW
); // FIXME
1960 case StdCursor
.PanNorth
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_ARROW
); // FIXME
1961 case StdCursor
.PanNW
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_ARROW
); // FIXME
1962 case StdCursor
.PanSE
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_ARROW
); // FIXME
1963 case StdCursor
.PanSouth
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_ARROW
); // FIXME
1964 case StdCursor
.PanSW
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_ARROW
); // FIXME
1965 case StdCursor
.PanWest
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_ARROW
); // FIXME
1966 case StdCursor
.SizeAll
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_SIZEALL
);
1967 case StdCursor
.SizeNESW
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_SIZENESW
);
1968 case StdCursor
.SizeNS
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_SIZENS
);
1969 case StdCursor
.SizeNWSE
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_SIZENWSE
);
1970 case StdCursor
.SizeWE
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_SIZEWE
);
1971 case StdCursor
.UpArrow
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_UPARROW
);
1972 case StdCursor
.VSplit
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_ARROW
); // FIXME
1973 case StdCursor
.WaitCursor
: return Win32LoadCursor(IntPtr
.Zero
, LoadCursorType
.IDC_WAIT
);
1975 throw new NotImplementedException ();
1978 internal override void DestroyCursor(IntPtr cursor
) {
1979 if ((cursor
.ToInt32() < (int)LoadCursorType
.First
) || (cursor
.ToInt32() > (int)LoadCursorType
.Last
)) {
1980 Win32DestroyCursor(cursor
);
1985 internal override void GetCursorInfo(IntPtr cursor
, out int width
, out int height
, out int hotspot_x
, out int hotspot_y
) {
1992 internal override void SetCursorPos(IntPtr handle
, int x
, int y
) {
1993 Win32SetCursorPos(x
, y
);
1996 internal override Region
GetClipRegion(IntPtr hwnd
) {
1999 region
= new Region();
2001 Win32GetWindowRgn(hwnd
, region
.GetHrgn(Graphics
.FromHwnd(hwnd
)));
2006 internal override void SetClipRegion(IntPtr hwnd
, Region region
) {
2007 Win32SetWindowRgn(hwnd
, region
.GetHrgn(Graphics
.FromHwnd(hwnd
)), true);
2010 internal override void EnableWindow(IntPtr handle
, bool Enable
) {
2011 Win32EnableWindow(handle
, Enable
);
2014 internal override void EndLoop(System
.Threading
.Thread thread
) {
2018 internal override object StartLoop(System
.Threading
.Thread thread
) {
2022 internal override void SetModal(IntPtr handle
, bool Modal
) {
2023 // we do nothing on Win32
2026 internal override void GetCursorPos(IntPtr handle
, out int x
, out int y
) {
2029 Win32GetCursorPos(out pt
);
2031 if (handle
!=IntPtr
.Zero
) {
2032 Win32ScreenToClient(handle
, ref pt
);
2039 internal override void ScreenToClient(IntPtr handle
, ref int x
, ref int y
)
2041 POINT pnt
= new POINT();
2045 Win32ScreenToClient (handle
, ref pnt
);
2051 internal override void ClientToScreen(IntPtr handle
, ref int x
, ref int y
) {
2052 POINT pnt
= new POINT();
2057 Win32ClientToScreen(handle
, ref pnt
);
2063 internal override void ScreenToMenu(IntPtr handle
, ref int x
, ref int y
) {
2066 Win32GetWindowRect(handle
, out rect
);
2067 x
-= rect
.left
+ SystemInformation
.FrameBorderSize
.Width
;
2068 y
-= rect
.top
+ SystemInformation
.FrameBorderSize
.Height
+ ThemeEngine
.Current
.CaptionHeight
;
2072 internal override void MenuToScreen(IntPtr handle
, ref int x
, ref int y
) {
2075 Win32GetWindowRect(handle
, out rect
);
2076 x
+= rect
.left
+ SystemInformation
.FrameBorderSize
.Width
;
2077 y
+= rect
.top
+ SystemInformation
.FrameBorderSize
.Height
+ ThemeEngine
.Current
.CaptionHeight
;
2081 internal override void SendAsyncMethod (AsyncMethodData method
)
2083 Win32PostMessage(FosterParent
, Msg
.WM_ASYNC_MESSAGE
, IntPtr
.Zero
, (IntPtr
)GCHandle
.Alloc (method
));
2086 internal override void SetTimer (Timer timer
)
2090 index
= timer
.GetHashCode();
2093 timer_list
[index
]=timer
;
2096 Win32SetTimer(FosterParent
, index
, (uint)timer
.Interval
, IntPtr
.Zero
);
2099 internal override void KillTimer (Timer timer
)
2103 index
= timer
.GetHashCode();
2105 Win32KillTimer(FosterParent
, index
);
2108 timer_list
.Remove(index
);
2112 private void FakeStyles (CreateParams cp
)
2114 if (cp
.HasWindowManager
) {
2115 // Remove all styles but WS_VISIBLE.
2116 cp
.WindowStyle
&= WindowStyles
.WS_VISIBLE
;
2117 // Set styles that enables us to use the window manager.
2118 cp
.WindowStyle
|= WindowStyles
.WS_CHILD
| WindowStyles
.WS_CLIPCHILDREN
| WindowStyles
.WS_CLIPSIBLINGS
;
2123 internal override void CreateCaret(IntPtr hwnd
, int width
, int height
) {
2124 Win32CreateCaret(hwnd
, IntPtr
.Zero
, width
, height
);
2125 caret_visible
= false;
2128 internal override void DestroyCaret(IntPtr hwnd
) {
2129 Win32DestroyCaret();
2132 internal override void SetCaretPos(IntPtr hwnd
, int x
, int y
) {
2133 Win32SetCaretPos(x
, y
);
2136 internal override void CaretVisible(IntPtr hwnd
, bool visible
) {
2138 if (!caret_visible
) {
2139 Win32ShowCaret(hwnd
);
2140 caret_visible
= true;
2143 if (caret_visible
) {
2144 Win32HideCaret(hwnd
);
2145 caret_visible
= false;
2150 internal override IntPtr
GetFocus() {
2151 return Win32GetFocus();
2154 internal override void SetFocus(IntPtr hwnd
) {
2155 Win32SetFocus(hwnd
);
2158 internal override IntPtr
GetActive() {
2159 return Win32GetActiveWindow();
2162 internal override bool GetFontMetrics(Graphics g
, Font font
, out int ascent
, out int descent
) {
2166 tm
= new TEXTMETRIC();
2168 dc
= Win32GetDC(IntPtr
.Zero
);
2169 Win32SelectObject(dc
, font
.ToHfont());
2170 if (Win32GetTextMetrics(dc
, ref tm
) == false) {
2171 Win32ReleaseDC(IntPtr
.Zero
, dc
);
2176 Win32ReleaseDC(IntPtr
.Zero
, dc
);
2178 ascent
= tm
.tmAscent
;
2179 descent
= tm
.tmDescent
;
2184 internal override void ScrollWindow(IntPtr hwnd
, Rectangle rectangle
, int XAmount
, int YAmount
, bool with_children
) {
2188 rect
.left
= rectangle
.X
;
2189 rect
.top
= rectangle
.Y
;
2190 rect
.right
= rectangle
.Right
;
2191 rect
.bottom
= rectangle
.Bottom
;
2193 Win32ScrollWindowEx(hwnd
, XAmount
, YAmount
, IntPtr
.Zero
, ref rect
, IntPtr
.Zero
, IntPtr
.Zero
, ScrollWindowExFlags
.SW_INVALIDATE
| ScrollWindowExFlags
.SW_ERASE
| (with_children
? ScrollWindowExFlags
.SW_SCROLLCHILDREN
: ScrollWindowExFlags
.SW_NONE
));
2194 Win32UpdateWindow(hwnd
);
2197 internal override void ScrollWindow(IntPtr hwnd
, int XAmount
, int YAmount
, bool with_children
) {
2198 Win32ScrollWindowEx(hwnd
, XAmount
, YAmount
, IntPtr
.Zero
, IntPtr
.Zero
, IntPtr
.Zero
, IntPtr
.Zero
, ScrollWindowExFlags
.SW_INVALIDATE
| ScrollWindowExFlags
.SW_ERASE
| (with_children
? ScrollWindowExFlags
.SW_SCROLLCHILDREN
: ScrollWindowExFlags
.SW_NONE
));
2201 internal override bool SystrayAdd(IntPtr hwnd
, string tip
, Icon icon
, out ToolTip tt
) {
2204 nid
= new NOTIFYICONDATA();
2206 nid
.cbSize
= (uint)Marshal
.SizeOf(nid
);
2209 nid
.uCallbackMessage
= (uint)Msg
.WM_USER
;
2210 nid
.uFlags
= NotifyIconFlags
.NIF_MESSAGE
;
2214 nid
.uFlags
|= NotifyIconFlags
.NIF_TIP
;
2218 nid
.hIcon
= icon
.Handle
;
2219 nid
.uFlags
|= NotifyIconFlags
.NIF_ICON
;
2224 return Win32Shell_NotifyIcon(NotifyIconMessage
.NIM_ADD
, ref nid
);
2227 internal override bool SystrayChange(IntPtr hwnd
, string tip
, Icon icon
, ref ToolTip tt
) {
2230 nid
= new NOTIFYICONDATA();
2232 nid
.cbSize
= (uint)Marshal
.SizeOf(nid
);
2233 nid
.hIcon
= icon
.Handle
;
2236 nid
.uCallbackMessage
= (uint)Msg
.WM_USER
;
2237 nid
.uFlags
= NotifyIconFlags
.NIF_MESSAGE
;
2241 nid
.uFlags
|= NotifyIconFlags
.NIF_TIP
;
2245 nid
.hIcon
= icon
.Handle
;
2246 nid
.uFlags
|= NotifyIconFlags
.NIF_ICON
;
2249 return Win32Shell_NotifyIcon(NotifyIconMessage
.NIM_MODIFY
, ref nid
);
2252 internal override void SystrayRemove(IntPtr hwnd
, ref ToolTip tt
) {
2255 nid
= new NOTIFYICONDATA();
2257 nid
.cbSize
= (uint)Marshal
.SizeOf(nid
);
2262 Win32Shell_NotifyIcon(NotifyIconMessage
.NIM_DELETE
, ref nid
);
2266 internal override void SetBorderStyle(IntPtr handle
, FormBorderStyle border_style
) {
2267 // Nothing to do on Win32
2270 internal override void SetMenu(IntPtr handle
, Menu menu
) {
2271 // Trigger WM_NCCALC
2272 Win32SetWindowPos(handle
, IntPtr
.Zero
, 0, 0, 0, 0, SetWindowPosFlags
.SWP_FRAMECHANGED
| SetWindowPosFlags
.SWP_NOMOVE
| SetWindowPosFlags
.SWP_NOSIZE
);
2275 internal override Point
GetMenuOrigin(IntPtr handle
) {
2276 return new Point(SystemInformation
.FrameBorderSize
.Width
, SystemInformation
.FrameBorderSize
.Height
+ ThemeEngine
.Current
.CaptionHeight
);
2279 internal override void SetIcon(IntPtr hwnd
, Icon icon
) {
2280 Win32SendMessage(hwnd
, Msg
.WM_SETICON
, (IntPtr
)1, icon
== null ? IntPtr
.Zero
: icon
.Handle
); // 1 = large icon (0 would be small)
2283 internal override void ClipboardClose(IntPtr handle
) {
2284 if (handle
!= clip_magic
) {
2285 throw new ArgumentException("handle is not a valid clipboard handle");
2287 Win32CloseClipboard();
2290 internal override int ClipboardGetID(IntPtr handle
, string format
) {
2291 if (handle
!= clip_magic
) {
2292 throw new ArgumentException("handle is not a valid clipboard handle");
2294 if (format
== "Text" ) return 1;
2295 else if (format
== "Bitmap" ) return 2;
2296 else if (format
== "MetaFilePict" ) return 3;
2297 else if (format
== "SymbolicLink" ) return 4;
2298 else if (format
== "DataInterchangeFormat" ) return 5;
2299 else if (format
== "Tiff" ) return 6;
2300 else if (format
== "OEMText" ) return 7;
2301 else if (format
== "DeviceIndependentBitmap" ) return 8;
2302 else if (format
== "Palette" ) return 9;
2303 else if (format
== "PenData" ) return 10;
2304 else if (format
== "RiffAudio" ) return 11;
2305 else if (format
== "WaveAudio" ) return 12;
2306 else if (format
== "UnicodeText" ) return 13;
2307 else if (format
== "EnhancedMetafile" ) return 14;
2308 else if (format
== "FileDrop" ) return 15;
2309 else if (format
== "Locale" ) return 16;
2311 return (int)Win32RegisterClipboardFormat(format
);
2314 internal override IntPtr
ClipboardOpen(bool primary_selection
) {
2315 // Win32 does not have primary selection
2316 Win32OpenClipboard(FosterParent
);
2320 internal override int[] ClipboardAvailableFormats(IntPtr handle
) {
2325 if (handle
!= clip_magic
) {
2333 format
= Win32EnumClipboardFormats(format
);
2337 } while (format
!= 0);
2340 result
= new int[count
];
2344 format
= Win32EnumClipboardFormats(format
);
2346 result
[count
++] = (int)format
;
2348 } while (format
!= 0);
2354 internal override object ClipboardRetrieve(IntPtr handle
, int type
, XplatUI
.ClipboardToObject converter
) {
2359 if (handle
!= clip_magic
) {
2360 throw new ArgumentException("handle is not a valid clipboard handle");
2363 hmem
= Win32GetClipboardData((uint)type
);
2364 if (hmem
== IntPtr
.Zero
) {
2368 data
= Win32GlobalLock(hmem
);
2369 if (data
== IntPtr
.Zero
) {
2370 uint error
= Win32GetLastError();
2371 Console
.WriteLine("Error: {0}", error
);
2377 if (type
== DataFormats
.GetFormat(DataFormats
.Rtf
).Id
) {
2378 obj
= AnsiToString(data
);
2379 } else switch ((ClipboardFormats
)type
) {
2380 case ClipboardFormats
.CF_TEXT
: {
2381 obj
= AnsiToString(data
);
2385 case ClipboardFormats
.CF_DIB
: {
2386 obj
= DIBtoImage(data
);
2390 case ClipboardFormats
.CF_UNICODETEXT
: {
2391 obj
= UnicodeToString(data
);
2396 if (converter
!= null && !converter(type
, data
, out obj
)) {
2402 Win32GlobalUnlock(hmem
);
2408 internal override void ClipboardStore(IntPtr handle
, object obj
, int type
, XplatUI
.ObjectToClipboard converter
) {
2413 if (handle
!= clip_magic
) {
2414 throw new ArgumentException("handle is not a valid clipboard handle");
2419 Win32EmptyClipboard();
2424 if (obj
is string) {
2425 type
= (int)ClipboardFormats
.CF_UNICODETEXT
;
2426 } else if (obj
is Image
) {
2427 type
= (int)ClipboardFormats
.CF_DIB
;
2431 if (type
== DataFormats
.GetFormat(DataFormats
.Rtf
).Id
) {
2432 hmem
= Marshal
.StringToHGlobalAnsi((string)obj
);
2433 Win32SetClipboardData((uint)type
, hmem
);
2435 } else switch((ClipboardFormats
)type
) {
2436 case ClipboardFormats
.CF_UNICODETEXT
: {
2437 hmem
= Marshal
.StringToHGlobalUni((string)obj
);
2438 Win32SetClipboardData((uint)type
, hmem
);
2442 case ClipboardFormats
.CF_TEXT
: {
2443 hmem
= Marshal
.StringToHGlobalAnsi((string)obj
);
2444 Win32SetClipboardData((uint)type
, hmem
);
2448 case ClipboardFormats
.CF_BITMAP
:
2449 case ClipboardFormats
.CF_DIB
: {
2450 data
= ImageToDIB((Image
)obj
);
2452 hmem
= Win32GlobalAlloc(GAllocFlags
.GMEM_MOVEABLE
| GAllocFlags
.GMEM_DDESHARE
, data
.Length
);
2453 hmem_ptr
= Win32GlobalLock(hmem
);
2454 Marshal
.Copy(data
, 0, hmem_ptr
, data
.Length
);
2455 Win32GlobalUnlock(hmem
);
2456 Win32SetClipboardData((uint)ClipboardFormats
.CF_DIB
, hmem
);
2461 if (converter
!= null && converter(ref type
, obj
, out data
)) {
2462 hmem
= Win32GlobalAlloc(GAllocFlags
.GMEM_MOVEABLE
| GAllocFlags
.GMEM_DDESHARE
, data
.Length
);
2463 hmem_ptr
= Win32GlobalLock(hmem
);
2464 Marshal
.Copy(data
, 0, hmem_ptr
, data
.Length
);
2465 Win32GlobalUnlock(hmem
);
2466 Win32SetClipboardData((uint)type
, hmem
);
2473 internal override void SetAllowDrop(IntPtr hwnd
, bool allowed
) {
2475 Win32DnD
.RegisterDropTarget(hwnd
);
2477 Win32DnD
.UnregisterDropTarget(hwnd
);
2481 internal override DragDropEffects
StartDrag(IntPtr hwnd
, object data
, DragDropEffects allowedEffects
) {
2482 return Win32DnD
.StartDrag(hwnd
, data
, allowedEffects
);
2485 // XXX this doesn't work at all for FrameStyle.Dashed - it draws like Thick, and in the Thick case
2486 // the corners are drawn incorrectly.
2487 internal override void DrawReversibleFrame (Rectangle rectangle
, Color backColor
, FrameStyle style
) {
2491 COLORREF clrRef
= new COLORREF();
2493 // If we want the standard hatch pattern we would
2494 // need to create a brush
2496 clrRef
.R
= backColor
.R
;
2497 clrRef
.G
= backColor
.G
;
2498 clrRef
.B
= backColor
.B
;
2501 pen
= Win32CreatePen (style
== FrameStyle
.Thick
? PenStyle
.PS_SOLID
: PenStyle
.PS_DASH
,
2502 style
== FrameStyle
.Thick
? 4 : 2, ref clrRef
);
2504 hdc
= Win32GetDC(IntPtr
.Zero
);
2505 Win32SetROP2(hdc
, ROP2DrawMode
.R2_NOT
);
2506 oldpen
= Win32SelectObject(hdc
, pen
);
2508 Win32MoveToEx(hdc
, rectangle
.Left
, rectangle
.Top
, IntPtr
.Zero
);
2509 if ((rectangle
.Width
> 0) && (rectangle
.Height
> 0)) {
2510 Win32LineTo(hdc
, rectangle
.Right
, rectangle
.Top
);
2511 Win32LineTo(hdc
, rectangle
.Right
, rectangle
.Bottom
);
2512 Win32LineTo(hdc
, rectangle
.Left
, rectangle
.Bottom
);
2513 Win32LineTo(hdc
, rectangle
.Left
, rectangle
.Top
);
2515 if (rectangle
.Width
> 0) {
2516 Win32LineTo(hdc
, rectangle
.Right
, rectangle
.Top
);
2518 Win32LineTo(hdc
, rectangle
.Left
, rectangle
.Bottom
);
2522 Win32SelectObject(hdc
, oldpen
);
2523 Win32DeleteObject(pen
);
2525 Win32ReleaseDC(IntPtr
.Zero
, hdc
);
2528 internal override void DrawReversibleLine(Point start
, Point end
, Color backColor
) {
2533 COLORREF clrRef
= new COLORREF();
2538 Win32ClientToScreen(IntPtr
.Zero
, ref pt
);
2540 // If we want the standard hatch pattern we would
2541 // need to create a brush
2543 clrRef
.R
= backColor
.R
;
2544 clrRef
.G
= backColor
.G
;
2545 clrRef
.B
= backColor
.B
;
2548 pen
= Win32CreatePen(PenStyle
.PS_SOLID
, 1, ref clrRef
);
2550 hdc
= Win32GetDC(IntPtr
.Zero
);
2551 Win32SetROP2(hdc
, ROP2DrawMode
.R2_NOT
);
2552 oldpen
= Win32SelectObject(hdc
, pen
);
2554 Win32MoveToEx(hdc
, pt
.x
+ start
.X
, pt
.y
+ start
.Y
, IntPtr
.Zero
);
2555 Win32LineTo(hdc
, pt
.x
+ end
.X
, pt
.y
+ end
.Y
);
2557 Win32SelectObject(hdc
, oldpen
);
2558 Win32DeleteObject(pen
);
2560 Win32ReleaseDC(IntPtr
.Zero
, hdc
);
2563 internal override void FillReversibleRectangle (Rectangle rectangle
, Color backColor
)
2568 rect
.left
= rectangle
.Left
;
2569 rect
.top
= rectangle
.Top
;
2570 rect
.right
= rectangle
.Right
;
2571 rect
.bottom
= rectangle
.Bottom
;
2576 COLORREF clrRef
= new COLORREF();
2578 clrRef
.R
= backColor
.R
;
2579 clrRef
.G
= backColor
.G
;
2580 clrRef
.B
= backColor
.B
;
2583 brush
= Win32CreateSolidBrush (clrRef
);
2585 hdc
= Win32GetDC(IntPtr
.Zero
);
2586 oldbrush
= Win32SelectObject(hdc
, brush
);
2588 Win32PatBlt (hdc
, rectangle
.Left
, rectangle
.Top
, rectangle
.Width
, rectangle
.Height
, PatBltRop
.DSTINVERT
);
2590 Win32SelectObject(hdc
, oldbrush
);
2591 Win32DeleteObject(brush
);
2593 Win32ReleaseDC(IntPtr
.Zero
, hdc
);
2596 internal override void DrawReversibleRectangle(IntPtr handle
, Rectangle rect
, int line_width
) {
2605 Win32ClientToScreen(handle
, ref pt
);
2607 // If we want the standard hatch pattern we would
2608 // need to create a brush
2611 pen
= Win32CreatePen(PenStyle
.PS_SOLID
, line_width
, IntPtr
.Zero
);
2613 hdc
= Win32GetDC(IntPtr
.Zero
);
2614 Win32SetROP2(hdc
, ROP2DrawMode
.R2_NOT
);
2615 oldpen
= Win32SelectObject(hdc
, pen
);
2617 Control c
= Control
.FromHandle (handle
);
2620 Win32GetWindowRect (c
.Handle
, out window_rect
);
2621 Region r
= new Region (new Rectangle(window_rect
.left
, window_rect
.top
, window_rect
.right
- window_rect
.left
, window_rect
.bottom
- window_rect
.top
));
2622 Win32ExtSelectClipRgn(hdc
, r
.GetHrgn (Graphics
.FromHdc (hdc
)), (int) ClipCombineMode
.RGN_AND
);
2625 Win32MoveToEx(hdc
, pt
.x
+ rect
.Left
, pt
.y
+ rect
.Top
, IntPtr
.Zero
);
2626 if ((rect
.Width
> 0) && (rect
.Height
> 0)) {
2627 Win32LineTo(hdc
, pt
.x
+ rect
.Right
, pt
.y
+ rect
.Top
);
2628 Win32LineTo(hdc
, pt
.x
+ rect
.Right
, pt
.y
+ rect
.Bottom
);
2629 Win32LineTo(hdc
, pt
.x
+ rect
.Left
, pt
.y
+ rect
.Bottom
);
2630 Win32LineTo(hdc
, pt
.x
+ rect
.Left
, pt
.y
+ rect
.Top
);
2632 if (rect
.Width
> 0) {
2633 Win32LineTo(hdc
, pt
.x
+ rect
.Right
, pt
.y
+ rect
.Top
);
2635 Win32LineTo(hdc
, pt
.x
+ rect
.Left
, pt
.y
+ rect
.Bottom
);
2639 Win32SelectObject(hdc
, oldpen
);
2640 Win32DeleteObject(pen
);
2642 Win32ExtSelectClipRgn(hdc
, IntPtr
.Zero
, (int) ClipCombineMode
.RGN_COPY
);
2644 Win32ReleaseDC(IntPtr
.Zero
, hdc
);
2647 internal override SizeF
GetAutoScaleSize(Font font
) {
2650 string magic_string
= "The quick brown fox jumped over the lazy dog.";
2651 double magic_number
= 44.549996948242189;
2653 g
= Graphics
.FromHwnd(FosterParent
);
2655 width
= (float) (g
.MeasureString (magic_string
, font
).Width
/ magic_number
);
2656 return new SizeF(width
, font
.Height
);
2659 internal override IntPtr
SendMessage (IntPtr hwnd
, Msg message
, IntPtr wParam
, IntPtr lParam
) {
2660 return Win32SendMessage(hwnd
, message
, wParam
, lParam
);
2663 internal override bool PostMessage (IntPtr hwnd
, Msg message
, IntPtr wParam
, IntPtr lParam
) {
2664 return Win32PostMessage(hwnd
, message
, wParam
, lParam
);
2667 internal override int SendInput (IntPtr hwnd
, Queue keys
) {
2668 INPUT
[] inputs
= new INPUT
[keys
.Count
];
2669 const Int32 INPUT_KEYBOARD
= 1;
2672 while (keys
.Count
> 0) {
2673 MSG msg
= (MSG
)keys
.Dequeue();
2676 inputs
[i
].ki
.wScan
= 0;
2677 inputs
[i
].ki
.time
= 0;
2678 inputs
[i
].ki
.dwFlags
= (Int32
)(msg
.message
== Msg
.WM_KEYUP
? InputFlags
.KEYEVENTF_KEYUP
: 0);
2679 inputs
[i
].ki
.wVk
= (short)msg
.wParam
.ToInt32();
2680 inputs
[i
].type
= INPUT_KEYBOARD
;
2683 returns
= Win32SendInput((UInt32
)inputs
.Length
, inputs
, Marshal
.SizeOf(typeof(INPUT
)));
2685 return (int) returns
;
2688 internal override int KeyboardSpeed
{
2691 Win32SystemParametersInfo(SPIAction
.SPI_GETKEYBOARDSPEED
, 0, ref speed
, 0);
2693 // Return values range from 0 to 31 which map to 2.5 to 30 repetitions per second.
2699 internal override int KeyboardDelay
{
2702 Win32SystemParametersInfo(SPIAction
.SPI_GETKEYBOARDDELAY
, 0, ref delay
, 0);
2704 // Return values must range from 0 to 4, 0 meaning 250ms,
2705 // and 4 meaning 1000 ms.
2711 private class WinBuffer
2714 public IntPtr bitmap
;
2716 public WinBuffer (IntPtr hdc
, IntPtr bitmap
)
2719 this.bitmap
= bitmap
;
2723 internal override void CreateOffscreenDrawable (IntPtr handle
, int width
, int height
, out object offscreen_drawable
)
2725 Graphics destG
= Graphics
.FromHwnd (handle
);
2726 IntPtr destHdc
= destG
.GetHdc ();
2728 IntPtr srcHdc
= Win32CreateCompatibleDC (destHdc
);
2729 IntPtr srcBmp
= Win32CreateCompatibleBitmap (destHdc
, width
, height
);
2730 Win32SelectObject (srcHdc
, srcBmp
);
2732 offscreen_drawable
= new WinBuffer (srcHdc
, srcBmp
);
2734 destG
.ReleaseHdc (destHdc
);
2737 internal override Graphics
GetOffscreenGraphics (object offscreen_drawable
)
2739 return Graphics
.FromHdc (((WinBuffer
)offscreen_drawable
).hdc
);
2742 internal override void BlitFromOffscreen (IntPtr dest_handle
, Graphics dest_dc
, object offscreen_drawable
, Graphics offscreen_dc
, Rectangle r
)
2744 WinBuffer wb
= (WinBuffer
)offscreen_drawable
;
2746 IntPtr destHdc
= dest_dc
.GetHdc ();
2747 Win32BitBlt (destHdc
, r
.Left
, r
.Top
, r
.Width
, r
.Height
, wb
.hdc
, r
.Left
, r
.Top
, TernaryRasterOperations
.SRCCOPY
);
2748 dest_dc
.ReleaseHdc (destHdc
);
2751 internal override void DestroyOffscreenDrawable (object offscreen_drawable
)
2753 WinBuffer wb
= (WinBuffer
)offscreen_drawable
;
2755 Win32DeleteObject (wb
.bitmap
);
2756 Win32DeleteDC (wb
.hdc
);
2759 internal override event EventHandler Idle
;
2760 #endregion // Public Static Methods
2762 #region Win32 Imports
2763 [DllImport ("kernel32.dll", EntryPoint
="GetLastError", CallingConvention
=CallingConvention
.StdCall
)]
2764 private extern static uint Win32GetLastError();
2766 [DllImport ("user32.dll", EntryPoint
="CreateWindowExW", CharSet
=CharSet
.Unicode
, CallingConvention
=CallingConvention
.StdCall
)]
2767 internal extern static IntPtr
Win32CreateWindow(uint dwExStyle
, string lpClassName
, string lpWindowName
, uint dwStyle
, int x
, int y
, int nWidth
, int nHeight
, IntPtr hWndParent
, IntPtr hMenu
, IntPtr hInstance
, IntPtr lParam
);
2769 [DllImport ("user32.dll", EntryPoint
="DestroyWindow", CallingConvention
=CallingConvention
.StdCall
)]
2770 internal extern static bool Win32DestroyWindow(IntPtr hWnd
);
2772 [DllImport ("user32.dll", EntryPoint
="PeekMessageW", CharSet
=CharSet
.Unicode
, CallingConvention
=CallingConvention
.StdCall
)]
2773 internal extern static bool Win32PeekMessage(ref MSG msg
, IntPtr hWnd
, int wFilterMin
, int wFilterMax
, uint flags
);
2775 [DllImport ("user32.dll", EntryPoint
="GetMessageW", CharSet
=CharSet
.Unicode
, CallingConvention
=CallingConvention
.StdCall
)]
2776 internal extern static bool Win32GetMessage(ref MSG msg
, IntPtr hWnd
, int wFilterMin
, int wFilterMax
);
2778 [DllImport ("user32.dll", EntryPoint
="TranslateMessage", CallingConvention
=CallingConvention
.StdCall
)]
2779 internal extern static bool Win32TranslateMessage(ref MSG msg
);
2781 [DllImport ("user32.dll", EntryPoint
="DispatchMessageW", CharSet
=CharSet
.Unicode
, CallingConvention
=CallingConvention
.StdCall
)]
2782 internal extern static IntPtr
Win32DispatchMessage(ref MSG msg
);
2784 [DllImport ("user32.dll", EntryPoint
="MoveWindow", CallingConvention
=CallingConvention
.StdCall
)]
2785 internal extern static bool Win32MoveWindow(IntPtr hWnd
, int x
, int y
, int width
, int height
, bool repaint
);
2787 [DllImport ("user32.dll", EntryPoint
="SetWindowPos", CallingConvention
=CallingConvention
.StdCall
)]
2788 internal extern static bool Win32SetWindowPos(IntPtr hWnd
, IntPtr hWndInsertAfter
, int x
, int y
, int cx
, int cy
, SetWindowPosFlags Flags
);
2790 [DllImport ("user32.dll", EntryPoint
="SetWindowPos", CallingConvention
=CallingConvention
.StdCall
)]
2791 internal extern static bool Win32SetWindowPos(IntPtr hWnd
, SetWindowPosZOrder pos
, int x
, int y
, int cx
, int cy
, SetWindowPosFlags Flags
);
2793 [DllImport ("user32.dll", EntryPoint
="SetWindowTextW", CharSet
=CharSet
.Unicode
, CallingConvention
=CallingConvention
.StdCall
)]
2794 internal extern static bool Win32SetWindowText(IntPtr hWnd
, string lpString
);
2796 [DllImport ("user32.dll", EntryPoint
="GetWindowTextW", CharSet
=CharSet
.Unicode
, CallingConvention
=CallingConvention
.StdCall
)]
2797 internal extern static bool Win32GetWindowText(IntPtr hWnd
, StringBuilder lpString
, int nMaxCount
);
2799 [DllImport ("user32.dll", EntryPoint
="SetParent", CallingConvention
=CallingConvention
.StdCall
)]
2800 internal extern static IntPtr
Win32SetParent(IntPtr hWnd
, IntPtr hParent
);
2802 [DllImport ("user32.dll", EntryPoint
="RegisterClassW", CharSet
=CharSet
.Unicode
, CallingConvention
=CallingConvention
.StdCall
)]
2803 private extern static bool Win32RegisterClass(ref WNDCLASS wndClass
);
2805 [DllImport ("user32.dll", EntryPoint
="LoadCursorW", CharSet
=CharSet
.Unicode
, CallingConvention
=CallingConvention
.StdCall
)]
2806 private extern static IntPtr
Win32LoadCursor(IntPtr hInstance
, LoadCursorType type
);
2808 [DllImport ("user32.dll", EntryPoint
="ShowCursor", CallingConvention
=CallingConvention
.StdCall
)]
2809 private extern static IntPtr
Win32ShowCursor(bool bShow
);
2811 [DllImport ("user32.dll", EntryPoint
="SetCursor", CallingConvention
=CallingConvention
.StdCall
)]
2812 private extern static IntPtr
Win32SetCursor(IntPtr hCursor
);
2814 [DllImport ("user32.dll", EntryPoint
="CreateCursor", CallingConvention
=CallingConvention
.StdCall
)]
2815 private extern static IntPtr
Win32CreateCursor(IntPtr hInstance
, int xHotSpot
, int yHotSpot
, int nWidth
, int nHeight
, Byte
[] pvANDPlane
, Byte
[] pvORPlane
);
2817 [DllImport ("user32.dll", EntryPoint
="DestroyCursor", CallingConvention
=CallingConvention
.StdCall
)]
2818 private extern static bool Win32DestroyCursor(IntPtr hCursor
);
2820 [DllImport ("user32.dll", EntryPoint
="DefWindowProcW", CharSet
=CharSet
.Unicode
, CallingConvention
=CallingConvention
.StdCall
)]
2821 private extern static IntPtr
Win32DefWindowProc(IntPtr hWnd
, Msg Msg
, IntPtr wParam
, IntPtr lParam
);
2823 //[DllImport ("user32.dll", EntryPoint="DefDlgProcW", CharSet=CharSet.Unicode, CallingConvention=CallingConvention.StdCall)]
2824 //private extern static IntPtr Win32DefDlgProc(IntPtr hWnd, Msg Msg, IntPtr wParam, IntPtr lParam);
2826 [DllImport ("user32.dll", EntryPoint
="PostQuitMessage", CallingConvention
=CallingConvention
.StdCall
)]
2827 private extern static IntPtr
Win32PostQuitMessage(int nExitCode
);
2829 [DllImport ("user32.dll", EntryPoint
="UpdateWindow", CallingConvention
=CallingConvention
.StdCall
)]
2830 private extern static IntPtr
Win32UpdateWindow(IntPtr hWnd
);
2832 [DllImport ("user32.dll", EntryPoint
="GetUpdateRect", CallingConvention
=CallingConvention
.StdCall
)]
2833 private extern static bool Win32GetUpdateRect(IntPtr hWnd
, ref RECT rect
, bool erase
);
2835 [DllImport ("user32.dll", EntryPoint
="BeginPaint", CallingConvention
=CallingConvention
.StdCall
)]
2836 private extern static IntPtr
Win32BeginPaint(IntPtr hWnd
, ref PAINTSTRUCT ps
);
2838 [DllImport ("user32.dll", EntryPoint
="EndPaint", CallingConvention
=CallingConvention
.StdCall
)]
2839 private extern static bool Win32EndPaint(IntPtr hWnd
, ref PAINTSTRUCT ps
);
2841 [DllImport ("user32.dll", EntryPoint
="GetDC", CallingConvention
=CallingConvention
.StdCall
)]
2842 private extern static IntPtr
Win32GetDC(IntPtr hWnd
);
2844 [DllImport ("user32.dll", EntryPoint
="GetWindowDC", CallingConvention
=CallingConvention
.StdCall
)]
2845 private extern static IntPtr
Win32GetWindowDC(IntPtr hWnd
);
2847 //[DllImport ("user32.dll", EntryPoint="GetDCEx", CallingConvention=CallingConvention.StdCall)]
2848 //private extern static IntPtr Win32GetDCEx(IntPtr hWnd, IntPtr hRgn, DCExFlags flags);
2850 [DllImport ("user32.dll", EntryPoint
="ReleaseDC", CallingConvention
=CallingConvention
.StdCall
)]
2851 private extern static IntPtr
Win32ReleaseDC(IntPtr hWnd
, IntPtr hDC
);
2853 [DllImport ("user32.dll", EntryPoint
="MessageBoxW", CharSet
=CharSet
.Unicode
, CallingConvention
=CallingConvention
.StdCall
)]
2854 private extern static IntPtr
Win32MessageBox(IntPtr hParent
, string pText
, string pCaption
, uint uType
);
2856 [DllImport ("user32.dll", EntryPoint
="InvalidateRect", CallingConvention
=CallingConvention
.StdCall
)]
2857 private extern static IntPtr
Win32InvalidateRect(IntPtr hWnd
, ref RECT lpRect
, bool bErase
);
2859 //[DllImport ("user32.dll", EntryPoint="InvalidateRect", CallingConvention=CallingConvention.StdCall)]
2860 //private extern static IntPtr Win32InvalidateRect(IntPtr hWnd, IntPtr lpRect, bool bErase);
2862 [DllImport ("user32.dll", EntryPoint
="SetCapture", CallingConvention
=CallingConvention
.StdCall
)]
2863 private extern static IntPtr
Win32SetCapture(IntPtr hWnd
);
2865 [DllImport ("user32.dll", EntryPoint
="ReleaseCapture", CallingConvention
=CallingConvention
.StdCall
)]
2866 private extern static IntPtr
Win32ReleaseCapture();
2868 [DllImport ("user32.dll", EntryPoint
="GetWindowRect", CallingConvention
=CallingConvention
.StdCall
)]
2869 private extern static IntPtr
Win32GetWindowRect(IntPtr hWnd
, out RECT rect
);
2871 [DllImport ("user32.dll", EntryPoint
="GetClientRect", CallingConvention
=CallingConvention
.StdCall
)]
2872 private extern static IntPtr
Win32GetClientRect(IntPtr hWnd
, out RECT rect
);
2874 [DllImport ("user32.dll", EntryPoint
="ScreenToClient", CallingConvention
=CallingConvention
.StdCall
)]
2875 private extern static bool Win32ScreenToClient(IntPtr hWnd
, ref POINT pt
);
2877 [DllImport ("user32.dll", EntryPoint
="ClientToScreen", CallingConvention
=CallingConvention
.StdCall
)]
2878 private extern static bool Win32ClientToScreen(IntPtr hWnd
, ref POINT pt
);
2880 [DllImport ("user32.dll", EntryPoint
="GetParent", CallingConvention
=CallingConvention
.StdCall
)]
2881 private extern static IntPtr
Win32GetParent(IntPtr hWnd
);
2883 [DllImport ("user32.dll", EntryPoint
="SetActiveWindow", CallingConvention
=CallingConvention
.StdCall
)]
2884 private extern static IntPtr
Win32SetActiveWindow(IntPtr hWnd
);
2886 [DllImport ("user32.dll", EntryPoint
="AdjustWindowRectEx", CallingConvention
=CallingConvention
.StdCall
)]
2887 private extern static bool Win32AdjustWindowRectEx(ref RECT lpRect
, int dwStyle
, bool bMenu
, int dwExStyle
);
2889 [DllImport ("user32.dll", EntryPoint
="GetCursorPos", CallingConvention
=CallingConvention
.StdCall
)]
2890 private extern static bool Win32GetCursorPos(out POINT lpPoint
);
2892 [DllImport ("user32.dll", EntryPoint
="SetCursorPos", CallingConvention
=CallingConvention
.StdCall
)]
2893 private extern static bool Win32SetCursorPos(int x
, int y
);
2895 //[DllImport ("user32.dll", EntryPoint="GetWindowPlacement", CallingConvention=CallingConvention.StdCall)]
2896 //private extern static bool Win32GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);
2898 [DllImport ("user32.dll", EntryPoint
="TrackMouseEvent", CallingConvention
=CallingConvention
.StdCall
)]
2899 private extern static bool Win32TrackMouseEvent(ref TRACKMOUSEEVENT tme
);
2901 //[DllImport ("gdi32.dll", EntryPoint="CreateBrushIndirect", CallingConvention=CallingConvention.StdCall)]
2902 //private extern static IntPtr Win32CreateBrushIndirect(ref LOGBRUSH lb);
2904 [DllImport ("gdi32.dll", EntryPoint
="CreateSolidBrush", CallingConvention
=CallingConvention
.StdCall
)]
2905 private extern static IntPtr
Win32CreateSolidBrush(COLORREF clrRef
);
2907 [DllImport ("gdi32.dll", EntryPoint
="PatBlt", CallingConvention
=CallingConvention
.StdCall
)]
2908 private extern static int Win32PatBlt(IntPtr hdc
, int nXLeft
, int nYLeft
, int nWidth
, int nHeight
, PatBltRop dwRop
);
2910 [DllImport ("user32.dll", EntryPoint
="SetWindowLong", CallingConvention
=CallingConvention
.StdCall
)]
2911 private extern static uint Win32SetWindowLong(IntPtr hwnd
, WindowLong index
, uint value);
2913 [DllImport ("user32.dll", EntryPoint
="GetWindowLong", CallingConvention
=CallingConvention
.StdCall
)]
2914 private extern static uint Win32GetWindowLong(IntPtr hwnd
, WindowLong index
);
2916 [DllImport ("user32.dll", EntryPoint
="SetLayeredWindowAttributes", CallingConvention
=CallingConvention
.StdCall
)]
2917 private extern static uint Win32SetLayeredWindowAttributes (IntPtr hwnd
, COLORREF crKey
, byte bAlpha
, LayeredWindowAttributes dwFlags
);
2919 [DllImport ("user32.dll", EntryPoint
="GetLayeredWindowAttributes", CallingConvention
=CallingConvention
.StdCall
)]
2920 private extern static uint Win32GetLayeredWindowAttributes (IntPtr hwnd
, out COLORREF pcrKey
, out byte pbAlpha
, out LayeredWindowAttributes pwdFlags
);
2922 [DllImport ("gdi32.dll", EntryPoint
="DeleteObject", CallingConvention
=CallingConvention
.StdCall
)]
2923 private extern static bool Win32DeleteObject(IntPtr o
);
2925 [DllImport ("user32.dll", EntryPoint
="GetKeyState", CallingConvention
=CallingConvention
.StdCall
)]
2926 private extern static short Win32GetKeyState(VirtualKeys nVirtKey
);
2928 [DllImport ("user32.dll", EntryPoint
="GetDesktopWindow", CallingConvention
=CallingConvention
.StdCall
)]
2929 private extern static IntPtr
Win32GetDesktopWindow();
2931 [DllImport ("user32.dll", EntryPoint
="SetTimer", CallingConvention
=CallingConvention
.StdCall
)]
2932 private extern static IntPtr
Win32SetTimer(IntPtr hwnd
, int nIDEvent
, uint uElapse
, IntPtr timerProc
);
2934 [DllImport ("user32.dll", EntryPoint
="KillTimer", CallingConvention
=CallingConvention
.StdCall
)]
2935 private extern static IntPtr
Win32KillTimer(IntPtr hwnd
, int nIDEvent
);
2937 [DllImport ("user32.dll", EntryPoint
="ShowWindow", CallingConvention
=CallingConvention
.StdCall
)]
2938 private extern static IntPtr
Win32ShowWindow(IntPtr hwnd
, WindowPlacementFlags nCmdShow
);
2940 [DllImport ("user32.dll", EntryPoint
="EnableWindow", CallingConvention
=CallingConvention
.StdCall
)]
2941 private extern static IntPtr
Win32EnableWindow(IntPtr hwnd
, bool Enabled
);
2943 [DllImport ("user32.dll", EntryPoint
="SetFocus", CallingConvention
=CallingConvention
.StdCall
)]
2944 internal extern static IntPtr
Win32SetFocus(IntPtr hwnd
);
2946 [DllImport ("user32.dll", EntryPoint
="GetFocus", CallingConvention
=CallingConvention
.StdCall
)]
2947 internal extern static IntPtr
Win32GetFocus();
2949 [DllImport ("user32.dll", EntryPoint
="CreateCaret", CallingConvention
=CallingConvention
.StdCall
)]
2950 internal extern static bool Win32CreateCaret(IntPtr hwnd
, IntPtr hBitmap
, int nWidth
, int nHeight
);
2952 [DllImport ("user32.dll", EntryPoint
="DestroyCaret", CallingConvention
=CallingConvention
.StdCall
)]
2953 private extern static bool Win32DestroyCaret();
2955 [DllImport ("user32.dll", EntryPoint
="ShowCaret", CallingConvention
=CallingConvention
.StdCall
)]
2956 private extern static bool Win32ShowCaret(IntPtr hwnd
);
2958 [DllImport ("user32.dll", EntryPoint
="HideCaret", CallingConvention
=CallingConvention
.StdCall
)]
2959 private extern static bool Win32HideCaret(IntPtr hwnd
);
2961 [DllImport ("user32.dll", EntryPoint
="SetCaretPos", CallingConvention
=CallingConvention
.StdCall
)]
2962 private extern static bool Win32SetCaretPos(int X
, int Y
);
2964 //[DllImport ("user32.dll", EntryPoint="GetCaretBlinkTime", CallingConvention=CallingConvention.StdCall)]
2965 //private extern static uint Win32GetCaretBlinkTime();
2967 [DllImport ("gdi32.dll", EntryPoint
="GetTextMetricsW", CharSet
=CharSet
.Unicode
, CallingConvention
=CallingConvention
.StdCall
)]
2968 internal extern static bool Win32GetTextMetrics(IntPtr hdc
, ref TEXTMETRIC tm
);
2970 [DllImport ("gdi32.dll", EntryPoint
="SelectObject", CallingConvention
=CallingConvention
.StdCall
)]
2971 internal extern static IntPtr
Win32SelectObject(IntPtr hdc
, IntPtr hgdiobject
);
2973 //[DllImport ("user32.dll", EntryPoint="ScrollWindowEx", CallingConvention=CallingConvention.StdCall)]
2974 //private extern static bool Win32ScrollWindowEx(IntPtr hwnd, int dx, int dy, ref RECT prcScroll, ref RECT prcClip, IntPtr hrgnUpdate, out RECT prcUpdate, ScrollWindowExFlags flags);
2976 //[DllImport ("user32.dll", EntryPoint="ScrollWindowEx", CallingConvention=CallingConvention.StdCall)]
2977 //private extern static bool Win32ScrollWindowEx(IntPtr hwnd, int dx, int dy, IntPtr prcScroll, ref RECT prcClip, IntPtr hrgnUpdate, out RECT prcUpdate, ScrollWindowExFlags flags);
2979 //[DllImport ("user32.dll", EntryPoint="ScrollWindowEx", CallingConvention=CallingConvention.StdCall)]
2980 //private extern static bool Win32ScrollWindowEx(IntPtr hwnd, int dx, int dy, ref RECT prcScroll, IntPtr prcClip, IntPtr hrgnUpdate, out RECT prcUpdate, ScrollWindowExFlags flags);
2982 [DllImport ("user32.dll", EntryPoint
="ScrollWindowEx", CallingConvention
=CallingConvention
.StdCall
)]
2983 private extern static bool Win32ScrollWindowEx(IntPtr hwnd
, int dx
, int dy
, IntPtr prcScroll
, ref RECT prcClip
, IntPtr hrgnUpdate
, IntPtr prcUpdate
, ScrollWindowExFlags flags
);
2985 //[DllImport ("user32.dll", EntryPoint="ScrollWindowEx", CallingConvention=CallingConvention.StdCall)]
2986 //private extern static bool Win32ScrollWindowEx(IntPtr hwnd, int dx, int dy, ref RECT prcScroll, IntPtr prcClip, IntPtr hrgnUpdate, IntPtr prcUpdate, ScrollWindowExFlags flags);
2988 //[DllImport ("user32.dll", EntryPoint="ScrollWindowEx", CallingConvention=CallingConvention.StdCall)]
2989 //private extern static bool Win32ScrollWindowEx(IntPtr hwnd, int dx, int dy, ref RECT prcScroll, ref RECT prcClip, IntPtr hrgnUpdate, IntPtr prcUpdate, ScrollWindowExFlags flags);
2991 [DllImport ("user32.dll", EntryPoint
="ScrollWindowEx", CallingConvention
=CallingConvention
.StdCall
)]
2992 private extern static bool Win32ScrollWindowEx(IntPtr hwnd
, int dx
, int dy
, IntPtr prcScroll
, IntPtr prcClip
, IntPtr hrgnUpdate
, IntPtr prcUpdate
, ScrollWindowExFlags flags
);
2994 [DllImport ("user32.dll", EntryPoint
="GetActiveWindow", CallingConvention
=CallingConvention
.StdCall
)]
2995 private extern static IntPtr
Win32GetActiveWindow();
2997 [DllImport ("user32.dll", EntryPoint
="GetSystemMetrics", CallingConvention
=CallingConvention
.StdCall
)]
2998 private extern static int Win32GetSystemMetrics(SystemMetrics nIndex
);
3000 [DllImport ("shell32.dll", EntryPoint
="Shell_NotifyIconW", CharSet
=CharSet
.Unicode
, CallingConvention
=CallingConvention
.StdCall
)]
3001 private extern static bool Win32Shell_NotifyIcon(NotifyIconMessage dwMessage
, ref NOTIFYICONDATA lpData
);
3003 [DllImport ("gdi32.dll", EntryPoint
="CreateRectRgn", CallingConvention
=CallingConvention
.StdCall
)]
3004 internal extern static IntPtr
Win32CreateRectRgn(int nLeftRect
, int nTopRect
, int nRightRect
, int nBottomRect
);
3006 [DllImport ("user32.dll", EntryPoint
="IsWindowEnabled", CallingConvention
=CallingConvention
.StdCall
)]
3007 private extern static bool IsWindowEnabled(IntPtr hwnd
);
3009 [DllImport ("user32.dll", EntryPoint
="IsWindowVisible", CallingConvention
=CallingConvention
.StdCall
)]
3010 private extern static bool IsWindowVisible(IntPtr hwnd
);
3012 //[DllImport ("user32.dll", EntryPoint="SetClassLong", CallingConvention=CallingConvention.StdCall)]
3013 //private extern static bool Win32SetClassLong(IntPtr hwnd, ClassLong nIndex, IntPtr dwNewLong);
3015 [DllImport ("user32.dll", EntryPoint
="SendMessageW", CharSet
=CharSet
.Unicode
, CallingConvention
=CallingConvention
.StdCall
)]
3016 private extern static IntPtr
Win32SendMessage(IntPtr hwnd
, Msg msg
, IntPtr wParam
, IntPtr lParam
);
3018 [DllImport ("user32.dll", EntryPoint
="PostMessageW", CharSet
=CharSet
.Unicode
, CallingConvention
=CallingConvention
.StdCall
)]
3019 private extern static bool Win32PostMessage(IntPtr hwnd
, Msg msg
, IntPtr wParam
, IntPtr lParam
);
3021 [DllImport ("user32.dll", EntryPoint
="SendInput", CharSet
=CharSet
.Unicode
, CallingConvention
=CallingConvention
.StdCall
)]
3022 private extern static UInt32
Win32SendInput(UInt32 nInputs
, [MarshalAs(UnmanagedType
.LPArray
)] INPUT
[] inputs
, Int32 cbSize
);
3024 [DllImport ("user32.dll", EntryPoint
="SystemParametersInfoW", CharSet
=CharSet
.Unicode
, CallingConvention
=CallingConvention
.StdCall
)]
3025 private extern static bool Win32SystemParametersInfo(SPIAction uiAction
, uint uiParam
, ref RECT rect
, uint fWinIni
);
3027 //[DllImport ("user32.dll", EntryPoint="SystemParametersInfoW", CharSet=CharSet.Unicode, CallingConvention=CallingConvention.StdCall)]
3028 //private extern static bool Win32SystemParametersInfo(SPIAction uiAction, uint uiParam, ref uint value, uint fWinIni);
3030 [DllImport ("user32.dll", EntryPoint
="SystemParametersInfoW", CharSet
=CharSet
.Unicode
, CallingConvention
=CallingConvention
.StdCall
)]
3031 private extern static bool Win32SystemParametersInfo(SPIAction uiAction
, uint uiParam
, ref int value, uint fWinIni
);
3033 [DllImport ("user32.dll", EntryPoint
="OpenClipboard", CallingConvention
=CallingConvention
.StdCall
)]
3034 private extern static bool Win32OpenClipboard(IntPtr hwnd
);
3036 [DllImport ("user32.dll", EntryPoint
="EmptyClipboard", CallingConvention
=CallingConvention
.StdCall
)]
3037 private extern static bool Win32EmptyClipboard();
3039 [DllImport ("user32.dll", EntryPoint
="RegisterClipboardFormatW", CharSet
=CharSet
.Unicode
, CallingConvention
=CallingConvention
.StdCall
)]
3040 private extern static uint Win32RegisterClipboardFormat(string format
);
3042 [DllImport ("user32.dll", EntryPoint
="CloseClipboard", CallingConvention
=CallingConvention
.StdCall
)]
3043 private extern static bool Win32CloseClipboard();
3045 [DllImport ("user32.dll", EntryPoint
="EnumClipboardFormats", CallingConvention
=CallingConvention
.StdCall
)]
3046 private extern static uint Win32EnumClipboardFormats(uint format
);
3048 [DllImport ("user32.dll", EntryPoint
="GetClipboardData", CallingConvention
=CallingConvention
.StdCall
)]
3049 private extern static IntPtr
Win32GetClipboardData(uint format
);
3051 [DllImport ("user32.dll", EntryPoint
="SetClipboardData", CallingConvention
=CallingConvention
.StdCall
)]
3052 private extern static IntPtr
Win32SetClipboardData(uint format
, IntPtr handle
);
3054 [DllImport ("kernel32.dll", EntryPoint
="GlobalAlloc", CallingConvention
=CallingConvention
.StdCall
)]
3055 internal extern static IntPtr
Win32GlobalAlloc(GAllocFlags Flags
, int dwBytes
);
3057 [DllImport ("kernel32.dll", EntryPoint
="CopyMemory", CallingConvention
=CallingConvention
.StdCall
)]
3058 internal extern static void Win32CopyMemory(IntPtr Destination
, IntPtr Source
, int length
);
3060 [DllImport ("kernel32.dll", EntryPoint
="GlobalFree", CallingConvention
=CallingConvention
.StdCall
)]
3061 internal extern static IntPtr
Win32GlobalFree(IntPtr hMem
);
3063 [DllImport ("kernel32.dll", EntryPoint
="GlobalSize", CallingConvention
=CallingConvention
.StdCall
)]
3064 internal extern static uint Win32GlobalSize(IntPtr hMem
);
3066 [DllImport ("kernel32.dll", EntryPoint
="GlobalLock", CallingConvention
=CallingConvention
.StdCall
)]
3067 internal extern static IntPtr
Win32GlobalLock(IntPtr hMem
);
3069 [DllImport ("kernel32.dll", EntryPoint
="GlobalUnlock", CallingConvention
=CallingConvention
.StdCall
)]
3070 internal extern static IntPtr
Win32GlobalUnlock(IntPtr hMem
);
3072 [DllImport ("gdi32.dll", EntryPoint
="SetROP2", CallingConvention
=CallingConvention
.StdCall
)]
3073 internal extern static int Win32SetROP2(IntPtr hdc
, ROP2DrawMode fnDrawMode
);
3075 [DllImport ("gdi32.dll", EntryPoint
="MoveToEx", CallingConvention
=CallingConvention
.StdCall
)]
3076 internal extern static bool Win32MoveToEx(IntPtr hdc
, int x
, int y
, ref POINT lpPoint
);
3078 [DllImport ("gdi32.dll", EntryPoint
="MoveToEx", CallingConvention
=CallingConvention
.StdCall
)]
3079 internal extern static bool Win32MoveToEx(IntPtr hdc
, int x
, int y
, IntPtr lpPoint
);
3081 [DllImport ("gdi32.dll", EntryPoint
="LineTo", CallingConvention
=CallingConvention
.StdCall
)]
3082 internal extern static bool Win32LineTo(IntPtr hdc
, int x
, int y
);
3084 [DllImport ("gdi32.dll", EntryPoint
="CreatePen", CallingConvention
=CallingConvention
.StdCall
)]
3085 internal extern static IntPtr
Win32CreatePen(PenStyle fnPenStyle
, int nWidth
, ref COLORREF color
);
3087 [DllImport ("gdi32.dll", EntryPoint
="CreatePen", CallingConvention
=CallingConvention
.StdCall
)]
3088 internal extern static IntPtr
Win32CreatePen(PenStyle fnPenStyle
, int nWidth
, IntPtr color
);
3090 [DllImport ("gdi32.dll", EntryPoint
="GetStockObject", CallingConvention
=CallingConvention
.StdCall
)]
3091 internal extern static IntPtr
Win32GetStockObject(StockObject fnObject
);
3093 [DllImport ("gdi32.dll", EntryPoint
="CreateHatchBrush", CallingConvention
=CallingConvention
.StdCall
)]
3094 internal extern static IntPtr
Win32CreateHatchBrush(HatchStyle fnStyle
, IntPtr color
);
3096 [DllImport ("gdi32.dll", EntryPoint
="CreateHatchBrush", CallingConvention
=CallingConvention
.StdCall
)]
3097 internal extern static IntPtr
Win32CreateHatchBrush(HatchStyle fnStyle
, ref COLORREF color
);
3099 [DllImport("gdi32.dll", EntryPoint
= "ExcludeClipRect", CallingConvention
= CallingConvention
.StdCall
)]
3100 internal extern static int Win32ExcludeClipRect (IntPtr hdc
, int left
, int top
, int right
, int bottom
);
3102 [DllImport ("gdi32.dll", EntryPoint
="ExtSelectClipRgn", CallingConvention
=CallingConvention
.StdCall
)]
3103 internal extern static int Win32ExtSelectClipRgn(IntPtr hdc
, IntPtr hrgn
, int mode
);
3105 [DllImport ("winmm.dll", EntryPoint
="PlaySoundW", CallingConvention
=CallingConvention
.StdCall
, CharSet
=CharSet
.Unicode
)]
3106 internal extern static IntPtr
Win32PlaySound(string pszSound
, IntPtr hmod
, SndFlags fdwSound
);
3108 [DllImport ("user32.dll", EntryPoint
="SetWindowRgn", CallingConvention
=CallingConvention
.StdCall
, CharSet
=CharSet
.Unicode
)]
3109 internal extern static int Win32SetWindowRgn(IntPtr hWnd
, IntPtr hRgn
, bool redraw
);
3111 [DllImport ("user32.dll", EntryPoint
="GetWindowRgn", CallingConvention
=CallingConvention
.StdCall
, CharSet
=CharSet
.Unicode
)]
3112 internal extern static IntPtr
Win32GetWindowRgn(IntPtr hWnd
, IntPtr hRgn
);
3114 [DllImport ("user32.dll", EntryPoint
="ClipCursor", CallingConvention
=CallingConvention
.StdCall
)]
3115 internal extern static bool Win32ClipCursor (ref RECT lpRect
);
3117 [DllImport ("user32.dll", EntryPoint
="GetClipCursor", CallingConvention
=CallingConvention
.StdCall
)]
3118 internal extern static bool Win32GetClipCursor (out RECT lpRect
);
3120 [DllImport ("gdi32.dll", EntryPoint
="BitBlt", CallingConvention
=CallingConvention
.StdCall
)]
3121 internal static extern bool Win32BitBlt (IntPtr hObject
, int nXDest
, int nYDest
, int nWidth
,
3122 int nHeight
, IntPtr hObjSource
, int nXSrc
, int nYSrc
, TernaryRasterOperations dwRop
);
3124 [DllImport ("gdi32.dll", EntryPoint
="CreateCompatibleDC", CallingConvention
=CallingConvention
.StdCall
, ExactSpelling
= true, SetLastError
= true)]
3125 internal static extern IntPtr
Win32CreateCompatibleDC (IntPtr hdc
);
3127 [DllImport ("gdi32.dll", EntryPoint
="DeleteDC", CallingConvention
=CallingConvention
.StdCall
, ExactSpelling
= true, SetLastError
= true)]
3128 internal static extern bool Win32DeleteDC (IntPtr hdc
);
3130 [DllImport ("gdi32.dll", EntryPoint
="CreateCompatibleBitmap", CallingConvention
=CallingConvention
.StdCall
)]
3131 internal static extern IntPtr
Win32CreateCompatibleBitmap (IntPtr hdc
, int nWidth
, int nHeight
);