|
I have an interesting behavior:
[DllImport("user32.dll")]
static public extern IntPtr GetDC(IntPtr hWnd);
[DllImport("user32.dll")]
static public extern IntPtr GetDesktopWindow();
When I get the Graphics object through
Graphics g = Graphics.FromHwnd(GetDesktopWindow());
any drawing on the desktop do not result in anything.
When I get the Graphics object through
Graphics g = Graphics.FromHdc(GetDC(IntPtr.Zero));
I can draw on the desktop.
Any explanation?
Juergen
|
|
|
|
|
i did it by accident a few weeks ago and im not sure if this is the code i used but i think you could give it a shot
//
okay i remeber how i did it..i originally posted a message here that was long..but i found the solution. you can do it using a class that was already wrote..and ill show you how... first off download the clas here : Link[^]
second....adapt this code segment i just wrote into your needs...and it should work....remeber to add the namespaces that the class you downloaded uses... also the class you downloaded uses unsafe code so you will have to turn on the unsafe option in vs.net you can do it by selecting the properties of your project
<br />
<br />
[DllImport("user32.dll")]<br />
private static extern IntPtr GetWindowDC(int Pointer);<br />
Win32Window ww = Win32Util.Win32Window.DesktopWindow;<br />
IntPtr DC = GetWindowDC(ww.Window.ToInt32());<br />
Graphics jm = Graphics.FromHdc(DC);<br />
jm.DrawLine(Pens.Yellow,130,30,30,130);<br />
jm.DrawRectangle(Pens.Red,100,100,300,300);<br />
|
|
|
|
|
Thanks for your reply,
in my post there already was a working solution.
But the question was why the first solution don't work
Graphics g = Graphics.FromHwnd(GetDesktopWindow());
while the second solution works fine.
Graphics g = Graphics.FromHdc(GetDC(IntPtr.Zero));
In my understanding both should work.
I like to know the reason for this behaviour.
Juergen
|
|
|
|
|
GetDesktopWindow() only returns the handle to the Device Context (DC) so passing that handle into the graphics object is incorrect.
when you call GetDC you are grapping the device context its self from the handle. The device is what you work with to do your drawing function in this case.
hope this helps.
Jesse
The Code Project Is Your Friend...
|
|
|
|
|
The GetDesktopWindow function returns a handle to the desktop window (MSDN).
Graphics g = Graphics.FromHwnd(GetDesktopWindow());
creates the Graphics object.
In the debugger it looks like g is created properly,
(exactly the same values as when created with
Graphics.FromHdc(GetDC(IntPtr.Zero));)
but any Drawing on it, is at least invisible.
Juergen
|
|
|
|
|
it returns the handle to the window its self...but that doesnt necessarily
mean the graphics object. the window propertie in the api is kinda like a form in .net it has many methods/properties to it but you need the Graphics object to draw to the form. Simular to that you need the device context of the 'Window' to draw to it. g would be created properly because it is a handle and it can be drawn to..its just not creating the handle on the correct drawing object.
there are 2 handles....a Form.Handle and Graphics().GetHdc() (i think thats it) GetDesktopWindow() returns the Form.Handle essentially. from that handle u get the GraphicsHandle from GetDC
jesse
The Code Project Is Your Friend...
|
|
|
|
|
I'm trying to serialize a complex data structure, and I have some questions.
- How do I serialize an array? In the GetObjectData that I have to implement, I use the AddInfo function. But it takes two parameters : a "key" in a value.
If I want to save a float[8], how can I do this?
Do something like :
for(int i = 0; i <8; i++)
{
string key = "Array" + i.ToString();
SerializeInfo.AddValue(key, array[i]);
}
- How to I serialize complex object?
Suppose I have a class CDrawing, that cointains an array of CShape. A CShape can be derived into a CCircle or a CRectangle
Somewhere in my code I do
shapeArray[0] = new CCircle;
shapeArray[1] = new CRectangle;
Serializing is not a pb, because I will make the GetObjectData function virtual, so it will use the correct one to write CCircle parameters for the first shape, and CRectangle paramters for the second shape.
But how can I deserialize? How do I know if I must do a new CCircle, or a new CRectanle?
- How can I serialize to a text file? I've found only a binary and a SOAP formatter.
|
|
|
|
|
Stephane David wrote:
How can I serialize to a text file?
If you want to serialize to a text file, you will have to come up with your own format (well, that is assuming you want to be able to read it with your own eyes).
But if you are willing to just save an object or array out to disk and only have the computer read it, you must mark each of your classes with the Serializable attribute. If all the objects (Shapes for you) are serializable, then the array that contains them is automatically serializable.
Serializing is not a particularly difficult thing, I would just need a bit more info on your classes...
-Nathan
---------------------------
Hmmm... what's a signature?
|
|
|
|
|
The real classes are a bit to complexes to explain in details.
But here is I think an exemple which illustrates the system well (warning : minimum syntax!)
class CPoint
{
int X;
int Y;
}
class CShape
{
string name;
virtual void Draw();
}
class CCircle : CShape
{
int Radius;
CPoint center;
override void Draw();
}
class CPolygon : CShape
{
CPoint[] geometry;
override void Draw();
}
class CDrawing
{
public CShape[] shapes;
}
And now, I do this
CDrawing drawing = new CDrawing();
drawing.shapes[0] = new CCircle();
// Initialize the circle
//...
drawing.shapes[1] = new CPolygon();
// Initialize the polygon
//...
Now, I want to save my drawing to a binary or text or XML file, and then load it.
|
|
|
|
|
Stephane David wrote:
class CPoint<br />
{<br />
int X;<br />
int Y;<br />
}
First: This little class is unneeded; check out System.Drawing.Point .
Second: You then need to mark your classes with Serializable attributes.
[Serializable(true)]
class CShape
{
string name;
virtual void Draw();
}
[Serializable(true)]
class CCircle : CShape
{
int Radius;
CPoint center;
override void Draw();
}
[Serializable(true)]
class CPolygon : CShape
{
CPoint[] geometry;
override void Draw();
}
[Serializable(true)]
class CDrawing
{
public CShape[] shapes;
}
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
void SaveToFile(string path,CDrawing drawing)
{
using(FileStream fs = File.OpenWrite(path))
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs,drawing);
}
}
CDrawing LoadFromFile(string path)
{
using(FileStream fs = File.OpenRead(path))
{
BinaryFormatter bf = new BinaryFormatter();
return (CDrawing)bf.Deserialize(fs);
}
}
Hope this gets you on your way...
-Nathan
---------------------------
Hmmm... what's a signature?
|
|
|
|
|
The actual name of classes were just illustration, ht class architecture is muh more complex. I'll try what you say. It was what I read in the documentation, but I was doubtfull it would actually save an array of derived classes as the shapes member in my CDrawing class.
|
|
|
|
|
Does anyone know if it is possible to store an a class in Message queue body as an object? If so, is there a special type of formatter I need to use? Thanks for all the help.
|
|
|
|
|
hi all, I'm newbies please help me solve this problem with C#
My project windowForm like Chat Program, but when I append text into Richtextbox (ScrollBars: ForcedVertical), it don't autoscroll to see last text I was append
someone help me, please. Thanks
Nho'c ti`
|
|
|
|
|
Do this every time you append text:
rtb.SelectionStart=rtb.TextLength;
rtb.ScrollToCaret();
"Blessed are the peacemakers, for they shall be called sons of God." - Jesus
"You must be the change you wish to see in the world." - Mahatma Gandhi
|
|
|
|
|
but It doesn't run, and here is mycode (RichTextBox rtbMessage, TextBox tbInput)
private void tbInput_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if (e.KeyCode==System.Windows.Forms.Keys.Enter)
{
if (tbInput.Text.Length>0)
{
rtbMessage.AppendText("myID : "+tbInput.Text+"\n");
rtbMessage.SelectionStart = rtbMessage.TextLength;
rtbMessage.ScrollToCaret();
this.tbInput.Text = "";
}
}
}
some one can write somecode
thanks
Nho'c ti`
|
|
|
|
|
What's the error that makes it not run?
"Blessed are the peacemakers, for they shall be called sons of God." - Jesus
"You must be the change you wish to see in the world." - Mahatma Gandhi
|
|
|
|
|
"it not run" like that richtextbox doesn't autoscroll when I appendtext to it (with your code) )
Nho'c ti`
|
|
|
|
|
you need to set HideSelection to "FALSE"
in .net / C# the richtextbox doesnt move down to show the most recent text unless you set it's hideselection property to false .
Vb:
<font color="blue">Public Function</font> TwinsOnWay(<font color="blue">ByVal</font> twins <font color="blue">As String</font>) <font color="blue">As String <br> Select Case</font> twins<br> <font color="blue">Case</font> "Gender" <br> <font color="blue">Return</font> "Two Girls" <br> <font color="blue">End Select <br> End Function</font> <br>
|
|
|
|
|
Now I remember. Thanks for pointing this out. I remember a while back I was stumped by this, and when I found out, I was a bit irritated that they did it that way.
Thanks.
"Blessed are the peacemakers, for they shall be called sons of God." - Jesus
"You must be the change you wish to see in the world." - Mahatma Gandhi
|
|
|
|
|
np i've been making irc clients for longer than i can remember and it was the first problem i came across in .net
Vb:
<font color="blue">Public Function</font> TwinsOnWay(<font color="blue">ByVal</font> twins <font color="blue">As String</font>) <font color="blue">As String <br> Select Case</font> twins<br> <font color="blue">Case</font> "Gender" <br> <font color="blue">Return</font> "Two Girls" <br> <font color="blue">End Select <br> End Function</font> <br>
|
|
|
|
|
Thank you very much !!!
Nho'c ti`
|
|
|
|
|
Does anybody know how I could get a current property value from a loaded process? What I am trying to do is to have a user log-in in a main application, which would initialize a user object containing all the neccessary information about a user, and then every other application openned afterword, while the main application is still open, would use the same user object that was initialized in the main application. This would save the user from having to log-in again, it would save having to make unneeded trips to a remote database, plus it would save having a database connection for every application that is openned. Any suggestions or comments would be greatly appreciated. Thanks
|
|
|
|
|
What happens if you put it into a class library module and then reference that module in your different programs / segements?
I have a program that maintains a form of program state in via an external (seperate project) class (with static members and properties). It is referenced and initialized in the main program which keeps a hold in it while all the other modules reference the DLL and have access to the data.
The only data I think you would have to worry about is process or thread specific data. Other than that it seems to work fine.
Rocky Moore <><
|
|
|
|
|
I have the user object in a class library and it is referenced by my other programs. I didn't think about making all the methods static but I think I would prefer to keep it as an instance class. I just need to know how to get an instance of that class from my main application when it is already an active process. Any other ideas?
Shaun
|
|
|
|
|
Shaun Becker wrote:
I just need to know how to get an instance of that class
That is the reason for the static. You can add a class with a static property that you assign the instance of the class you want to use. This is what I do with my Data Abstraction classes. I have a class that has memebers which are static but the values in this are static. The instance of the class you wish to use is available to all other modules.
Rocky Moore <><
|
|
|
|