parent
c17bc87196
commit
223ab7138f
@ -1,416 +1,416 @@ |
|||||||
using System; |
using System; |
||||||
using System.Collections.Generic; |
using System.Collections.Generic; |
||||||
using System.Drawing; |
using System.Drawing; |
||||||
using System.Collections; |
using System.Collections; |
||||||
using System.ComponentModel; |
using System.ComponentModel; |
||||||
using System.Windows.Forms; |
using System.Windows.Forms; |
||||||
using System.Data; |
using System.Data; |
||||||
using System.Runtime.InteropServices; |
using System.Runtime.InteropServices; |
||||||
using System.Text; |
using System.Text; |
||||||
|
|
||||||
namespace Opulos.Core.UI { |
namespace Opulos.Core.UI { |
||||||
public class AlphaColorDialog : ColorDialog { |
public class AlphaColorDialog : ColorDialog { |
||||||
|
|
||||||
///<summary>Event is fired after the color or alpha value are changed via any of the possible user-interface controls.</summary> |
///<summary>Event is fired after the color or alpha value are changed via any of the possible user-interface controls.</summary> |
||||||
public event EventHandler ColorChanged; |
public event EventHandler ColorChanged; |
||||||
|
|
||||||
private Color _color = Color.Black; // currently selected color |
private Color _color = Color.Black; // currently selected color |
||||||
private AlphaDialog dialogAlpha = null; |
private AlphaDialog dialogAlpha = null; |
||||||
private AlphaColorPanel panelAlpha = null; |
private AlphaColorPanel panelAlpha = null; |
||||||
private Button btnAlpha = new Button { Text = "Alpha" }; |
private Button btnAlpha = new Button { Text = "Alpha" }; |
||||||
private IntPtr handle = IntPtr.Zero; // handle of this ColorDialog |
private IntPtr handle = IntPtr.Zero; // handle of this ColorDialog |
||||||
private IntPtr hWndRed = IntPtr.Zero; // handles to TextBoxes |
private IntPtr hWndRed = IntPtr.Zero; // handles to TextBoxes |
||||||
private IntPtr hWndGreen = IntPtr.Zero; |
private IntPtr hWndGreen = IntPtr.Zero; |
||||||
private IntPtr hWndBlue = IntPtr.Zero; |
private IntPtr hWndBlue = IntPtr.Zero; |
||||||
|
|
||||||
public AlphaColorDialog() { |
public AlphaColorDialog() { |
||||||
btnAlpha.Click += btnAlpha_Click; |
btnAlpha.Click += btnAlpha_Click; |
||||||
} |
} |
||||||
|
|
||||||
///<summary>The handle for the ColorDialog window.</summary> |
///<summary>The handle for the ColorDialog window.</summary> |
||||||
public IntPtr Handle { |
public IntPtr Handle { |
||||||
get { |
get { |
||||||
return handle; |
return handle; |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
void btnAlpha_Click(object sender, EventArgs e) { |
void btnAlpha_Click(object sender, EventArgs e) { |
||||||
if (dialogAlpha == null) { |
if (dialogAlpha == null) { |
||||||
dialogAlpha = new AlphaDialog(this); |
dialogAlpha = new AlphaDialog(this); |
||||||
panelAlpha = new AlphaColorPanel(); |
panelAlpha = new AlphaColorPanel(); |
||||||
panelAlpha.AlphaChanged += panelAlpha_AlphaChanged; |
panelAlpha.AlphaChanged += panelAlpha_AlphaChanged; |
||||||
dialogAlpha.Controls.Add(panelAlpha); |
dialogAlpha.Controls.Add(panelAlpha); |
||||||
dialogAlpha.Text = "Alpha"; |
dialogAlpha.Text = "Alpha"; |
||||||
//dialogAlpha.StartPosition = FormStartPosition.CenterParent; // doesn't work |
//dialogAlpha.StartPosition = FormStartPosition.CenterParent; // doesn't work |
||||||
dialogAlpha.StartPosition = FormStartPosition.Manual; |
dialogAlpha.StartPosition = FormStartPosition.Manual; |
||||||
dialogAlpha.ClientSize = panelAlpha.PreferredSize; |
dialogAlpha.ClientSize = panelAlpha.PreferredSize; |
||||||
Size sz = dialogAlpha.Size; |
Size sz = dialogAlpha.Size; |
||||||
RECT r = new RECT(); |
RECT r = new RECT(); |
||||||
GetWindowRect(handle, ref r); |
GetWindowRect(handle, ref r); |
||||||
dialogAlpha.Location = new Point(r.Left + ((r.Right - r.Left) - sz.Width) / 2, r.Top + ((r.Bottom - r.Top) - sz.Height) / 2); |
dialogAlpha.Location = new Point(r.Left + ((r.Right - r.Left) - sz.Width) / 2, r.Top + ((r.Bottom - r.Top) - sz.Height) / 2); |
||||||
} |
} |
||||||
|
|
||||||
panelAlpha.Color = _color; |
panelAlpha.Color = _color; |
||||||
|
|
||||||
if (!dialogAlpha.IsHandleCreated || !dialogAlpha.Visible) { |
if (!dialogAlpha.IsHandleCreated || !dialogAlpha.Visible) { |
||||||
dialogAlpha.Visible = false; // sometimes IsHandleCreated is reset, so Visible must be reset |
dialogAlpha.Visible = false; // sometimes IsHandleCreated is reset, so Visible must be reset |
||||||
dialogAlpha.Show(new SimpleWindow { Handle = handle }); |
dialogAlpha.Show(new SimpleWindow { Handle = handle }); |
||||||
} |
} |
||||||
else { |
else { |
||||||
if (dialogAlpha.WindowState == FormWindowState.Minimized) |
if (dialogAlpha.WindowState == FormWindowState.Minimized) |
||||||
dialogAlpha.WindowState = FormWindowState.Normal; |
dialogAlpha.WindowState = FormWindowState.Normal; |
||||||
|
|
||||||
dialogAlpha.Activate(); |
dialogAlpha.Activate(); |
||||||
dialogAlpha.BringToFront(); |
dialogAlpha.BringToFront(); |
||||||
dialogAlpha.Focus(); |
dialogAlpha.Focus(); |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
void panelAlpha_AlphaChanged(object sender, EventArgs e) { |
void panelAlpha_AlphaChanged(object sender, EventArgs e) { |
||||||
SetColorInternal(panelAlpha.Color); |
SetColorInternal(panelAlpha.Color); |
||||||
} |
} |
||||||
|
|
||||||
private static String GetWindowText(IntPtr hWnd) { |
private static String GetWindowText(IntPtr hWnd) { |
||||||
StringBuilder sb = new StringBuilder(256); |
StringBuilder sb = new StringBuilder(256); |
||||||
GetWindowText(hWnd, sb, sb.Capacity); |
GetWindowText(hWnd, sb, sb.Capacity); |
||||||
return sb.ToString(); |
return sb.ToString(); |
||||||
} |
} |
||||||
|
|
||||||
private class SimpleWindow : IWin32Window { |
private class SimpleWindow : IWin32Window { |
||||||
public IntPtr Handle { get; set; } |
public IntPtr Handle { get; set; } |
||||||
} |
} |
||||||
|
|
||||||
private static Bitmap ConvertToBitmap(IntPtr hWnd) { |
private static Bitmap ConvertToBitmap(IntPtr hWnd) { |
||||||
RECT r = new RECT(); |
RECT r = new RECT(); |
||||||
GetWindowRect(hWnd, ref r); |
GetWindowRect(hWnd, ref r); |
||||||
int w = r.Right - r.Left; |
int w = r.Right - r.Left; |
||||||
int h = r.Bottom - r.Top; |
int h = r.Bottom - r.Top; |
||||||
|
|
||||||
Graphics g = Graphics.FromHwnd(hWnd); |
Graphics g = Graphics.FromHwnd(hWnd); |
||||||
Bitmap bmp = new Bitmap(w, h); |
Bitmap bmp = new Bitmap(w, h); |
||||||
Graphics g2 = Graphics.FromImage(bmp); |
Graphics g2 = Graphics.FromImage(bmp); |
||||||
IntPtr g2_hdc = g2.GetHdc(); |
IntPtr g2_hdc = g2.GetHdc(); |
||||||
IntPtr g_hdc = g.GetHdc(); |
IntPtr g_hdc = g.GetHdc(); |
||||||
BitBlt(g2_hdc, 0, 0, w, h, g_hdc, 0, 0, SRC); |
BitBlt(g2_hdc, 0, 0, w, h, g_hdc, 0, 0, SRC); |
||||||
g.ReleaseHdc(g_hdc); |
g.ReleaseHdc(g_hdc); |
||||||
g2.ReleaseHdc(g2_hdc); |
g2.ReleaseHdc(g2_hdc); |
||||||
g.Dispose(); |
g.Dispose(); |
||||||
g2.Dispose(); |
g2.Dispose(); |
||||||
|
|
||||||
return bmp; |
return bmp; |
||||||
} |
} |
||||||
|
|
||||||
private struct IJL { |
private struct IJL { |
||||||
public int i; |
public int i; |
||||||
public int j; |
public int j; |
||||||
public int len; |
public int len; |
||||||
|
|
||||||
public override String ToString() { |
public override String ToString() { |
||||||
return i + " " + j + " " + len; |
return i + " " + j + " " + len; |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
private static Color? FindSelectedColor(IntPtr hWnd) { |
private static Color? FindSelectedColor(IntPtr hWnd) { |
||||||
// This method assumes there is a bounding rectangle around a color swatch. |
// This method assumes there is a bounding rectangle around a color swatch. |
||||||
// The rectangle can be any color, but must be a single color. Since |
// The rectangle can be any color, but must be a single color. Since |
||||||
// the rectangle surrounds the swatch, it must have a run of pixels that |
// the rectangle surrounds the swatch, it must have a run of pixels that |
||||||
// is longer than the run of pixels inside the swatch. Since it is |
// is longer than the run of pixels inside the swatch. Since it is |
||||||
// a rectangle, and we are scanning from top to bottom (left to right would also work), |
// a rectangle, and we are scanning from top to bottom (left to right would also work), |
||||||
// then there must be exactly two runs that tie for longest. If two runs cannot |
// then there must be exactly two runs that tie for longest. If two runs cannot |
||||||
// be found, then there is no bounding rectangle. |
// be found, then there is no bounding rectangle. |
||||||
|
|
||||||
Bitmap bmp = ConvertToBitmap(hWnd); |
Bitmap bmp = ConvertToBitmap(hWnd); |
||||||
int w = bmp.Width; |
int w = bmp.Width; |
||||||
int h = bmp.Height; |
int h = bmp.Height; |
||||||
Color bg = bmp.GetPixel(0, 0); |
Color bg = bmp.GetPixel(0, 0); |
||||||
|
|
||||||
IJL ijl = new IJL(); |
IJL ijl = new IJL(); |
||||||
IJL ijl0 = new IJL(); |
IJL ijl0 = new IJL(); |
||||||
IJL ijl1 = new IJL(); |
IJL ijl1 = new IJL(); |
||||||
int k = 0; |
int k = 0; |
||||||
|
|
||||||
for (int i = 0; i < w; i++) { |
for (int i = 0; i < w; i++) { |
||||||
Color lastColor = Color.Empty; |
Color lastColor = Color.Empty; |
||||||
for (int j = 0; j <= h; j++) { |
for (int j = 0; j <= h; j++) { |
||||||
Color c = (j == h ? Color.Empty : bmp.GetPixel(i, j)); |
Color c = (j == h ? Color.Empty : bmp.GetPixel(i, j)); |
||||||
if (c == lastColor) { |
if (c == lastColor) { |
||||||
ijl.len++; |
ijl.len++; |
||||||
} |
} |
||||||
else { |
else { |
||||||
if (ijl.len < h) { |
if (ijl.len < h) { |
||||||
if (ijl.len > 1 && bg != lastColor) { |
if (ijl.len > 1 && bg != lastColor) { |
||||||
if (ijl.len > ijl0.len) { |
if (ijl.len > ijl0.len) { |
||||||
ijl0 = ijl; |
ijl0 = ijl; |
||||||
k = 0; |
k = 0; |
||||||
} |
} |
||||||
else if (ijl.len == ijl0.len) { |
else if (ijl.len == ijl0.len) { |
||||||
ijl1 = ijl; |
ijl1 = ijl; |
||||||
k++; |
k++; |
||||||
} |
} |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
ijl = new IJL(); |
ijl = new IJL(); |
||||||
ijl.i = i; |
ijl.i = i; |
||||||
ijl.j = j; |
ijl.j = j; |
||||||
ijl.len = 1; |
ijl.len = 1; |
||||||
lastColor = c; |
lastColor = c; |
||||||
} |
} |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
if (k != 1) { |
if (k != 1) { |
||||||
bmp.Dispose(); |
bmp.Dispose(); |
||||||
return null; |
return null; |
||||||
} |
} |
||||||
|
|
||||||
// k == 1 means there are exactly two runs of maximum length |
// k == 1 means there are exactly two runs of maximum length |
||||||
int x = ijl0.i + (ijl1.i - ijl0.i) / 2; |
int x = ijl0.i + (ijl1.i - ijl0.i) / 2; |
||||||
int y = ijl0.j + ijl0.len / 2; |
int y = ijl0.j + ijl0.len / 2; |
||||||
Color c1 = bmp.GetPixel(x, y); |
Color c1 = bmp.GetPixel(x, y); |
||||||
bmp.Dispose(); |
bmp.Dispose(); |
||||||
return c1; |
return c1; |
||||||
} |
} |
||||||
|
|
||||||
private Color GetColorInternal() { |
private Color GetColorInternal() { |
||||||
int a = (panelAlpha != null ? panelAlpha.Alpha : 255); |
int a = (panelAlpha != null ? panelAlpha.Alpha : 255); |
||||||
String _r = GetWindowText(hWndRed); |
String _r = GetWindowText(hWndRed); |
||||||
if (_r.Length > 0) { |
if (_r.Length > 0) { |
||||||
// Define Custom Colors UI is visible. |
// Define Custom Colors UI is visible. |
||||||
int r = int.Parse(_r); |
int r = int.Parse(_r); |
||||||
int g = int.Parse(GetWindowText(hWndGreen)); |
int g = int.Parse(GetWindowText(hWndGreen)); |
||||||
int b = int.Parse(GetWindowText(hWndBlue)); |
int b = int.Parse(GetWindowText(hWndBlue)); |
||||||
return Color.FromArgb(a, r, g, b); |
return Color.FromArgb(a, r, g, b); |
||||||
} |
} |
||||||
else { |
else { |
||||||
// if the RGB text boxes aren't visible, then resort to trying to find |
// if the RGB text boxes aren't visible, then resort to trying to find |
||||||
// the selected color by looking for the solid line rectangle that indicates the |
// the selected color by looking for the solid line rectangle that indicates the |
||||||
// currently selected color. |
// currently selected color. |
||||||
Color? c = FindSelectedColor(GetDlgItem(handle, 0x02d0)); // Basic colors |
Color? c = FindSelectedColor(GetDlgItem(handle, 0x02d0)); // Basic colors |
||||||
if (!c.HasValue) |
if (!c.HasValue) |
||||||
c = FindSelectedColor(GetDlgItem(handle, 0x02d1)); // Custom colors |
c = FindSelectedColor(GetDlgItem(handle, 0x02d1)); // Custom colors |
||||||
|
|
||||||
return c.HasValue ? Color.FromArgb(a, c.Value) : Color.FromArgb(a, Color.Black); |
return c.HasValue ? Color.FromArgb(a, c.Value) : Color.FromArgb(a, Color.Black); |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
private static bool AreEqual(Color c1, Color c2) { |
private static bool AreEqual(Color c1, Color c2) { |
||||||
// Color.Black != (255, 0, 0, 0) |
// Color.Black != (255, 0, 0, 0) |
||||||
return c1.A == c2.A && c1.R == c2.R && c1.G == c2.G && c1.B == c2.B; |
return c1.A == c2.A && c1.R == c2.R && c1.G == c2.G && c1.B == c2.B; |
||||||
} |
} |
||||||
|
|
||||||
private void SetColorInternal(Color c) { |
private void SetColorInternal(Color c) { |
||||||
if (AreEqual(c, _color)) |
if (AreEqual(c, _color)) |
||||||
return; |
return; |
||||||
|
|
||||||
_color = c; |
_color = c; |
||||||
if (ColorChanged != null) |
if (ColorChanged != null) |
||||||
ColorChanged(this, EventArgs.Empty); |
ColorChanged(this, EventArgs.Empty); |
||||||
} |
} |
||||||
|
|
||||||
public new Color Color { |
public new Color Color { |
||||||
get { |
get { |
||||||
return _color; |
return _color; |
||||||
} |
} |
||||||
|
|
||||||
set { |
set { |
||||||
SetColorInternal(value); |
SetColorInternal(value); |
||||||
if (panelAlpha != null) |
if (panelAlpha != null) |
||||||
panelAlpha.Alpha = value.A; |
panelAlpha.Alpha = value.A; |
||||||
|
|
||||||
base.Color = value; |
base.Color = value; |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
protected override IntPtr HookProc(IntPtr hWnd, int msg, IntPtr wparam, IntPtr lparam) { |
protected override IntPtr HookProc(IntPtr hWnd, int msg, IntPtr wparam, IntPtr lparam) { |
||||||
//System.Diagnostics.Debug.WriteLine((Opulos.Core.Win32.WM) msg); |
//System.Diagnostics.Debug.WriteLine((Opulos.Core.Win32.WM) msg); |
||||||
if (msg == WM_INITDIALOG) { |
if (msg == WM_INITDIALOG) { |
||||||
IntPtr hWndOK = GetDlgItem(hWnd, 0x1); // 0x1 == OK button |
IntPtr hWndOK = GetDlgItem(hWnd, 0x1); // 0x1 == OK button |
||||||
RECT rOK = new RECT(); |
RECT rOK = new RECT(); |
||||||
GetWindowRect(hWndOK, ref rOK); |
GetWindowRect(hWndOK, ref rOK); |
||||||
|
|
||||||
IntPtr hWndDefineCustomColors = GetDlgItem(hWnd, 0x02cf); |
IntPtr hWndDefineCustomColors = GetDlgItem(hWnd, 0x02cf); |
||||||
RECT rDefineCustomColors = new RECT(); |
RECT rDefineCustomColors = new RECT(); |
||||||
GetWindowRect(hWndDefineCustomColors, ref rDefineCustomColors); |
GetWindowRect(hWndDefineCustomColors, ref rDefineCustomColors); |
||||||
|
|
||||||
IntPtr hWndCancel = GetDlgItem(hWnd, 0x2); // 0x2 == Cancel button |
IntPtr hWndCancel = GetDlgItem(hWnd, 0x2); // 0x2 == Cancel button |
||||||
RECT rCancel = new RECT(); |
RECT rCancel = new RECT(); |
||||||
GetWindowRect(hWndCancel, ref rCancel); |
GetWindowRect(hWndCancel, ref rCancel); |
||||||
// Convert the cancel button's screen coordinates to client coordinates |
// Convert the cancel button's screen coordinates to client coordinates |
||||||
POINT pt = new POINT(); |
POINT pt = new POINT(); |
||||||
pt.X = rCancel.Right; |
pt.X = rCancel.Right; |
||||||
pt.Y = rCancel.Top; |
pt.Y = rCancel.Top; |
||||||
ScreenToClient(hWnd, ref pt); |
ScreenToClient(hWnd, ref pt); |
||||||
IntPtr hWndParent = GetParent(hWndCancel); |
IntPtr hWndParent = GetParent(hWndCancel); |
||||||
int w = rCancel.Right - rCancel.Left; |
int w = rCancel.Right - rCancel.Left; |
||||||
int h = rCancel.Bottom - rCancel.Top; |
int h = rCancel.Bottom - rCancel.Top; |
||||||
int gap = (rCancel.Left - rOK.Right); |
int gap = (rCancel.Left - rOK.Right); |
||||||
|
|
||||||
// the "Define Custom Colors >>" button is slightly less wide than the total width of the |
// the "Define Custom Colors >>" button is slightly less wide than the total width of the |
||||||
// OK, Cancel and Alpha buttons. Options: |
// OK, Cancel and Alpha buttons. Options: |
||||||
// 1) Increase the width of the define button so it right aligns with the alpha button |
// 1) Increase the width of the define button so it right aligns with the alpha button |
||||||
// 2) Make the alpha button smaller in width |
// 2) Make the alpha button smaller in width |
||||||
// 3) Decrease the widths of all three button and decrease the gap between them. |
// 3) Decrease the widths of all three button and decrease the gap between them. |
||||||
// Option 1 looks better than option 2. Didn't try option 3. |
// Option 1 looks better than option 2. Didn't try option 3. |
||||||
if (rCancel.Right + gap + w > rDefineCustomColors.Right) { // screen coordinates |
if (rCancel.Right + gap + w > rDefineCustomColors.Right) { // screen coordinates |
||||||
int diff = (rCancel.Right + gap + w) - rDefineCustomColors.Right; |
int diff = (rCancel.Right + gap + w) - rDefineCustomColors.Right; |
||||||
// Option 2: //w = w - diff; |
// Option 2: //w = w - diff; |
||||||
// Option 1: |
// Option 1: |
||||||
int w2 = rDefineCustomColors.Right - rDefineCustomColors.Left; |
int w2 = rDefineCustomColors.Right - rDefineCustomColors.Left; |
||||||
int h2 = rDefineCustomColors.Bottom - rDefineCustomColors.Top; |
int h2 = rDefineCustomColors.Bottom - rDefineCustomColors.Top; |
||||||
SetWindowPos(hWndDefineCustomColors, IntPtr.Zero, 0, 0, w2 + diff, h2, SWP_NOMOVE | SWP_NOZORDER); |
SetWindowPos(hWndDefineCustomColors, IntPtr.Zero, 0, 0, w2 + diff, h2, SWP_NOMOVE | SWP_NOZORDER); |
||||||
} |
} |
||||||
|
|
||||||
var hWndAlpha = btnAlpha.Handle; // creates the handle |
var hWndAlpha = btnAlpha.Handle; // creates the handle |
||||||
btnAlpha.Bounds = new Rectangle(pt.X + gap, pt.Y, w, h); |
btnAlpha.Bounds = new Rectangle(pt.X + gap, pt.Y, w, h); |
||||||
SetParent(hWndAlpha, hWndParent); |
SetParent(hWndAlpha, hWndParent); |
||||||
int hWndFont = SendMessage(hWndCancel, WM_GETFONT, 0, 0); |
int hWndFont = SendMessage(hWndCancel, WM_GETFONT, 0, 0); |
||||||
SendMessage(hWndAlpha, WM_SETFONT, hWndFont, 0); |
SendMessage(hWndAlpha, WM_SETFONT, hWndFont, 0); |
||||||
|
|
||||||
// Alternative way to create the Alpha button, but would have to handle the WM_NOTIFY messages for the button click events. |
// Alternative way to create the Alpha button, but would have to handle the WM_NOTIFY messages for the button click events. |
||||||
//hWndAlpha = CreateWindowEx(0, "Button", "alphabutton", WS_VISIBLE | WS_CHILD | WS_TABSTOP, pt.X + gap, pt.Y, w, h, hWndParent, 0, 0, 0); |
//hWndAlpha = CreateWindowEx(0, "Button", "alphabutton", WS_VISIBLE | WS_CHILD | WS_TABSTOP, pt.X + gap, pt.Y, w, h, hWndParent, 0, 0, 0); |
||||||
//SetWindowText(hWndAlpha, "Alpha"); |
//SetWindowText(hWndAlpha, "Alpha"); |
||||||
//int hWndFont = SendMessage(hWndCancel, WM_GETFONT, 0, 0); |
//int hWndFont = SendMessage(hWndCancel, WM_GETFONT, 0, 0); |
||||||
//SendMessage(hWndAlpha, WM_SETFONT, hWndFont, 0); |
//SendMessage(hWndAlpha, WM_SETFONT, hWndFont, 0); |
||||||
|
|
||||||
// calling ColorDialog.Color does not return the currently selected color until after the OK button |
// calling ColorDialog.Color does not return the currently selected color until after the OK button |
||||||
// is clicked. So the values from the textboxes are used. To find the controlIDs, use Spy++. |
// is clicked. So the values from the textboxes are used. To find the controlIDs, use Spy++. |
||||||
hWndRed = GetDlgItem(hWnd, 0x02c2); // red text box |
hWndRed = GetDlgItem(hWnd, 0x02c2); // red text box |
||||||
hWndGreen = GetDlgItem(hWnd, 0x02c3); |
hWndGreen = GetDlgItem(hWnd, 0x02c3); |
||||||
hWndBlue = GetDlgItem(hWnd, 0x02c4); |
hWndBlue = GetDlgItem(hWnd, 0x02c4); |
||||||
} |
} |
||||||
else if (msg == WM_SHOWWINDOW) { |
else if (msg == WM_SHOWWINDOW) { |
||||||
//center the dialog on the parent window: |
//center the dialog on the parent window: |
||||||
RECT cr = new RECT(); |
RECT cr = new RECT(); |
||||||
RECT r0 = new RECT(); |
RECT r0 = new RECT(); |
||||||
IntPtr parent = GetParent(hWnd); |
IntPtr parent = GetParent(hWnd); |
||||||
GetWindowRect(hWnd, ref r0); |
GetWindowRect(hWnd, ref r0); |
||||||
GetWindowRect(parent, ref cr); |
GetWindowRect(parent, ref cr); |
||||||
handle = hWnd; |
handle = hWnd; |
||||||
|
|
||||||
int x = cr.Left + ((cr.Right - cr.Left) - (r0.Right - r0.Left)) / 2; |
int x = cr.Left + ((cr.Right - cr.Left) - (r0.Right - r0.Left)) / 2; |
||||||
int y = cr.Top + ((cr.Bottom - cr.Top) - (r0.Bottom - r0.Top)) / 2; |
int y = cr.Top + ((cr.Bottom - cr.Top) - (r0.Bottom - r0.Top)) / 2; |
||||||
SetWindowPos(hWnd, IntPtr.Zero, x, y, 0, 0, SWP_NOZORDER | SWP_NOSIZE); |
SetWindowPos(hWnd, IntPtr.Zero, x, y, 0, 0, SWP_NOZORDER | SWP_NOSIZE); |
||||||
} |
} |
||||||
else if (msg == ACD_COLORCHANGED) { |
else if (msg == ACD_COLORCHANGED) { |
||||||
Color c = GetColorInternal(); |
Color c = GetColorInternal(); |
||||||
SetColorInternal(c); |
SetColorInternal(c); |
||||||
if (panelAlpha != null) |
if (panelAlpha != null) |
||||||
panelAlpha.Color = c; |
panelAlpha.Color = c; |
||||||
} |
} |
||||||
else if (msg == WM_COMMAND || msg == WM_CHAR || msg == WM_LBUTTONDOWN) { |
else if (msg == WM_COMMAND || msg == WM_CHAR || msg == WM_LBUTTONDOWN) { |
||||||
PostMessage(hWnd, ACD_COLORCHANGED, 0, 0); |
PostMessage(hWnd, ACD_COLORCHANGED, 0, 0); |
||||||
} |
} |
||||||
|
|
||||||
return base.HookProc(hWnd, msg, wparam, lparam); |
return base.HookProc(hWnd, msg, wparam, lparam); |
||||||
} |
} |
||||||
|
|
||||||
protected override void Dispose(bool disposing) { |
protected override void Dispose(bool disposing) { |
||||||
base.Dispose(disposing); |
base.Dispose(disposing); |
||||||
if (disposing) { |
if (disposing) { |
||||||
if (btnAlpha != null) |
if (btnAlpha != null) |
||||||
btnAlpha.Dispose(); |
btnAlpha.Dispose(); |
||||||
|
|
||||||
if (dialogAlpha != null) |
if (dialogAlpha != null) |
||||||
dialogAlpha.Dispose(); |
dialogAlpha.Dispose(); |
||||||
|
|
||||||
btnAlpha = null; |
btnAlpha = null; |
||||||
dialogAlpha = null; |
dialogAlpha = null; |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
private class AlphaDialog : Form { |
private class AlphaDialog : Form { |
||||||
|
|
||||||
AlphaColorDialog AOwner; |
AlphaColorDialog AOwner; |
||||||
public AlphaDialog(AlphaColorDialog owner) { |
public AlphaDialog(AlphaColorDialog owner) { |
||||||
AOwner = owner; |
AOwner = owner; |
||||||
ShowIcon = false; |
ShowIcon = false; |
||||||
} |
} |
||||||
|
|
||||||
protected override void OnFormClosing(FormClosingEventArgs e) { |
protected override void OnFormClosing(FormClosingEventArgs e) { |
||||||
if (e.CloseReason == CloseReason.None || e.CloseReason == CloseReason.UserClosing) { |
if (e.CloseReason == CloseReason.None || e.CloseReason == CloseReason.UserClosing) { |
||||||
e.Cancel = true; |
e.Cancel = true; |
||||||
Hide(); |
Hide(); |
||||||
SetForegroundWindow(AOwner.handle); |
SetForegroundWindow(AOwner.handle); |
||||||
} |
} |
||||||
base.OnFormClosing(e); |
base.OnFormClosing(e); |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
private struct RECT { |
private struct RECT { |
||||||
public int Left; |
public int Left; |
||||||
public int Top; |
public int Top; |
||||||
public int Right; |
public int Right; |
||||||
public int Bottom; |
public int Bottom; |
||||||
} |
} |
||||||
|
|
||||||
private struct POINT { |
private struct POINT { |
||||||
public int X; |
public int X; |
||||||
public int Y; |
public int Y; |
||||||
} |
} |
||||||
|
|
||||||
[DllImport("user32.dll")] |
[DllImport("user32.dll")] |
||||||
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); |
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); |
||||||
|
|
||||||
[DllImport("user32.dll")] |
[DllImport("user32.dll")] |
||||||
private static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect); |
private static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect); |
||||||
|
|
||||||
[DllImport("user32.dll")] |
[DllImport("user32.dll")] |
||||||
private static extern IntPtr GetParent(IntPtr hWnd); |
private static extern IntPtr GetParent(IntPtr hWnd); |
||||||
|
|
||||||
[DllImport("user32.dll")] |
[DllImport("user32.dll")] |
||||||
private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); |
private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); |
||||||
|
|
||||||
[DllImport("user32.dll")] |
[DllImport("user32.dll")] |
||||||
private static extern int PostMessage(IntPtr hWnd, int Msg, int wParam, int lParam); |
private static extern int PostMessage(IntPtr hWnd, int Msg, int wParam, int lParam); |
||||||
|
|
||||||
[DllImport("user32.dll")] |
[DllImport("user32.dll")] |
||||||
private static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem); |
private static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem); |
||||||
|
|
||||||
[DllImport("user32.dll")] |
[DllImport("user32.dll")] |
||||||
private static extern bool ScreenToClient(IntPtr hWnd, ref POINT lpPoint); |
private static extern bool ScreenToClient(IntPtr hWnd, ref POINT lpPoint); |
||||||
|
|
||||||
[DllImport("user32.dll")] |
[DllImport("user32.dll")] |
||||||
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); |
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); |
||||||
|
|
||||||
[DllImport("user32.dll")] |
[DllImport("user32.dll")] |
||||||
private static extern bool SetForegroundWindow(IntPtr hWnd); |
private static extern bool SetForegroundWindow(IntPtr hWnd); |
||||||
|
|
||||||
[DllImport("user32.dll", CharSet = CharSet.Auto)] |
[DllImport("user32.dll", CharSet = CharSet.Auto)] |
||||||
private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); |
private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); |
||||||
|
|
||||||
[DllImport("gdi32.dll", ExactSpelling=true, CharSet=CharSet.Auto, SetLastError=true)] |
[DllImport("gdi32.dll", ExactSpelling=true, CharSet=CharSet.Auto, SetLastError=true)] |
||||||
private static extern bool BitBlt(IntPtr pHdc, int iX, int iY, int iWidth, int iHeight, IntPtr pHdcSource, int iXSource, int iYSource, System.Int32 dw); |
private static extern bool BitBlt(IntPtr pHdc, int iX, int iY, int iWidth, int iHeight, IntPtr pHdcSource, int iXSource, int iYSource, System.Int32 dw); |
||||||
|
|
||||||
//[DllImport("user32.dll", CharSet = CharSet.Auto)] |
//[DllImport("user32.dll", CharSet = CharSet.Auto)] |
||||||
//private static extern IntPtr CreateWindowEx(int dwExStyle, string lpClassName, string lpWindowName, uint dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int hMenu, int hInstance, int lpParam); |
//private static extern IntPtr CreateWindowEx(int dwExStyle, string lpClassName, string lpWindowName, uint dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int hMenu, int hInstance, int lpParam); |
||||||
|
|
||||||
//[DllImport("user32.dll", CharSet = CharSet.Auto)] |
//[DllImport("user32.dll", CharSet = CharSet.Auto)] |
||||||
//private static extern bool SetWindowText(IntPtr hWnd, String lpString); |
//private static extern bool SetWindowText(IntPtr hWnd, String lpString); |
||||||
|
|
||||||
//[DllImport("user32.dll")] |
//[DllImport("user32.dll")] |
||||||
//private static extern bool DestroyWindow(IntPtr hwnd); |
//private static extern bool DestroyWindow(IntPtr hwnd); |
||||||
|
|
||||||
private const int ACD_COLORCHANGED = 0x0400; // custom message |
private const int ACD_COLORCHANGED = 0x0400; // custom message |
||||||
private const int SRC = 0xCC0020; |
private const int SRC = 0xCC0020; |
||||||
|
|
||||||
private const int SWP_NOSIZE = 0x0001; |
private const int SWP_NOSIZE = 0x0001; |
||||||
private const int SWP_NOMOVE = 0x0002; |
private const int SWP_NOMOVE = 0x0002; |
||||||
private const int SWP_NOZORDER = 0x0004; |
private const int SWP_NOZORDER = 0x0004; |
||||||
|
|
||||||
private const int WM_INITDIALOG = 0x110; |
private const int WM_INITDIALOG = 0x110; |
||||||
private const int WM_SETFONT = 0x0030; |
private const int WM_SETFONT = 0x0030; |
||||||
private const int WM_GETFONT = 0x0031; |
private const int WM_GETFONT = 0x0031; |
||||||
private const int WM_SHOWWINDOW = 0x18; |
private const int WM_SHOWWINDOW = 0x18; |
||||||
//private const int WM_NOTIFY; |
//private const int WM_NOTIFY; |
||||||
// messages that indicate a color change: |
// messages that indicate a color change: |
||||||
private const int WM_COMMAND = 0x111; |
private const int WM_COMMAND = 0x111; |
||||||
private const int WM_CHAR = 0x102; |
private const int WM_CHAR = 0x102; |
||||||
private const int WM_LBUTTONDOWN = 0x201; |
private const int WM_LBUTTONDOWN = 0x201; |
||||||
|
|
||||||
//private const uint WS_VISIBLE = 0x10000000; |
//private const uint WS_VISIBLE = 0x10000000; |
||||||
//private const uint WS_CHILD = 0x40000000; |
//private const uint WS_CHILD = 0x40000000; |
||||||
//private const uint WS_TABSTOP = 0x00010000; |
//private const uint WS_TABSTOP = 0x00010000; |
||||||
|
|
||||||
} |
} |
||||||
} |
} |
@ -1,200 +1,200 @@ |
|||||||
using System; |
using System; |
||||||
using System.Drawing; |
using System.Drawing; |
||||||
using System.Runtime.InteropServices; |
using System.Runtime.InteropServices; |
||||||
using System.Windows.Forms; |
using System.Windows.Forms; |
||||||
|
|
||||||
namespace Opulos.Core.UI { |
namespace Opulos.Core.UI { |
||||||
|
|
||||||
public class AlphaColorPanel : Panel { |
public class AlphaColorPanel : Panel { |
||||||
|
|
||||||
public event EventHandler AlphaChanged; |
public event EventHandler AlphaChanged; |
||||||
|
|
||||||
NumericUpDown nudAlpha = new NumericUpDown { AutoSize = true, Minimum = 0, Maximum = 255, DecimalPlaces = 0, Increment = 1, Value = 255, Anchor = AnchorStyles.Top }; |
NumericUpDown nudAlpha = new NumericUpDown { AutoSize = true, Minimum = 0, Maximum = 255, DecimalPlaces = 0, Increment = 1, Value = 255, Anchor = AnchorStyles.Top }; |
||||||
TrackBar trackBar = new TrackBar2 { Minimum = 0, Maximum = 255, TickFrequency = 5, TickStyle = TickStyle.None, Orientation = Orientation.Horizontal, Value = 255, Anchor = AnchorStyles.Left | AnchorStyles.Right }; |
TrackBar trackBar = new TrackBar2 { Minimum = 0, Maximum = 255, TickFrequency = 5, TickStyle = TickStyle.None, Orientation = Orientation.Horizontal, Value = 255, Anchor = AnchorStyles.Left | AnchorStyles.Right }; |
||||||
Color[] colors = new Color[] { Color.White, Color.Black, Color.Green, Color.Blue, Color.Red, Color.Yellow }; |
Color[] colors = new Color[] { Color.White, Color.Black, Color.Green, Color.Blue, Color.Red, Color.Yellow }; |
||||||
public int Cols { get; set; } |
public int Cols { get; set; } |
||||||
public int SwatchSize { get; set; } |
public int SwatchSize { get; set; } |
||||||
|
|
||||||
private Color color = Color.Empty; |
private Color color = Color.Empty; |
||||||
|
|
||||||
public AlphaColorPanel() : base() { |
public AlphaColorPanel() : base() { |
||||||
Dock = DockStyle.Fill; |
Dock = DockStyle.Fill; |
||||||
AutoSize = true; |
AutoSize = true; |
||||||
AutoSizeMode = AutoSizeMode.GrowAndShrink; |
AutoSizeMode = AutoSizeMode.GrowAndShrink; |
||||||
DoubleBuffered = true; |
DoubleBuffered = true; |
||||||
//TabStop = true; |
//TabStop = true; |
||||||
//SetStyle(ControlStyles.Selectable, true); |
//SetStyle(ControlStyles.Selectable, true); |
||||||
ResizeRedraw = true; |
ResizeRedraw = true; |
||||||
|
|
||||||
Cols = 3; |
Cols = 3; |
||||||
SwatchSize = 100; |
SwatchSize = 100; |
||||||
trackBar.ValueChanged += trackBar_ValueChanged; |
trackBar.ValueChanged += trackBar_ValueChanged; |
||||||
nudAlpha.ValueChanged += nudAlpha_ValueChanged; |
nudAlpha.ValueChanged += nudAlpha_ValueChanged; |
||||||
Alpha = 255; |
Alpha = 255; |
||||||
|
|
||||||
TableLayoutPanel p = new TableLayoutPanel { Dock = DockStyle.Bottom }; |
TableLayoutPanel p = new TableLayoutPanel { Dock = DockStyle.Bottom }; |
||||||
p.AutoSize = true; |
p.AutoSize = true; |
||||||
p.AutoSizeMode = AutoSizeMode.GrowAndShrink; |
p.AutoSizeMode = AutoSizeMode.GrowAndShrink; |
||||||
p.Controls.Add(nudAlpha, 0, 0); |
p.Controls.Add(nudAlpha, 0, 0); |
||||||
p.Controls.Add(trackBar, 1, 0); |
p.Controls.Add(trackBar, 1, 0); |
||||||
p.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); |
p.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); |
||||||
p.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 1)); |
p.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 1)); |
||||||
Controls.Add(p); |
Controls.Add(p); |
||||||
|
|
||||||
nudAlpha.KeyDown += nudAlpha_KeyDown; |
nudAlpha.KeyDown += nudAlpha_KeyDown; |
||||||
trackBar.KeyDown += trackBar_KeyDown; |
trackBar.KeyDown += trackBar_KeyDown; |
||||||
} |
} |
||||||
|
|
||||||
void trackBar_KeyDown(object sender, KeyEventArgs e) { |
void trackBar_KeyDown(object sender, KeyEventArgs e) { |
||||||
HandleKeyEvent((Control) sender, e); |
HandleKeyEvent((Control) sender, e); |
||||||
} |
} |
||||||
|
|
||||||
void nudAlpha_KeyDown(object sender, KeyEventArgs e) { |
void nudAlpha_KeyDown(object sender, KeyEventArgs e) { |
||||||
HandleKeyEvent((Control) sender, e); |
HandleKeyEvent((Control) sender, e); |
||||||
} |
} |
||||||
|
|
||||||
private void HandleKeyEvent(Control sender, KeyEventArgs e) { |
private void HandleKeyEvent(Control sender, KeyEventArgs e) { |
||||||
if (e.KeyCode == Keys.Enter) { |
if (e.KeyCode == Keys.Enter) { |
||||||
e.SuppressKeyPress = true; // stop beep |
e.SuppressKeyPress = true; // stop beep |
||||||
e.Handled = true; |
e.Handled = true; |
||||||
} |
} |
||||||
else if (e.KeyCode == Keys.Escape) { |
else if (e.KeyCode == Keys.Escape) { |
||||||
e.SuppressKeyPress = true; |
e.SuppressKeyPress = true; |
||||||
e.Handled = true; |
e.Handled = true; |
||||||
Form f = FindForm(); |
Form f = FindForm(); |
||||||
if (f != null) |
if (f != null) |
||||||
f.Close(); |
f.Close(); |
||||||
} |
} |
||||||
else if (e.KeyCode == Keys.Tab) { |
else if (e.KeyCode == Keys.Tab) { |
||||||
// seems like because the Form is displays with Show(Window) but |
// seems like because the Form is displays with Show(Window) but |
||||||
// it is not modal, that stops tabs from working correctly, so |
// it is not modal, that stops tabs from working correctly, so |
||||||
// it is handled manually: |
// it is handled manually: |
||||||
sender.Parent.SelectNextControl(sender, true, true, true, true); |
sender.Parent.SelectNextControl(sender, true, true, true, true); |
||||||
e.SuppressKeyPress = true; |
e.SuppressKeyPress = true; |
||||||
e.Handled = true; |
e.Handled = true; |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
void nudAlpha_ValueChanged(object sender, EventArgs e) { |
void nudAlpha_ValueChanged(object sender, EventArgs e) { |
||||||
trackBar.Value = Convert.ToInt32(nudAlpha.Value); |
trackBar.Value = Convert.ToInt32(nudAlpha.Value); |
||||||
} |
} |
||||||
|
|
||||||
public override Size GetPreferredSize(Size proposedSize) { |
public override Size GetPreferredSize(Size proposedSize) { |
||||||
int w = SwatchSize * Cols; |
int w = SwatchSize * Cols; |
||||||
int h = SwatchSize * (((Colors.Length - 1) / Cols) + 1); |
int h = SwatchSize * (((Colors.Length - 1) / Cols) + 1); |
||||||
h += Math.Max(trackBar.Height, nudAlpha.Height); |
h += Math.Max(trackBar.Height, nudAlpha.Height); |
||||||
return new Size(w, h); |
return new Size(w, h); |
||||||
} |
} |
||||||
|
|
||||||
public Color Color { |
public Color Color { |
||||||
get { |
get { |
||||||
return color; |
return color; |
||||||
} |
} |
||||||
set { |
set { |
||||||
var c = value; |
var c = value; |
||||||
color = Color.FromArgb(Alpha, c.R, c.G, c.B); |
color = Color.FromArgb(Alpha, c.R, c.G, c.B); |
||||||
Invalidate(); //Refresh(); |
Invalidate(); //Refresh(); |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
public int Alpha { |
public int Alpha { |
||||||
get { |
get { |
||||||
return trackBar.Value; |
return trackBar.Value; |
||||||
} |
} |
||||||
set { |
set { |
||||||
trackBar.Value = value; |
trackBar.Value = value; |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
public Color[] Colors { |
public Color[] Colors { |
||||||
get { |
get { |
||||||
return colors; |
return colors; |
||||||
} |
} |
||||||
set { |
set { |
||||||
colors = value; |
colors = value; |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
void trackBar_ValueChanged(object sender, EventArgs e) { |
void trackBar_ValueChanged(object sender, EventArgs e) { |
||||||
nudAlpha.Value = trackBar.Value; |
nudAlpha.Value = trackBar.Value; |
||||||
Color c = Color; |
Color c = Color; |
||||||
Color = Color.FromArgb(trackBar.Value, c.R, c.G, c.B); |
Color = Color.FromArgb(trackBar.Value, c.R, c.G, c.B); |
||||||
Refresh(); |
Refresh(); |
||||||
if (AlphaChanged != null) |
if (AlphaChanged != null) |
||||||
AlphaChanged(this, EventArgs.Empty); |
AlphaChanged(this, EventArgs.Empty); |
||||||
} |
} |
||||||
|
|
||||||
protected override void OnPaint(PaintEventArgs e) { |
protected override void OnPaint(PaintEventArgs e) { |
||||||
base.OnPaint(e); |
base.OnPaint(e); |
||||||
|
|
||||||
int rows = ((Colors.Length - 1) / Cols) + 1; |
int rows = ((Colors.Length - 1) / Cols) + 1; |
||||||
int r1 = Width / Cols; |
int r1 = Width / Cols; |
||||||
int r2 = Height / Cols; |
int r2 = Height / Cols; |
||||||
int r = Math.Min(r1, r2); |
int r = Math.Min(r1, r2); |
||||||
if (r < SwatchSize) |
if (r < SwatchSize) |
||||||
r = SwatchSize; |
r = SwatchSize; |
||||||
|
|
||||||
int offsetX = (Width - r * Cols) / 2; |
int offsetX = (Width - r * Cols) / 2; |
||||||
int offsetY = ((Height - Math.Max(nudAlpha.Height, trackBar.Height)) - r * rows) / 2; |
int offsetY = ((Height - Math.Max(nudAlpha.Height, trackBar.Height)) - r * rows) / 2; |
||||||
|
|
||||||
var g = e.Graphics; |
var g = e.Graphics; |
||||||
int x = 0; |
int x = 0; |
||||||
int y = 0; |
int y = 0; |
||||||
for (int i = 0, j = 1; i < colors.Length; i++, j++) { |
for (int i = 0, j = 1; i < colors.Length; i++, j++) { |
||||||
Color c = colors[i]; |
Color c = colors[i]; |
||||||
|
|
||||||
using (var b = new SolidBrush(c)) |
using (var b = new SolidBrush(c)) |
||||||
g.FillRectangle(b, x + offsetX, y + offsetY, r, r); |
g.FillRectangle(b, x + offsetX, y + offsetY, r, r); |
||||||
|
|
||||||
if (j == Cols) { |
if (j == Cols) { |
||||||
j = 0; |
j = 0; |
||||||
x = 0; |
x = 0; |
||||||
y += r; |
y += r; |
||||||
} |
} |
||||||
else { |
else { |
||||||
x += r; |
x += r; |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
using (var b = new SolidBrush(Color)) |
using (var b = new SolidBrush(Color)) |
||||||
g.FillRectangle(b, r / 2 + offsetX, r / 2 + offsetY, 2 * r, r); |
g.FillRectangle(b, r / 2 + offsetX, r / 2 + offsetY, 2 * r, r); |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
|
|
||||||
class TrackBar2 : TrackBar { |
class TrackBar2 : TrackBar { |
||||||
|
|
||||||
public TrackBar2() : base() { |
public TrackBar2() : base() { |
||||||
AutoSize = false; |
AutoSize = false; |
||||||
RECT r = GetThumbRect(this); |
RECT r = GetThumbRect(this); |
||||||
Height = r.Bottom - r.Top; |
Height = r.Bottom - r.Top; |
||||||
} |
} |
||||||
|
|
||||||
public override Size GetPreferredSize(Size proposedSize) { |
public override Size GetPreferredSize(Size proposedSize) { |
||||||
Size sz = base.GetPreferredSize(proposedSize); |
Size sz = base.GetPreferredSize(proposedSize); |
||||||
RECT r = GetThumbRect(this); |
RECT r = GetThumbRect(this); |
||||||
sz.Height = r.Bottom - r.Top; |
sz.Height = r.Bottom - r.Top; |
||||||
return sz; |
return sz; |
||||||
} |
} |
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)] |
[StructLayout(LayoutKind.Sequential)] |
||||||
private struct RECT { |
private struct RECT { |
||||||
public int Left; |
public int Left; |
||||||
public int Top; |
public int Top; |
||||||
public int Right; |
public int Right; |
||||||
public int Bottom; |
public int Bottom; |
||||||
} |
} |
||||||
|
|
||||||
[DllImport("user32.dll")] |
[DllImport("user32.dll")] |
||||||
private static extern void SendMessage(IntPtr hwnd, uint msg, IntPtr wp, ref RECT lp); |
private static extern void SendMessage(IntPtr hwnd, uint msg, IntPtr wp, ref RECT lp); |
||||||
|
|
||||||
private const uint TBM_GETTHUMBRECT = 0x419; |
private const uint TBM_GETTHUMBRECT = 0x419; |
||||||
private static RECT GetThumbRect(TrackBar trackBar) { |
private static RECT GetThumbRect(TrackBar trackBar) { |
||||||
RECT rc = new RECT(); |
RECT rc = new RECT(); |
||||||
SendMessage(trackBar.Handle, TBM_GETTHUMBRECT, IntPtr.Zero, ref rc); |
SendMessage(trackBar.Handle, TBM_GETTHUMBRECT, IntPtr.Zero, ref rc); |
||||||
return rc; |
return rc; |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
|
|
||||||
} |
} |
Loading…
Reference in new issue