|
I have a custom control I'm building that has a custom drawing. However, I'm allowing the control to be moved around and I want to prevent the control from drawing itself because appareantly, when it does, it's drawing the transparent background and it's looking rather odd. I know in the old WinAPI 32 you could simple validate the invalid region and be done with it. Is there anything similiar to that in .NET?
|
|
|
|
|
I don't know about doing it the way you suggested, but you can override the OnPaint method and simply not call base.OnPaint when you want it to not do so. Does this help?
Jeff
|
|
|
|
|
Hi,
it's my first post here and I hope that someone can help me.
I'm developing an application in C#, using VisualStudio .NET 2005, which calls same functions from an ANSI C library.
My problems involve out of memory exceptions :S, because i don't really understand how to use the methods DestroyStructure() and FreeCoTaskMem().
I had 3 different kind of C# classes:
<br />
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]<br />
public class myClassA<br />
{<br />
public Int32 n_elem;<br />
<br />
public IntPtr temperature = IntPtr.Zero;<br />
<br />
public IntPtr length = IntPtr.Zero;<br />
}<br />
<br />
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]<br />
public class myClassB<br />
{<br />
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]<br />
public char[] identifier = new char[8];<br />
<br />
public Double weight = 0F;<br />
<br />
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]<br />
public Double[] coeffs = new Double[3];<br />
}<br />
<br />
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]<br />
public myClassC<br />
{<br />
public IntPtr ptrClassA;<br />
<br />
public IntPtr ptrClassB;<br />
}<br />
First of all I create an object of myClassA and one of myClassB; then I correctly fill each members with appropriate data, then using Marshal.StructureToPtr() let ptrClassA point the myClassA object just created and the same for ptrClassB.
The line before calling the C dll I let a new IntPtr to reference the myClassC object, and then call the library
<br />
myClassA classAObject = new myClassA();<br />
myClassB classBObject = new myClassB();<br />
myClassC classCObject = new myClassC();<br />
<br />
classAObject.n_elem = rowsCount;
Double[] temp = new Double[rowsCount];<br />
Double[] len = new Double[rowsCount];<br />
{...}<br />
<br />
classAObject.temperature = ConvertEx.ArrayToPtr(temp) ;<br />
classAObject.length = ConvertEx.ArrayToPtr(len); <br />
<br />
classCObject.ptrClassA = ConvertEx.StructToPtr(classAObject );<br />
classCObject.ptrClassB = ConvertEx.StructToPtr(classBObject );<br />
<br />
IntPtr ptrIn = ConvertEx.StructToPtr(classCObject);<br />
<br />
CLibrary(ptrIn);<br />
<br />
StructToPtr and ArrayToPtr are static methods of a class ConvertEx which boxes the basic step to allocate unmanaged memory
<br />
public static IntPtr StructToPtr(Object oInstance)<br />
{<br />
IntPtr ret = IntPtr.Zero;<br />
Int32 size = Marshal.SizeOf(oInstance.GetType());<br />
ret = Marshal.AllocCoTaskMem(size);<br />
Marshal.StructureToPtr(oInstance, ret, true);<br />
return ret;<br />
}<br />
<br />
public static IntPtr ArrayToPtr(Int32[] oInstance)<br />
{<br />
Int32 elems = oInstance.GetLength(0);<br />
IntPtr ret = IntPtr.Zero;<br />
Int32 size = Marshal.SizeOf(oInstance[0].GetType())*elems;<br />
ret = Marshal.AllocCoTaskMem(size);<br />
Marshal.Copy(oInstance, 0, ret, elems);<br />
return ret;<br />
}<br />
<br />
Then i just call FreeCoTaskMem() for each IntPtr variable, but in fact memory is not correctly released, I think but i cannot find the right way i had to use DestroyStructure() and FreeCoTaskMem() .
Can anyone explain me the difference between DestroyStructure and FreeCoTaskMem or how to use in my application because in some MSDN examples it uses both methods: first DesroyStructure is called and then FreeCoTaskMem.
thanks in advance
cicciollo
|
|
|
|
|
how to access remote information but they dontknow. who accessing our information
plz send me the code in c# using windows application
|
|
|
|
|
1. You have been already told to read the forum guidelines. Let me refresh your memory.
2. Give the title of your message some meaning.
3. We don't just hand over code to people here. You need to at least try on your own.
4. What you are asking for sounds malicious and no one will help you do that.
|
|
|
|
|
That's called cracking, don't do it, its naughty
"You're very clever, young man, very clever," said the old lady. "But it's turtles all the way down!"
|
|
|
|
|
Even I make better posts than this. Shame, oh shame...
- "Achieving all knowledge does not mean achieving all wisdom." some wise dude
- I love D-flat!
|
|
|
|
|
MasterSharp - we've never had you posting hacking questions. Marvelous.
|
|
|
|
|
Exactly.
- "Achieving all knowledge does not mean achieving all wisdom." some wise dude
- I love D-flat!
|
|
|
|
|
plz send me code in c#.net using windows application
|
|
|
|
|
sivaramireddy p wrote: plz send me code in c#.net using windows application
This was the best I could come up with given the vagueness of your request.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}
Upcoming FREE developer events:
* Developer! Developer! Developer! 6
* Developer Day Scotland
My website
|
|
|
|
|
Sorry Colin thats doesn't compile in visual studio 2003 can you provide something even more vague.
|
|
|
|
|
Frank Kerrigan wrote: Sorry Colin thats doesn't compile in visual studio 2003
Sorry, I didn't realise you wanted something a bit more retro. Try this:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace WindowsApplication3
{
public class Form1 : System.Windows.Forms.Form
{
private System.ComponentModel.Container components = null;
public Form1()
{
InitializeComponent();
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.Size = new System.Drawing.Size(300,300);
this.Text = "Form1";
}
#endregion
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
}
}
Upcoming FREE developer events:
* Developer! Developer! Developer! 6
* Developer Day Scotland
My website
|
|
|
|
|
oh cheers it doesn't really do much does it !
|
|
|
|
|
sivaramireddy p wrote: plz send me code
"please" read the top (first) post titled "How to get an answer to your question". Pay attention to item #2.
|
|
|
|
|
|
|
Nice one. Thanks for that.
|
|
|
|
|
Is there a way to make a button look like it is pushed? I want people to know that they have someone on or off.
|
|
|
|
|
RussBus wrote: Is there a way to make a button look like it is pushed? I want people to know that they have someone on or off.
Use a CheckBox control instead and change the Appearanace property to Button .
Upcoming FREE developer events:
* Developer! Developer! Developer! 6
* Developer Day Scotland
My website
|
|
|
|
|
Wow, that's a lot easier than my ideas. I had no idea you could do that!
Jeff
|
|
|
|
|
1. Make your own button class, that inherits from System.Windows.Forms.Button
2. Add a property called "IsPressed" that gets or sets a private member
3. Override the onPaint method, and draw the button based on the value of the private member behind the IsPressed property
If you use flat styles, then you can just make clicking the button swap the button flat style with the previous value to get that kind of effect, but it doesn't look like a standard button then. Another alternative is that you change the text. So, for example, you could change "Show" to "Hide" and vice-versa. Hope one of these ideas helps.
Jeff
|
|
|
|
|
Hi
I am having a COM interface method like this:-
interface IMain : IUknown
{
HRESULT GetInterface([in]IID riid, [out, iid_is("riid")]IUnknown **ppInterface);
}
and importing the idl/tlb to metadata; the above method is translated as follows:-
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
void GetInterface([In] Guid riid, [MarshalAs(UnmanagedType.IUnknown)] out object ppInterface);
When i call this from the .NET client like this:-
Guid someItfGUID = "6BD5A170-D0DC-4b59-8D86-2651C46CB6CC";
object itfObject = null;
iMain.GetInterfacesomeItfGUID, out itfObject);
IController ctrlr = itfObject as IController;
I see that the itfObject is null even after the call to GetInterface but does not fail on the COM side.
Let me know if you get any idea why itfObject is null [why the IUnknown/IController is not transported across].
Thanks
Vivek Ragunathan
Programming is an art, Code is a poem !!!
|
|
|
|
|
Why do you have a method GetInterface in a COM interface?
|
|
|
|
|
There are various components beside the main component and the main component is responsible for providing access to the other components. Hence a GetInterface.
Programming is an art, Code is a poem !!!
|
|
|
|