|
Hi, thank you for your answer
That's what I thought, too.
But I got no idea, how to draw it on each toolbar button correctly, so that the buttons AND the background are drawn with the gradient.
The buttons got always the form's background while toolbar is drawn with the gradient.
Can you/anybody give me an example how to do that?
Kind regards
dmatz
|
|
|
|
|
got it
If somebody's interested ... contact me!
Kind regards
dmatz
|
|
|
|
|
Here ...just whipped this up...note didn't test with images...so you may have to create some logic to better center text and image...or no text would actually be easier...just delete the draw text function :P
this will look better in vs.net when you collapse all the regions
#region Using Directives<br />
<br />
using System;<br />
using System.Drawing;<br />
using System.ComponentModel;<br />
using System.Drawing.Drawing2D;<br />
using System.Windows.Forms;<br />
<br />
#endregion<br />
<br />
namespace Controls<br />
{<br />
public class GradientToolBar : System.Windows.Forms.ToolBar<br />
{<br />
#region autostuff<br />
<br />
private System.ComponentModel.Container components = null;<br />
private Color gradientColorA = SystemColors.Control;<br />
private Color gradientColorB = Color.Green;
private LinearGradientMode gradientMode = LinearGradientMode.Vertical;<br />
<br />
#region Component Designer generated code<br />
private void InitializeComponent()<br />
{<br />
components = new System.ComponentModel.Container();<br />
}<br />
#endregion<br />
<br />
protected override void Dispose( bool disposing )<br />
{<br />
if( disposing )<br />
{<br />
if(components != null)<br />
{<br />
components.Dispose();<br />
}<br />
}<br />
base.Dispose( disposing );<br />
}<br />
<br />
#endregion<br />
<br />
#region properties<br />
<br />
public Color ColorA<br />
{<br />
get { return gradientColorA; }<br />
set { gradientColorA = value; }<br />
}<br />
<br />
public Color ColorB<br />
{<br />
get { return gradientColorB; }<br />
set { gradientColorB = value; }<br />
}<br />
<br />
public LinearGradientMode GradientDrawMode<br />
{<br />
get { return gradientMode; }<br />
set { gradientMode = value; }<br />
}<br />
<br />
#endregion<br />
<br />
#region variables<br />
<br />
private bool mouse_down;<br />
private int last_selected_button;<br />
<br />
#endregion<br />
<br />
#region initializer<br />
public GradientToolBar()<br />
{<br />
InitializeComponent();<br />
<br />
SetStyle(ControlStyles.UserPaint, true);<br />
SetStyle(ControlStyles.AllPaintingInWmPaint, true);<br />
SetStyle(ControlStyles.DoubleBuffer, true);<br />
<br />
<br />
this.last_selected_button = -1;<br />
this.mouse_down = false;<br />
}<br />
<br />
#endregion<br />
<br />
#region overrides<br />
protected override void OnPaint(PaintEventArgs e)<br />
{<br />
DrawGradientOnARectangle(e.Graphics, new Rectangle(0, 0, this.Width, this.Height), this.gradientColorA, this.gradientColorB, this.gradientMode);<br />
<br />
for(int i = 0; i < this.Buttons.Count; i++)<br />
{<br />
if(this.Buttons[i].Pushed || this.Buttons[i].PartialPush)<br />
DrawGradientOnARectangle(e.Graphics, this.Buttons[i].Rectangle, Color.Red, Color.Blue, this.gradientMode);<br />
<br />
DrawBorderOfARectangle(e.Graphics,this.Buttons[i].Rectangle); <br />
<br />
if(this.ImageList != null)<br />
DrawImageInRectangle(e.Graphics,this.Buttons[i].Rectangle,this.ImageList.Images[this.Buttons[i].ImageIndex]);<br />
<br />
DrawTextInRectangle(e.Graphics,this.Buttons[i].Rectangle,this.Buttons[i].Text);<br />
}<br />
}<br />
<br />
protected override void OnPaintBackground(PaintEventArgs pevent)<br />
{<br />
}<br />
<br />
protected override void OnResize(System.EventArgs e)<br />
{<br />
this.Refresh();<br />
base.OnResize (e);<br />
}<br />
<br />
protected override void OnMouseDown(MouseEventArgs e)<br />
{ <br />
this.mouse_down = true;<br />
PushThisButton(e.X,e.Y);<br />
base.OnMouseDown (e);<br />
}<br />
<br />
protected override void OnMouseUp(MouseEventArgs e)<br />
{<br />
this.mouse_down = false;<br />
UnPushAllButtons();<br />
base.OnMouseUp (e);<br />
}<br />
<br />
protected override void OnMouseMove(MouseEventArgs e)<br />
{<br />
if(this.Buttons == null || !this.mouse_down || this.last_selected_button == -1)<br />
return;<br />
<br />
if(e.Y >= this.Buttons[this.last_selected_button].Rectangle.Top && e.Y <= this.Buttons[this.last_selected_button].Rectangle.Bottom)<br />
{<br />
if(e.X <= this.Buttons[this.last_selected_button].Rectangle.Right && e.X >= this.Buttons[this.last_selected_button].Rectangle.Left)<br />
this.Buttons[this.last_selected_button].Pushed = true;<br />
}<br />
<br />
else<br />
UnPushAllButtons();<br />
<br />
base.OnMouseMove (e);<br />
}<br />
<br />
#endregion<br />
<br />
#region functions<br />
<br />
private void UnPushAllButtons()<br />
{<br />
for(int i = 0; i < this.Buttons.Count; i++)<br />
{<br />
if(this.Buttons[i].Pushed || this.Buttons[i].PartialPush)<br />
{<br />
this.Buttons[i].Pushed = false;<br />
this.Buttons[i].PartialPush = false;<br />
break;
}<br />
}<br />
}<br />
<br />
private void PushThisButton(int X, int Y)<br />
{<br />
for(int i = 0; i < this.Buttons.Count; i++)<br />
{<br />
if(Y >= this.Buttons[i].Rectangle.Top && Y <= this.Buttons[i].Rectangle.Bottom)<br />
{<br />
if(X <= this.Buttons[i].Rectangle.Right && X >= this.Buttons[i].Rectangle.Left)<br />
{<br />
this.Buttons[i].Pushed = true;<br />
this.last_selected_button = i;<br />
break;
}<br />
}<br />
}<br />
}<br />
<br />
private void DrawBorderOfARectangle(Graphics g, Rectangle rect)<br />
{<br />
using(SolidBrush sb = new SolidBrush(Color.Blue))<br />
{<br />
using(Pen p = new Pen(sb,1))<br />
{<br />
g.DrawRectangle(p,rect); <br />
}<br />
}<br />
}<br />
<br />
private void DrawImageInRectangle(Graphics g, Rectangle rect, Image pic)<br />
{<br />
PointF top_left_point_of_centered_spot_for_image = new PointF((rect.Width - pic.Width)/2F,(rect.Height - pic.Height)/2F);<br />
g.DrawImage(pic,top_left_point_of_centered_spot_for_image);<br />
}<br />
<br />
private void DrawTextInRectangle(Graphics g, Rectangle rect, string text)<br />
{<br />
if(text == "")<br />
return;<br />
<br />
SizeF word_size = g.MeasureString(text, this.Font, 32768, StringFormat.GenericTypographic);<br />
<br />
PointF top_left_point_of_centered_at_bottom_text = new PointF(rect.Left + (rect.Width - word_size.Width)/2F, rect.Bottom - (rect.Width - word_size.Height));<br />
<br />
using(SolidBrush sb = new SolidBrush(Color.Orange))<br />
{<br />
g.DrawString(text, this.Font, sb, top_left_point_of_centered_at_bottom_text,StringFormat.GenericTypographic);<br />
}<br />
}<br />
<br />
private void DrawGradientOnARectangle(Graphics g, Rectangle rect, Color GradientA, Color GradientB, LinearGradientMode GradientMode)<br />
{<br />
using(LinearGradientBrush lgb = new LinearGradientBrush(rect,GradientA,GradientB,GradientMode))<br />
{<br />
g.FillRectangle(lgb, rect);<br />
}<br />
}<br />
<br />
#endregion<br />
}<br />
}
|
|
|
|
|
AHH!! codeproject killed all my xml summary blocks...NOOO
|
|
|
|
|
Hi,
I thank you for working on this topic, but your solution seems to be very complicated, I think. The way I solved this problem is much easier.
My derived ToolBar class contains only one overridden event and it has full designer supported text, image and gradient props
I really worked hard on it, but my result is worth its effort.
I'm gonna publish an article on codeproject about this soon.
I just need to make some little improvements, and it's done
Watch out for it!
Kind regards
dmatz
|
|
|
|
|
|
if I have a main program named Program.cs and a dynamically loaded dll named bot.dll how can I call methods in Program.cs.
please help me cause I want to create a programming game if anyone has a sample please reply
thank you in advance!
|
|
|
|
|
I want to call methods in program.cs from bot.dll
|
|
|
|
|
I guess It's like the same as including methods from the user32.dll:
[DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
private static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, IntPtr lParam);
|
|
|
|
|
I created a own datatype called ID. Now I want to have a function which converts a string into an ID. So I thought it would be the best to kind of append a method to the System.Convert class, so that I can simply call it with Convert.ToID("somewhat");
Is that possible?
P.S.: Sorry for asking so much ^^
|
|
|
|
|
See MSDN[^]. This should be what you are looking for.. Changes in .NET classes are possible, bt I don't like this idea (in this case). Why not to make static function ID.FromString(string s) ?
And hey! It is in Convert class... MSDN[^]
hmm thats cool!
TyronX wrote:
P.S.: Sorry for asking so much ^^
nah... how would we earn gold memberships, etc.? :P Plus from some question (like this one) I learnt something new.. isn't iot great?
best regards,
David 'DNH' Nohejl
Never forget: "Stay kul and happy" (I.A.)
|
|
|
|
|
dnh wrote:
See MSDN[^]. This should be what you are looking for..
I don't think so. He wants to convert a string into his own type (FromString() ) not the other way round (which would be IConvertible.ToString() ).
dnh wrote:
Changes in .NET classes are possible, bt I don't like this idea (in this case).
How would you do that?
dnh wrote:
nah... how would we earn gold memberships, etc.?
Best regards
Dennis
|
|
|
|
|
Dennis C. Dietrich wrote:
I don't think so. He wants to convert a string into his own type
you are right! [edit]what's even worse I actually told him to have stg like ID.FromString() so I understood bt just said bs then [/edit]
Dennis C. Dietrich wrote:
How would you do that?
Sorry. I was very inaccurate. I meant deriving from .NET classes (do not apply to Convert). [psst i didn't say that]change rotor & recompile [/psst]
thx for correcting me.
(how come I haven't included "what I say CAN be bullsh" yet into my sig- I was really thinking about it!)
David
Never forget: "Stay kul and happy" (I.A.)
|
|
|
|
|
dnh wrote:
how come I haven't included "what I say CAN be bullsh" yet into my sig- I was really thinking about it!
Don't bother! Otherwise everybody here would have to include that. Well, maybe everybody except for Heath Stewart.
Best regards
Dennis
|
|
|
|
|
Dennis C. Dietrich wrote:
Well, maybe everybody except for Heath Stewart.
LOL. that's true!
David
Never forget: "Stay kul and happy" (I.A.)
|
|
|
|
|
TyronX wrote:
So I thought it would be the best to kind of append a method to the System.Convert class, so that I can simply call it with Convert.ToID("somewhat");
You can't do this. The Convert Class[^] is sealed[^]. That means you can not derive classes from it. And even if it wasn't sealed and you'd derive it you would end up with a new type. You should simply provide a method ID.FromString(string) and/or a corresponding constructor for new instances (public ID(string) ).
Best regards
Dennis
|
|
|
|
|
Okay. Thanks to both of you.
|
|
|
|
|
Next Question: Can I add something to the Point Class/Structure (I need to add the TypeConverter)?
|
|
|
|
|
|
actually it's TypeConverter ( what makes it easier to find )
Thx for solution.
best regards,
David
Never forget: "Stay kul and happy" (I.A.)
|
|
|
|
|
|
I have a clean machine (WinXP)... I am running a .net app and its crashing however as I do not have vstudio intsalled - I don;t get a the crash message inside a debugger.
I know its cuase of version numbers etc - but I have no debugger installed and so when it does crash I don;t know what the files are missing / out of date version. i really do not want to install vstudio as it is no longer a clean machine... is there anyway to install the debugger without vstudio ... I just want the .net error message thats all. Will the .net sdk give me that.
Thanks
|
|
|
|
|
woodyuk wrote:
i really do not want to install vstudio as it is no longer a clean machine... is there anyway to install the debugger without vstudio
Never tried it myself but installing just the remote debugger on the target machine and using that should do the trick (see Setting Up Remote Debugging[^] and Remote Debugging Setup[^]).
Best regards
Dennis
|
|
|
|
|
Hi,
I would like to get an PDIL from a file path, but i am not sure which api funciton i have to call. Currently i use the Shell32 Com Interop, but my IShellFolder (Folder2, Folder3)class has no PDIL property.
Does anyone have some sample code?
myMsg.BehindDaKeys = "Jerry Maguire";
|
|
|
|
|
Get the what?
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|