struct Win32
2 {
3 public const string TOOLBARCLASSNAME = "ToolbarWindow32";
4
5 public const int WS_CHILD = 0x40000000;
6 public const int WS_VISIBLE = 0x10000000;
7 public const int WS_CLIPCHILDREN = 0x2000000;
8 public const int WS_CLIPSIBLINGS = 0x4000000;
9 public const int WS_BORDER = 0x800000;
10
11 public const int CCS_NODIVIDER = 0x40;
12 public const int CCS_NORESIZE = 0x4;
13 public const int CCS_NOPARENTALIGN = 0x8;
14
15 public const int I_IMAGECALLBACK = -1;
16 public const int I_IMAGENONE = -2;
17
18 public const int TBSTYLE_TOOLTIPS = 0x100;
19 public const int TBSTYLE_FLAT = 0x800;
20 public const int TBSTYLE_LIST = 0x1000;
21 public const int TBSTYLE_TRANSPARENT = 0x8000;
22
23 public const int TBSTYLE_EX_DRAWDDARROWS = 0x1;
24 public const int TBSTYLE_EX_HIDECLIPPEDBUTTONS = 0x10;
25 public const int TBSTYLE_EX_DOUBLEBUFFER = 0x80;
26
27 public const int CDRF_DODEFAULT = 0x0;
28 public const int CDRF_SKIPDEFAULT = 0x4;
29 public const int CDRF_NOTIFYITEMDRAW = 0x20;
30 public const int CDDS_PREPAINT = 0x1;
31 public const int CDDS_ITEM = 0x10000;
32 public const int CDDS_ITEMPREPAINT = CDDS_ITEM | CDDS_PREPAINT;
33
34 public const int CDIS_HOT = 0x40;
35 public const int CDIS_SELECTED = 0x1;
36 public const int CDIS_DISABLED = 0x4;
37
38 public const int WM_SETREDRAW = 0x000B;
39 public const int WM_CANCELMODE = 0x001F;
40 public const int WM_NOTIFY = 0x4e;
41 public const int WM_KEYDOWN = 0x100;
42 public const int WM_KEYUP = 0x101;
43 public const int WM_CHAR = 0x0102;
44 public const int WM_SYSKEYDOWN = 0x104;
45 public const int WM_SYSKEYUP = 0x105;
46 public const int WM_COMMAND = 0x111;
47 public const int WM_MENUCHAR = 0x120;
48 public const int WM_MOUSEMOVE = 0x200;
49 public const int WM_LBUTTONDOWN = 0x201;
50 public const int WM_MOUSELAST = 0x20a;
51 public const int WM_USER = 0x0400;
52 public const int WM_REFLECT = WM_USER + 0x1c00;
53
54 public const int NM_CUSTOMDRAW = -12;
55
56 public const int TTN_NEEDTEXTA = ((0-520)-0);
57 public const int TTN_NEEDTEXTW = ((0-520)-10);
58
59 public const int TBN_QUERYINSERT = ((0-700)-6);
60 public const int TBN_DROPDOWN = ((0-700)-10);
61 public const int TBN_HOTITEMCHANGE = ((0 - 700) - 13);
62
63 public const int TBIF_IMAGE = 0x1;
64 public const int TBIF_TEXT = 0x2;
65 public const int TBIF_STATE = 0x4;
66 public const int TBIF_STYLE = 0x8;
67 public const int TBIF_COMMAND = 0x20;
68
69 public const int MNC_EXECUTE = 2;
70
71 [StructLayout(LayoutKind.Sequential, Pack = 1)]
72 public class INITCOMMONCONTROLSEX
73 {
74 public int dwSize = 8;
75 public int dwICC;
76 }
77
78 public const int ICC_BAR_CLASSES = 4;
79 public const int ICC_COOL_CLASSES = 0x400;
80
81 [DllImport("comctl32.dll")]
82 public static extern bool InitCommonControlsEx(INITCOMMONCONTROLSEX icc);
83
84 [StructLayout(LayoutKind.Sequential)]
85 public struct POINT
86 {
87 public int x;
88 public int y;
89 }
90
91 [StructLayout(LayoutKind.Sequential)]
92 public struct RECT
93 {
94 public int left;
95 public int top;
96 public int right;
97 public int bottom;
98 }
99
100 [StructLayout(LayoutKind.Sequential)]
101 public struct NMHDR
102 {
103 public IntPtr hwndFrom;
104 public int idFrom;
105 public int code;
106 }
107
108 [StructLayout(LayoutKind.Sequential)]
109 public struct NMTOOLBAR
110 {
111 public NMHDR hdr;
112 public int iItem;
113 public TBBUTTON tbButton;
114 public int cchText;
115 public IntPtr pszText;
116 }
117
118 [StructLayout(LayoutKind.Sequential)]
119 public struct NMCUSTOMDRAW
120 {
121 public NMHDR hdr;
122 public int dwDrawStage;
123 public IntPtr hdc;
124 public RECT rc;
125 public int dwItemSpec;
126 public int uItemState;
127 public int lItemlParam;
128 }
129
130 [StructLayout(LayoutKind.Sequential)]
131 public struct LPNMTBCUSTOMDRAW
132 {
133 public NMCUSTOMDRAW nmcd;
134 public IntPtr hbrMonoDither;
135 public IntPtr hbrLines;
136 public IntPtr hpenLines;
137 public int clrText;
138 public int clrMark;
139 public int clrTextHighlight;
140 public int clrBtnFace;
141 public int clrBtnHighlight;
142 public int clrHighlightHotTrack;
143 public RECT rcText;
144 public int nStringBkMode;
145 public int nHLStringBkMode;
146 }
147
148 public const int TTF_RTLREADING = 0x0004;
149
150 [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
151 public struct TOOLTIPTEXT
152 {
153 public NMHDR hdr;
154 public IntPtr lpszText;
155 [MarshalAs(UnmanagedType.ByValTStr, SizeConst=80)]
156 public string szText;
157 public IntPtr hinst;
158 public int uFlags;
159 }
160
161 [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
162 public struct TOOLTIPTEXTA
163 {
164 public NMHDR hdr;
165 public IntPtr lpszText;
166 [MarshalAs(UnmanagedType.ByValTStr, SizeConst=80)]
167 public string szText;
168 public IntPtr hinst;
169 public int uFlags;
170 }
171
172 public const int TB_PRESSBUTTON = WM_USER + 3;
173 public const int TB_INSERTBUTTON = WM_USER + 21;
174 public const int TB_BUTTONCOUNT = WM_USER + 24;
175 public const int TB_GETITEMRECT = WM_USER + 29;
176 public const int TB_BUTTONSTRUCTSIZE = WM_USER + 30;
177 public const int TB_SETBUTTONSIZE = WM_USER + 32;
178 public const int TB_SETIMAGELIST = WM_USER + 48;
179 public const int TB_GETRECT = WM_USER + 51;
180 public const int TB_SETBUTTONINFO = WM_USER + 64;
181 public const int TB_HITTEST = WM_USER +69;
182 public const int TB_GETHOTITEM = WM_USER + 71;
183 public const int TB_SETHOTITEM = WM_USER + 72;
184 public const int TB_SETEXTENDEDSTYLE = WM_USER + 84;
185
186 public const int TBSTATE_CHECKED = 0x01;
187 public const int TBSTATE_ENABLED = 0x04;
188 public const int TBSTATE_HIDDEN = 0x08;
189
190 public const int BTNS_BUTTON = 0;
191 public const int BTNS_SEP = 0x1;
192 public const int BTNS_DROPDOWN = 0x8;
193 public const int BTNS_AUTOSIZE = 0x10;
194 public const int BTNS_WHOLEDROPDOWN = 0x80;
195
196 [StructLayout(LayoutKind.Sequential, Pack=1)]
197 public struct TBBUTTON
198 {
199 public int iBitmap;
200 public int idCommand;
201 public byte fsState;
202 public byte fsStyle;
203 public byte bReserved0;
204 public byte bReserved1;
205 public int dwData;
206 public int iString;
207 }
208
209 [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
210 public struct TBBUTTONINFO
211 {
212 public int cbSize;
213 public int dwMask;
214 public int idCommand;
215 public int iImage;
216 public byte fsState;
217 public byte fsStyle;
218 public short cx;
219 public IntPtr lParam;
220 public IntPtr pszText;
221 public int cchText;
222 }
223
224 [DllImport("user32.dll", ExactSpelling=true, CharSet=CharSet.Auto)]
225 public static extern IntPtr GetParent(IntPtr hWnd);
226
227 [DllImport("user32.dll", CharSet=CharSet.Auto)]
228 public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
229
230 [DllImport("user32.dll", CharSet=CharSet.Auto)]
231 public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam);
232
233 [DllImport("user32.dll", CharSet=CharSet.Auto)]
234 public static extern void SendMessage(IntPtr hWnd, int msg, int wParam, ref RECT lParam);
235
236 [DllImport("user32.dll", CharSet=CharSet.Auto)]
237 public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, ref POINT lParam);
238
239 [DllImport("user32.dll", CharSet=CharSet.Auto)]
240 public static extern void SendMessage(IntPtr hWnd, int msg, int wParam, ref TBBUTTON lParam);
241
242 [DllImport("user32.dll", CharSet=CharSet.Auto)]
243 public static extern void SendMessage(IntPtr hWnd, int msg, int wParam, ref TBBUTTONINFO lParam);
244
245 [DllImport("user32.dll", CharSet=CharSet.Auto)]
246 public static extern void SendMessage(IntPtr hWnd, int msg, int wParam, ref REBARBANDINFO lParam);
247
248 [DllImport("user32.dll", CharSet=CharSet.Auto)]
249 public static extern IntPtr PostMessage(IntPtr hWnd, int msg, int wParam, int lParam);
250
251 [DllImport("kernel32.dll", ExactSpelling=true, CharSet=CharSet.Auto)]
252 public static extern int GetCurrentThreadId();
253
254 public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
255
256 public const int WH_MSGFILTER = -1;
257 public const int MSGF_MENU = 2;
258
259 [DllImport("user32.dll", CharSet=CharSet.Auto)]
260 public static extern IntPtr SetWindowsHookEx(int hookid, HookProc pfnhook, IntPtr hinst, int threadid);
261
262 [DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
263 public static extern bool UnhookWindowsHookEx(IntPtr hhook);
264
265 [DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
266 public static extern IntPtr CallNextHookEx(IntPtr hhook, int code, IntPtr wparam, IntPtr lparam);
267
268 [StructLayout(LayoutKind.Sequential)]
269 public struct MSG
270 {
271 public IntPtr hwnd;
272 public int message;
273 public IntPtr wParam;
274 public IntPtr lParam;
275 public int time;
276 public int pt_x;
277 public int pt_y;
278 }
279
280 public const string REBARCLASSNAME = "ReBarWindow32";
281
282 public const int RBS_VARHEIGHT = 0x200;
283 public const int RBS_BANDBORDERS = 0x400;
284 public const int RBS_AUTOSIZE = 0x2000;
285
286 public const int RBN_FIRST = -831;
287 public const int RBN_HEIGHTCHANGE = RBN_FIRST - 0;
288 public const int RBN_AUTOSIZE = RBN_FIRST - 3;
289 public const int RBN_CHEVRONPUSHED = RBN_FIRST - 10;
290
291 public const int RB_SETBANDINFO = WM_USER + 6;
292 public const int RB_GETRECT = WM_USER + 9;
293 public const int RB_INSERTBAND = WM_USER + 10;
294 public const int RB_GETBARHEIGHT = WM_USER + 27;
295
296 [StructLayout(LayoutKind.Sequential)]
297 public struct REBARBANDINFO
298 {
299 public int cbSize;
300 public int fMask;
301 public int fStyle;
302 public int clrFore;
303 public int clrBack;
304 public IntPtr lpText;
305 public int cch;
306 public int iImage;
307 public IntPtr hwndChild;
308 public int cxMinChild;
309 public int cyMinChild;
310 public int cx;
311 public IntPtr hbmBack;
312 public int wID;
313 public int cyChild;
314 public int cyMaxChild;
315 public int cyIntegral;
316 public int cxIdeal;
317 public int lParam;
318 public int cxHeader;
319 }
320
321 public const int RBBIM_CHILD = 0x10;
322 public const int RBBIM_CHILDSIZE = 0x20;
323 public const int RBBIM_STYLE = 0x1;
324 public const int RBBIM_ID = 0x100;
325 public const int RBBIM_SIZE = 0x40;
326 public const int RBBIM_IDEALSIZE = 0x200;
327 public const int RBBIM_TEXT = 0x4;
328
329 public const int RBBS_BREAK = 0x1;
330 public const int RBBS_CHILDEDGE = 0x4;
331 public const int RBBS_FIXEDBMP = 0x20;
332 public const int RBBS_GRIPPERALWAYS = 0x80;
333 public const int RBBS_USECHEVRON = 0x200;
334
335 [StructLayout(LayoutKind.Sequential)]
336 public struct NMREBARCHEVRON
337 {
338 public NMHDR hdr;
339 public int uBand;
340 public int wID;
341 public int lParam;
342 public RECT rc;
343 public int lParamNM;
344 }
345
346 [StructLayout(LayoutKind.Sequential)]
347 public struct IMAGELISTDRAWPARAMS
348 {
349 public int cbSize;
350 public IntPtr himl;
351 public int i;
352 public IntPtr hdcDst;
353 public int x;
354 public int y;
355 public int cx;
356 public int cy;
357 public int xBitmap;
358 public int yBitmap;
359 public int rgbBk;
360 public int rgbFg;
361 public int fStyle;
362 public int dwRop;
363 public int fState;
364 public int Frame;
365 public int crEffect;
366 }
367
368 public const int ILD_TRANSPARENT = 0x1;
369 public const int ILS_SATURATE = 0x4;
370
371 [DllImport("comctl32.dll", CharSet=CharSet.Auto)]
372 public static extern bool ImageList_DrawIndirect(ref IMAGELISTDRAWPARAMS pimldp);
373
374 [StructLayout(LayoutKind.Sequential)]
375 public struct DLLVERSIONINFO
376 {
377 public int cbSize;
378 public int dwMajorVersion;
379 public int dwMinorVersion;
380 public int dwBuildNumber;
381 public int dwPlatformID;
382 }
383
384 [DllImport("comctl32.dll")]
385 public extern static int DllGetVersion(ref DLLVERSIONINFO dvi);
386
387 public const int SPI_GETFLATMENU = 0x1022;
388
389 [DllImport("user32.dll", CharSet=CharSet.Auto)]
390 public extern static int SystemParametersInfo(int nAction, int nParam, ref int value, int ignore);
391
392 public const int DT_SINGLELINE = 0x20;
393 public const int DT_LEFT = 0x0;
394 public const int DT_VCENTER = 0x4;
395 public const int DT_CALCRECT = 0x400;
396
397 [DllImport("user32.dll")]
398 public extern static int DrawText(IntPtr hdc, string lpString, int nCount, ref RECT lpRect, int uFormat);
399
400 public const int TRANSPARENT = 1;
401
402 [DllImport("gdi32.dll")]
403 public extern static int SetBkMode(IntPtr hdc, int iBkMode);
404
405 [DllImport("gdi32.dll")]
406 public extern static int SetTextColor(IntPtr hdc, int crColor);
407
408 [DllImport("gdi32.dll")]
409 public extern static IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
410
411 [DllImport("gdi32.dll", ExactSpelling=true, CharSet=CharSet.Auto)]
412 public static extern bool DeleteObject(IntPtr hObject);
413
414 [DllImport("user32.dll", ExactSpelling=true, CharSet=CharSet.Auto)]
415 public static extern bool MessageBeep(int type);
416
417 public class TextHelper
418 {
419 public static Size GetTextSize(Graphics graphics, string text, Font font)
420 {
421 IntPtr hdc = graphics.GetHdc();
422 IntPtr fontHandle = font.ToHfont();
423 IntPtr currentFontHandle = Win32.SelectObject(hdc, fontHandle);
424
425 Win32.RECT rect = new Win32.RECT();
426 rect.left = 0;
427 rect.right = 0;
428 rect.top = 0;
429 rect.bottom = 0;
430
431 Win32.DrawText(hdc, text, text.Length, ref rect, Win32.DT_SINGLELINE | Win32.DT_LEFT | Win32.DT_CALCRECT);
432
433 Win32.SelectObject(hdc, currentFontHandle);
434 Win32.DeleteObject(fontHandle);
435 graphics.ReleaseHdc(hdc);
436
437 return new Size(rect.right - rect.left, rect.bottom - rect.top);
438 }
439
440 public static void DrawText(Graphics graphics, string text, Point point, Font font, Color color)
441 {
442 Size size = GetTextSize(graphics, text, font);
443
444 IntPtr hdc = graphics.GetHdc();
445 IntPtr fontHandle = font.ToHfont();
446 IntPtr currentFontHandle = Win32.SelectObject(hdc, fontHandle);
447
448 int currentBkMode = Win32.SetBkMode(hdc, Win32.TRANSPARENT);
449 int currentCrColor = Win32.SetTextColor(hdc, Color.FromArgb(0, color.R, color.G, color.B).ToArgb());
450
451 Win32.RECT rc = new Win32.RECT();
452 rc.left = point.X;
453 rc.top = point.Y;
454 rc.right = rc.left + size.Width;
455 rc.bottom = rc.top + size.Height;
456
457 Win32.DrawText(hdc, text, text.Length, ref rc, Win32.DT_SINGLELINE | Win32.DT_LEFT);
458
459 Win32.SetTextColor(hdc, currentCrColor);
460 Win32.SetBkMode(hdc, currentBkMode);
461
462360docimg_501_ Win32.SelectObject(hdc, currentFontHandle);
463360docimg_502_ Win32.DeleteObject(fontHandle);
464360docimg_503_ graphics.ReleaseHdc(hdc);
465360docimg_504_ }
466360docimg_505_ }
467360docimg_506_
468360docimg_507_ public class ImageHelper
469360docimg_508_360docimg_509_ 360docimg_510_{
470360docimg_511_ static Version version = null;
471360docimg_512_
472360docimg_513_ static ImageHelper()
473360docimg_514_360docimg_515_ 360docimg_516_{
474360docimg_517_ Win32.DLLVERSIONINFO dvi = new Win32.DLLVERSIONINFO();
475360docimg_518_ dvi.cbSize = Marshal.SizeOf(typeof(Win32.DLLVERSIONINFO));
476360docimg_519_ Win32.DllGetVersion(ref dvi);
477360docimg_520_ version = new Version(dvi.dwMajorVersion, dvi.dwMinorVersion, dvi.dwBuildNumber, 0);
478360docimg_521_ }
479360docimg_522_
480360docimg_523_ public static Version Version
481360docimg_524_360docimg_525_ 360docimg_526_{
482360docimg_527_360docimg_528_ get 360docimg_529_{ return version; }
483360docimg_530_ }
484360docimg_531_
485360docimg_532_ public static void DrawImage(Graphics graphics, Image image, Point point, bool disabled)
486360docimg_533_360docimg_534_ 360docimg_535_{
487360docimg_536_ if (!disabled)
488360docimg_537_360docimg_538_ 360docimg_539_{
489360docimg_540_ graphics.DrawImage(image, point);
490360docimg_541_ return;
491360docimg_542_ }
492360docimg_543_
493360docimg_544_ // Painting a disabled gray scale image is done using ILS_SATURATE on WinXP.
494360docimg_545_ // This code emulates that behaviour if comctl32 version 6 is not availble.
495360docimg_546_ if (version.Major < 6)
496360docimg_547_360docimg_548_ 360docimg_549_{
497360docimg_550_ ImageAttributes attributes = new ImageAttributes();
498360docimg_551_ Rectangle destination = new Rectangle(point, image.Size);
499360docimg_552_ float[][] matrix = new float[5][];
500360docimg_553_360docimg_554_ matrix[0] = new float[] 360docimg_555_{ 0.2222f, 0.2222f, 0.2222f, 0.0000f, 0.0000f };
501360docimg_556_360docimg_557_ matrix[1] = new float[] 360docimg_558_{ 0.2222f, 0.2222f, 0.2222f, 0.0000f, 0.0000f };
502360docimg_559_360docimg_560_ matrix[2] = new float[] 360docimg_561_{ 0.2222f, 0.2222f, 0.2222f, 0.0000f, 0.0000f };
503360docimg_562_360docimg_563_ matrix[3] = new float[] 360docimg_564_{ 0.3333f, 0.3333f, 0.3333f, 0.7500f, 0.0000f };
504360docimg_565_360docimg_566_ matrix[4] = new float[] 360docimg_567_{ 0.0000f, 0.0000f, 0.0000f, 0.0000f, 1.0000f };
505360docimg_568_ attributes.SetColorMatrix(new ColorMatrix(matrix));
506360docimg_569_ graphics.DrawImage(image, destination, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attributes);
507360docimg_570_ }
508360docimg_571_ else
509360docimg_572_360docimg_573_ 360docimg_574_{
510360docimg_575_ ImageList imageList = new ImageList();
511360docimg_576_ imageList.ImageSize = image.Size;
512360docimg_577_ imageList.ColorDepth = ColorDepth.Depth32Bit;
513360docimg_578_ imageList.Images.Add(image);
514360docimg_579_
515360docimg_580_ IntPtr hdc = graphics.GetHdc();
516360docimg_581_ Win32.IMAGELISTDRAWPARAMS ildp = new Win32.IMAGELISTDRAWPARAMS();
517360docimg_582_ ildp.cbSize = Marshal.SizeOf(typeof(Win32.IMAGELISTDRAWPARAMS));
518360docimg_583_ ildp.himl = imageList.Handle;
519360docimg_584_ ildp.i = 0; // image index
520360docimg_585_ ildp.hdcDst = hdc;
521360docimg_586_ ildp.x = point.X;
522360docimg_587_ ildp.y = point.Y;
523360docimg_588_ ildp.cx = 0;
524360docimg_589_ ildp.cy = 0;
525360docimg_590_ ildp.xBitmap = 0;
526360docimg_591_ ildp.yBitmap = 0;
527360docimg_592_ ildp.fStyle = Win32.ILD_TRANSPARENT;
528360docimg_593_ ildp.fState = Win32.ILS_SATURATE;
529360docimg_594_ ildp.Frame = -100;
530360docimg_595_ Win32.ImageList_DrawIndirect(ref ildp);
531360docimg_596_ graphics.ReleaseHdc(hdc);
532360docimg_597_ return;
533360docimg_598_ }
534360docimg_599_ }
535360docimg_600_ }
536360docimg_601_ }