I'm currently developing a software for a Smart Device, using Visual Studio 2008, C#. The device has touch screen as input method. I can't use MouseDown event. I created a custom button, inherited from System.Windows.Forms.Button class.
Trying to override OnMouseDown and OnMouseUp events. But these events are not firing. I searched internet and find a solution with WndProc but it's not able to use with .NET Compact Framework.
Please help me with that. Thanks all. Example code is very simple and you can find it below.
protected override void OnMouseUp(MouseEventArgs e)
{
Text = "Mouse Up";
base.OnMouseUp(e);
}
Edit:
As i mentioned at my comment to @josef below, i created my custom control. The control is a butonated panel. First, i tried to add a Label for button text, actually no need to do this. It could be done easily at override method of OnPaint event. This control might have some unnecessary codes, but you can optimize it. If you need it, you can find my solution below:
class ButonatedPanel : Panel
{
public int ShadeWidth { get; set; }
public bool isMouseDown { get; set; }
protected override void OnMouseDown(MouseEventArgs e)
{
Invalidate();
isMouseDown = true;
Text = "Mouse Down";
base.OnMouseDown(e);
}
protected override void OnMouseUp(MouseEventArgs e)
{
Invalidate();
isMouseDown = false;
Text = "Mouse Up";
base.OnMouseUp(e);
}
public override string Text
{
get
{
return Lb.Text;
}
set
{
Lb.Text = value;
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Lb.Size = new Size(Width - ShadeWidth * 2, Height - 2 * ShadeWidth);
Lb.Location = new Point(ShadeWidth, ShadeWidth);
SizeF iSizeF = new SizeF(e.Graphics.MeasureString(Text, Lb.Font).Width,
e.Graphics.MeasureString(Text, Lb.Font).Height);
e.Graphics.DrawString(Text, Lb.Font, new SolidBrush(Color.FromArgb(0, 0, 0)),
(Width - 2 * ShadeWidth - iSizeF.Width) / 2, (Height - 2 * ShadeWidth - iSizeF.Height) / 2);
//gray 128,128,128
Rectangle Rect1 = new Rectangle(0, 0, ShadeWidth, Height - ShadeWidth);
Rectangle Rect2 = new Rectangle(0, 0, Width - ShadeWidth, ShadeWidth);
Rectangle Rect3 = new Rectangle(Width - 2 * ShadeWidth, 0, ShadeWidth, Height - ShadeWidth);
Rectangle Rect4 = new Rectangle(0, Height - 2 * ShadeWidth, Width - ShadeWidth, ShadeWidth);
//white 228,228,228
Rectangle Rect5 = new Rectangle(ShadeWidth, ShadeWidth, ShadeWidth, Height - 4 * ShadeWidth);
Rectangle Rect6 = new Rectangle(ShadeWidth, ShadeWidth, Width - 4 * ShadeWidth, ShadeWidth);
//black 0,0,0
Rectangle Rect7 = new Rectangle(Width - ShadeWidth, 0, ShadeWidth, Height);
Rectangle Rect8 = new Rectangle(0, Height - ShadeWidth, Width, ShadeWidth);
if (!isMouseDown)
{
e.Graphics.DrawRectangle(new Pen(Color.FromArgb(128, 128, 128)), Rect1);
e.Graphics.DrawRectangle(new Pen(Color.FromArgb(128, 128, 128)), Rect2);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128, 128, 128)), Rect1);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128, 128, 128)), Rect2);
e.Graphics.DrawRectangle(new Pen(Color.FromArgb(128, 128, 128)), Rect3);
e.Graphics.DrawRectangle(new Pen(Color.FromArgb(128, 128, 128)), Rect4);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128, 128, 128)), Rect3);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128, 128, 128)), Rect4);
e.Graphics.DrawRectangle(new Pen(Color.FromArgb(228, 228, 228)), Rect5);
e.Graphics.DrawRectangle(new Pen(Color.FromArgb(228, 228, 228)), Rect6);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(228, 228, 228)), Rect5);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(228, 228, 228)), Rect6);
e.Graphics.DrawRectangle(new Pen(Color.FromArgb(0, 0, 0)), Rect7);
e.Graphics.DrawRectangle(new Pen(Color.FromArgb(0, 0, 0)), Rect8);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0, 0, 0)), Rect7);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0, 0, 0)), Rect8);
}
else
{
e.Graphics.DrawRectangle(new Pen(Color.FromArgb(0, 0, 0)), Rect1);
e.Graphics.DrawRectangle(new Pen(Color.FromArgb(0, 0, 0)), Rect2);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0, 0, 0)), Rect1);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0, 0, 0)), Rect2);
e.Graphics.DrawRectangle(new Pen(Color.FromArgb(228, 228, 228)), Rect3);
e.Graphics.DrawRectangle(new Pen(Color.FromArgb(228, 228, 228)), Rect4);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(228, 228, 228)), Rect3);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(228, 228, 228)), Rect4);
e.Graphics.DrawRectangle(new Pen(Color.FromArgb(128, 128, 128)), Rect5);
e.Graphics.DrawRectangle(new Pen(Color.FromArgb(128, 128, 128)), Rect6);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128, 128, 128)), Rect5);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128, 128, 128)), Rect6);
e.Graphics.DrawRectangle(new Pen(Color.FromArgb(128, 128, 128)), Rect7);
e.Graphics.DrawRectangle(new Pen(Color.FromArgb(128, 128, 128)), Rect8);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128, 128, 128)), Rect7);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128, 128, 128)), Rect8);
}
}
Label Lb = new Label();
public ButonatedPanel()
: base()
{
Invalidate();
ShadeWidth = 1;
Lb.Size = new Size(Width - ShadeWidth * 2, Height - 2 * ShadeWidth);
Lb.Location = new Point(ShadeWidth, ShadeWidth);
Lb.Visible = false;
Controls.Add(Lb);
}
I used to build Wince application (CF 3.5) which required the application to capture custom event, like RFID card reading event. The concept is the same, which is to get the control handle, use SetWindowLong to enable the focused control to get the message via event triggered. Just remember to undo the attribute changing you did to the control. * I mainly used it on Windows Form, but it should work for Panel control.