Missing Paint Messages

D

Duncan Mole

###This is a repost from a not so lively forum!#####
Hi,

I have created a control which draws a title bar and provides a drop down
menu for a Smart Device Application. It seemed to work fine until I came to
add an event handler to act on Paint messages in the form which has drawn
the control. Evidently, the control is consuming all of these messages. How
can I pass them back/on? I have a reference to the owner form but calling
Refresh() via this reference isn't helping. Help! Do I need to do something
with Invoke? Its late and my brain hurts!

Code posted below:

Control code:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Threading;
using System.IO;

namespace Testing
{
/// <summary>
/// Summary description for TachoMenu.
/// </summary>
public class TachoMenu : System.Windows.Forms.Control
{
private System.Windows.Forms.Panel pnlTitleBar;
private System.Windows.Forms.Label lblTitle;
private System.Windows.Forms.Button btnDropDown;
private System.Windows.Forms.Panel pnlDropDown;
private System.Windows.Forms.Button btnDrive;
private System.Windows.Forms.Button btnRest;
private System.Windows.Forms.Button btnBreak;
private System.Windows.Forms.Button btnOnDuty;
private System.ComponentModel.Container components = null;

private Form clientForm;

private static WriteDelay writeDelay = new WriteDelay();
private static TachoState currentState =
TachoMenu.TachoState.None;

public enum TachoState
{
None,
Break,
Drive,
OnDuty,
Rest
}

public TachoMenu()
{
InitializeComponent();
}

protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint (e);
}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

public void AddMenuToForm(Form clientForm)
{
this.clientForm = clientForm;
this.Visible = true;
clientForm.ControlBox = false;
clientForm.Width = MyApp.SCREEN_WIDTH;
clientForm.Height = MyApp.SCREEN_HEIGHT;
clientForm.FormBorderStyle = FormBorderStyle.None;
clientForm.Controls.Add(this);
return;
}

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.pnlTitleBar = new System.Windows.Forms.Panel();
this.btnDropDown = new System.Windows.Forms.Button();
this.lblTitle = new System.Windows.Forms.Label();
this.pnlDropDown = new System.Windows.Forms.Panel();
this.btnOnDuty = new System.Windows.Forms.Button();
this.btnBreak = new System.Windows.Forms.Button();
this.btnRest = new System.Windows.Forms.Button();
this.btnDrive = new System.Windows.Forms.Button();
//
// pnlTitleBar
//
this.pnlTitleBar.BackColor = System.Drawing.Color.Black;
this.pnlTitleBar.Controls.Add(this.btnDropDown);
this.pnlTitleBar.Controls.Add(this.lblTitle);
this.pnlTitleBar.Size = new System.Drawing.Size(320, 48);
//
// btnDropDown
//
this.btnDropDown.Font = new System.Drawing.Font("Microsoft
Sans Serif", 16F, System.Drawing.FontStyle.Regular);
this.btnDropDown.Size = new System.Drawing.Size(112, 48);
this.btnDropDown.Text = "Off Duty";
this.btnDropDown.Click += new
System.EventHandler(this.btnDropDown_Click);
this.btnDropDown.LostFocus += new
System.EventHandler(this.btnDropDown_LostFocus);
//
// lblTitle
//
this.lblTitle.Font = new System.Drawing.Font("Microsoft Sans
Serif", 18F, System.Drawing.FontStyle.Bold);
this.lblTitle.ForeColor = System.Drawing.Color.White;
this.lblTitle.Location = new System.Drawing.Point(112, 8);
this.lblTitle.Size = new System.Drawing.Size(208, 32);
this.lblTitle.Text = "Morrisons";
this.lblTitle.TextAlign =
System.Drawing.ContentAlignment.TopCenter;
//
// pnlDropDown
//
this.pnlDropDown.Controls.Add(this.btnOnDuty);
this.pnlDropDown.Controls.Add(this.btnBreak);
this.pnlDropDown.Controls.Add(this.btnRest);
this.pnlDropDown.Controls.Add(this.btnDrive);
this.pnlDropDown.Location = new System.Drawing.Point(0, 48);
this.pnlDropDown.Size = new System.Drawing.Size(112, 256);
this.pnlDropDown.Visible = false;
this.pnlDropDown.LostFocus += new
System.EventHandler(this.pnlDropDown_LostFocus);
//
// btnOnDuty
//
this.btnOnDuty.Font = new System.Drawing.Font("Microsoft Sans
Serif", 16F, System.Drawing.FontStyle.Regular);
this.btnOnDuty.Location = new System.Drawing.Point(0, 192);
this.btnOnDuty.Size = new System.Drawing.Size(112, 64);
this.btnOnDuty.Text = "On Duty";
this.btnOnDuty.Click += new
System.EventHandler(this.btnOnDuty_Click);
//
// btnBreak
//
this.btnBreak.Font = new System.Drawing.Font("Microsoft Sans
Serif", 16F, System.Drawing.FontStyle.Regular);
this.btnBreak.Location = new System.Drawing.Point(0, 128);
this.btnBreak.Size = new System.Drawing.Size(112, 64);
this.btnBreak.Text = "Break";
this.btnBreak.Click += new
System.EventHandler(this.btnBreak_Click);
//
// btnRest
//
this.btnRest.Font = new System.Drawing.Font("Microsoft Sans
Serif", 16F, System.Drawing.FontStyle.Regular);
this.btnRest.Location = new System.Drawing.Point(0, 64);
this.btnRest.Size = new System.Drawing.Size(112, 64);
this.btnRest.Text = "Rest";
this.btnRest.Click += new
System.EventHandler(this.btnRest_Click);
//
// btnDrive
//
this.btnDrive.Font = new System.Drawing.Font("Microsoft Sans
Serif", 16F, System.Drawing.FontStyle.Regular);
this.btnDrive.Size = new System.Drawing.Size(112, 64);
this.btnDrive.Text = "Drive";
this.btnDrive.Click += new
System.EventHandler(this.btnDrive_Click);
//
// TachoMenu
//
this.BackColor = System.Drawing.Color.Transparent;
this.ClientSize = new System.Drawing.Size(320, 480);
this.Controls.Add(this.pnlDropDown);
this.Controls.Add(this.pnlTitleBar);

}
#endregion

#region InitTachoStateChange
private void InitTachoStateChange(TachoMenu.TachoState newState)
{
this.pnlDropDown.Visible = false;
clientForm.Controls.SetChildIndex(this, 100);

switch (currentState)
{
case TachoMenu.TachoState.Break:
this.btnBreak.Enabled = true;
break;

case TachoMenu.TachoState.Drive:
this.btnDrive.Enabled = true;
break;

case TachoMenu.TachoState.OnDuty:
this.btnOnDuty.Enabled = true;
break;

case TachoMenu.TachoState.Rest:
this.btnRest.Enabled = true;
break;
}

switch (newState)
{
case TachoMenu.TachoState.Break:
currentState = newState;
this.btnBreak.Enabled = false;
this.btnDropDown.Text = "Break";
break;

case TachoMenu.TachoState.Drive:
currentState = newState;
this.btnDrive.Enabled = false;
this.btnDropDown.Text = "Drive";
break;

case TachoMenu.TachoState.OnDuty:
currentState = newState;
this.btnOnDuty.Enabled = false;
this.btnDropDown.Text = "On Duty";
break;

case TachoMenu.TachoState.Rest:
currentState = newState;
this.btnRest.Enabled = false;
this.btnDropDown.Text = "Rest";
break;
}
writeDelay.StartCountDownToWrite = true;
}
#endregion

#region Event Handlers
private void btnDropDown_Click(object sender, System.EventArgs e)
{
this.pnlDropDown.Visible = !this.pnlDropDown.Visible;

if(this.pnlDropDown.Visible)
clientForm.Controls.SetChildIndex(this, 0);
else
clientForm.Controls.SetChildIndex(this, 100);
}

private void btnDropDown_LostFocus(object sender, System.EventArgs
e)
{
this.pnlDropDown.Visible = false;
clientForm.Controls.SetChildIndex(this, 100);
}

private void pnlDropDown_LostFocus(object sender, System.EventArgs
e)
{
this.pnlDropDown.Visible = false;
clientForm.Controls.SetChildIndex(this, 100);
}

private void btnDrive_Click(object sender, System.EventArgs e)
{
if(currentState == TachoMenu.TachoState.Drive)
return;
InitTachoStateChange(TachoMenu.TachoState.Drive);
}

private void btnRest_Click(object sender, System.EventArgs e)
{
if(currentState == TachoMenu.TachoState.Rest)
return;
InitTachoStateChange(TachoMenu.TachoState.Rest);
}

private void btnBreak_Click(object sender, System.EventArgs e)
{
if(currentState == TachoMenu.TachoState.Break)
return;
InitTachoStateChange(TachoMenu.TachoState.Break);
}

private void btnOnDuty_Click(object sender, System.EventArgs e)
{
if(currentState == TachoMenu.TachoState.OnDuty)
return;
InitTachoStateChange(TachoMenu.TachoState.OnDuty);
}
#endregion

#region Properties
public string Title
{
get { return this.lblTitle.Text; }
set { this.lblTitle.Text = value; }
}
#endregion

#region Internal class - WriteDelay

public class WriteDelay
{
private Thread writeThread;
private bool StartWriteCount;
private static bool keepAlive;

public WriteDelay()
{
keepAlive = true;
writeThread = new Thread( new ThreadStart(
WaitForWriteRequest ));
writeThread.Priority = ThreadPriority.Normal;
writeThread.Start();
}

public bool StartCountDownToWrite
{
set {StartWriteCount = value;}
}

public static bool KeepAlive
{
set {keepAlive = value;}
}

private void WaitForWriteRequest()
{
int iCountdownSecs = 10;
bool waitingToWrite = false;

while(keepAlive)
{
if(StartWriteCount == true)
{
waitingToWrite = true;
StartWriteCount = false;
iCountdownSecs = 10;
}

Thread.Sleep(1000);

if(waitingToWrite)
{
--iCountdownSecs;

if(iCountdownSecs == 0)
{
waitingToWrite = false;


if(!RequestWriter.WriteTachoRequest(TachoMenu.currentState))
{
//handle error
}
}
}
}
}
}
#endregion
}
}

Client Form code:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace Testing
{
/// <summary>
/// Summary description for TestForm.
/// </summary>
public class TestForm : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
private TachoMenu tachoMenu;

public TestForm()
{
InitializeComponent();
tachoMenu = new TachoMenu();
tachoMenu.Title = "Morrisons";
tachoMenu.AddMenuToForm(this);

this.Paint += new PaintEventHandler(TestForm_Paint);

}

public void TestForm_Paint(object sender, PaintEventArgs e)
{
int iNumTanks = 7;
int iYOffSet = 60;
Graphics graphics = null;
Pen pen = null;

graphics = e.Graphics;
pen = new Pen(Color.Black);

int iTankWidth = ((MyApp.SCREEN_WIDTH - (iNumTanks *
MyApp.GRAPHIC_PADDING_PIX))) / iNumTanks;

for(int i = 0 ; i < iNumTanks ; i++)
{
graphics.DrawRectangle( pen,
MyApp.GRAPHIC_PADDING_PIX
+ i * (iTankWidth + MyApp.GRAPHIC_PADDING_PIX),
iYOffSet,
iTankWidth,
iTankWidth);
}
pen.Dispose();
}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
//
// button1
//
this.button1.Font = new System.Drawing.Font("Microsoft Sans
Serif", 20.25F, System.Drawing.FontStyle.Regular);
this.button1.Location = new System.Drawing.Point(88, 408);
this.button1.Size = new System.Drawing.Size(128, 48);
this.button1.Text = "Exit";
this.button1.Click += new
System.EventHandler(this.button1_Click);
this.FormBorderStyle =
System.Windows.Forms.FormBorderStyle.None;
//
// TestForm
//
this.ClientSize = new System.Drawing.Size(320, 480);
this.ControlBox = false;
this.Controls.Add(this.button1);

this.Text = "TestForm";

}
#endregion

private void button1_Click(object sender, System.EventArgs e)
{
MyApp.CleanUp();
Application.Exit();
}
}
}


Thanks for help/suggestions
 
A

Alex Yakhnin [MVP]

Your control is covering the whole form:

this.BackColor = System.Drawing.Color.Transparent;
this.ClientSize = new System.Drawing.Size(320, 480);

And Windows CE doesn't support window transparency, it means that nothing
would be painted under a child control.
 
D

Duncan Mole

Ah, OK, thank-you for that, that makes a lot of sense! I now resize the
ClientSize to accomadate the drop down panel when i need to display it, now
I can do away with the messy z order stuff. Thank you very much.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top