|
|
And did you google "Z-order"?
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
i know what z-order is - its not that. I intersect the 2 squares, not putting one on top of the other. Both are z-order dependent but with diferent meanings... you will get my point very easy from my screenshot.
|
|
|
|
|
|
Right - you can't do that with controls at all; you have to use Paint and draw yyour rectancgles your self.
Which means that you have to do the "entry" and "exit" code yourself, by handling MouseMove in your Parent container, and manually checking which of your rectangles the mouse is currently in:you cannot use MouseEnter and MouseLeave on your own rectangles because - unless they are Controls and in which case transparent backgrounds don't work - only Controls can react to mouse events.
Remove UserControl, and go back to drawing them yourself - but you will have to work out where the mouse is yourself, the system will not help you!
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Excellent answer so far, mister OriginalGriff: "you will have to work out where the mouse is yourself, the system will not help you". Can you help me making such "manual" class? I am aware I am asking a lot...
|
|
|
|
|
I'd do two things: Add a Paint method to the class which takes a single parameter: the Graphics context from the Containing classes Paint event.
And I'd add a Contains method returning a bool, which again takes a single parameter: a Point which it checks is inside it's "boundaries" (using the Location and Size information it contains). This could change the Name to be drawn, or that could be done externally, it depends what - exactly - you are trying to do, and how it all fits together as a complete system.
The containers MouseMove calls each Human instance's Contains method so they "know" if the mouse in over them or not. (The containers MouseExit event handler can reset them all)
This can call Invalidate to force a redraw as needed.
The Containers Paint event also calls each Human instance's Paint method so it draws itself.
Make sense?
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
yes, it makes sense...because I was thinking in the same direction too.
I will go with your idea.
I am building it now.
|
|
|
|
|
This is the working code so far. I will experiment with it further and I will update with new problems on the way. Also, you update it too if you feel you can help it more.
I was thinking on using refractor and actually look inside original mouse move event to see how they did it there, and copy it into my class... but is planned for the future.
Now, i am happy. It's some work to do but i get the transparency of the objects !
public class Human
{
private string _Name = "none";
public string Name { get { return _Name; } set { _Name = value; } }
public Point Location { get; set; }
public Size Size { get; set; }
public void Paint(Graphics g)
{
g.DrawString(Name, new Font("Arial", 9), new SolidBrush(Color.Black), Location.X, Location.Y - 15);
g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(Location.X, Location.Y, Size.Width, Size.Height));
}
public bool Contains(Point point)
{
if (point.X >= Location.X & point.X <= Location.X + Size.Width &
point.Y >= Location.Y & point.Y <= Location.Y + Size.Height)
{
return true;
}
else
{
return false;
}
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
DoubleBuffered = true;
female.Name = "Alina";
female.Location = new Point(20, 20);
female.Size = new Size(30, 30);
}
Human female = new Human();
private void Form1_Paint(object sender, PaintEventArgs e)
{
female.Paint(e.Graphics);
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (female.Contains(e.Location))
{
female.Name = "Gaga";
}
else
{
female.Name = "Alina";
}
Invalidate();
}
}
|
|
|
|
|
Thank you so far, mister OriginalGriff !
|
|
|
|
|
You're welcome!
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
I am not 100% sure my code is the most efficient. I have the feeling i overdo something. I cant put my finger on it yet. But i feel it. I hope it will not bite my ass after some usage. Or maybe i am too careful. Eh... We'll see.
|
|
|
|
|
i need to hide a column in uploaded template of excel in c#
|
|
|
|
|
That isn't clear.
If you are creating a excel file then you are using a library. So find how you do that in the library (not a C# question.)
If you wrote your own code entirely to create an excel sheet then you will need to figure out how that happens in an excel file. If you are lucky you can google and find something that explains that. Otherwise you
1. Create a simple (3 column) spreadsheet in excel with ONE row
2. Save it
3. Hide the middle column
4. Save it do a DIFFERENT file
5. Use a binary editor to compare the two files.
6. Update your code to do the difference you found
7. Test a LOT.
|
|
|
|
|
Hello,
My code is:
public enum DEFINITION
{
EVENT_FLAPS_UP,
EVENT_FLAPS_DOWN,
EVENT_PAUSE,
}
then:
private void Transmit_FLAPS_UP()
{
simulation_connection.TransmitClientEvent(
(uint)SimConnect.SIMCONNECT_OBJECT_ID_USER,
DEFINITIONS.EVENT_FLAPS_UP, (uint)0,
GROUP_UPDATE.GROUPUP,
SIMCONNECT_EVENT_FLAG.GROUPID_IS_PRIORITY);
}
private void Transmit_FLAPS_DOWN()
{
simulation_connection.TransmitClientEvent(
(uint)SimConnect.SIMCONNECT_OBJECT_ID_USER,
DEFINITIONS.EVENT_FLAPS_DOWN, (uint)0,
GROUP_UPDATE.GROUPUP,
SIMCONNECT_EVENT_FLAG.GROUPID_IS_PRIORITY);
}
private void Transmit_PAUSE()
{
simulation_connection.TransmitClientEvent(
(uint)SimConnect.SIMCONNECT_OBJECT_ID_USER,
DEFINITIONS.EVENT_PAUSE, (uint)0,
GROUP_UPDATE.GROUPUP,
SIMCONNECT_EVENT_FLAG.GROUPID_IS_PRIORITY);
}
It works when I call, for example: "Transmit_FLAPS_UP();". But my ENUM will be much bigger and I'd like to have universal method to call: "Transmit("EVENT_FLAPS_UP");"
I don't know how to assign it in my code (it's wrong":
private void Transmit(string param)
{
simulation_connection.TransmitClientEvent(
(uint)SimConnect.SIMCONNECT_OBJECT_ID_USER,
DEFINITIONS.param, (uint)0,
GROUP_UPDATE.GROUPUP,
SIMCONNECT_EVENT_FLAG.GROUPID_IS_PRIORITY);
}
Please help,
Michal
|
|
|
|
|
Have you tried this:
private void Transmit(DEFINITION def)
{
...
}
...
Transmit(Definition.EVENT_FLAPS_UP);
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Thank You, but I'm searching for something a little bit different. I'd like to have an enum parameter as string, for example: Transmit("EVENT_FLAPS_UP");
Why? There will be a textBox in my app, where user can write this parameter.
|
|
|
|
|
Why? He'll only make mistakes, which you need to check for.
Instead of a textbox, use a Combobox and he can only give you valid values:
On startup:
cbDefinitions.DataSource = Enum.GetValues(typeof(DEFINITION));
And when you want a value:
DEFINITION userSelected = (DEFINITION)cbDefinitions.SelectedItem;
Transmit(userSelected);
No strings, no switch to find out which he used and convert it to your enum, no errors.
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
As Griff said, the user is going to make mistakes. But if you really need to stick with a textbox, then you'll need to use the Enum.TryParse[^] method:
DEFINITION definition;
if (Enum.TryParse(YourTextBox.Text, true, out definition))
{
Transmit(definition);
}
else
{
... Show an error message to the user ...
}
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Hello,
I need kill a function by press button,
I have a function (method) ex:
public void move()
{
int count = 0;
while(true)
{
count++;
}
}
I need kill this method by when press button.
Any Idea?
thanks
|
|
|
|
|
Assuming you're running that on the UI thread, you won't be able to press the button to stop it. The entire UI will be frozen.
If it's running on a background thread, then you should be able to use a CancellationTokenSource[^] to coordinate cancelling the loop.
However, you've simplified your code to the point where it's not actually doing anything. Perhaps if you explain what you're actually trying to do, we might be able to provide better help.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Thank you for the replay,
No, is not a Thread while loop, is a normal method with while loop.
So, I'll try to explain my idea.
I will try to explain my function, it is not exactly what I posted, I just collided so to simplify the explanation.
I have this button that run a method:
private void btn_move_Click(object sender, EventArgs e)
{
while (true)
{
SnapFunction();
}
}
This "SnapFunction" have (wait for something) so, this function stay stop until the condition is true,
and wend condition is true, the code make another cycle until waint again for the condition is true.
Basically the condition is waits until something in the form is selected by the mouse, but this
code stay paused on the line.
What I need is, stop this function by some way.
|
|
|
|
|
|
You can't, not at all.
When you loop in any UI control event handler, the thread that handles them all is busy running the loop until the event handler method exits - which it never does because it is sitting in your loop!
Loops in event handlers are - with exceptions - a bad idea, and loops in UI handlers are a very bad idea because they prevent any other event being recognized and processed because the only thread which is allowed to access UI controls (called the "UI thread") is permanently busy processing a single event.
If you want to use any form of user input to terminate a loop, the loop must be running on a different thread - which means you manually starting another thread and setting the loop running. That's not difficult to do (the BackgroundWorker Class (System.ComponentModel) | Microsoft Docs[^] makes it pretty painless and provides a simple way for your new thread to report progress / results to the user) but it is an operation that you have to start yourself, the system will not do it for you!
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
You can't kill "a method" from outside. You can kill the thread it is being executed on, but ... you can't tell that the thread is executing the function!
What you need is a semaphore that is checked in the method instead of the while(true) , and signaled elsewhere in your app to indicate the method should exit when ready.
See here: How to: Create and Terminate Threads (C# Programming Guide) | Microsoft Docs[^]
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|