|
Aaaah, JEFF.
It took me that long to figure out you also responded to my previous posts.
[ see here[^] ]
Well, i spent the day getting things working.
First of all, to pay some credit to the post / repsonse mentioned above, that snippet
didn't work 'out of the box', it had to be modified to this to get it working:
<br />
RECT rc;<br />
GetClientRect(hWnd, &rc);<br />
HDC trgDC = GetDC(hWnd);<br />
<br />
System::IntPtr _srcDC = iForm.getHDC();
HDC srcDC = (HDC)_srcDC.ToPointer();<br />
<br />
BitBlt(trgDC, 0, 0, rc.right, rc.bottom, srcDC, 0, 0, SRCCOPY);<br />
ReleaseDC(hWnd, trgDC);<br />
This is mainly due to the C# dll delivers no HDC, but IntPtr instead, which, as you
can see above, can simply be casted to HDC. [ Which took me ages to find out. ]
"iForm" is a wrapper i wrote for the C# class in the .Net ddl i'm using:
[ This also allows me to have the class being global in C++ context, which is
impossible for 'native' managed objects. (using the /clr directive) ]
class IMEMFormWrap<br />
{<br />
private:<br />
gcroot<IMEMForm ^> _iForm;<br />
<br />
public:<br />
IMEMFormWrap()<br />
{<br />
_iForm = gcnew IMEMForm();<br />
}<br />
<br />
IntPtr getHDC()<br />
{<br />
return _iForm->CreateGraphics()->GetHdc();<br />
}<br />
<br />
<br />
};
And for my 'bitblting hidden window / form / whatever to plug-in space' struggles:
Well, it did work for me using a bitmap backbuffer in the C# dll.
Everything that is of concern for the plug-in to show is cloned to that bmp object
which is then continuously grabbed from the C# dll via wrapper and bitblted to
the plug-in space.
Well, at this point, my concern is to clean up my C# .Net code,
[ making all the debug and dirty stuff go away ( 'sh*t-be-gone' (tm) ) ]
putting all useful things into a 'new' dll.
And then there's some concern about performance.
I'm glad, i know there is a LOT of space for some speed improvements in
my previous code, so i'm sanguine it can be sped up to some extend.
Plus i'll have to set up some [maybe bidirectional] communication
between the plugin and the C# dll, involving the evaluation and
reaction to user events [ mouse move and so on ].
Also, i've encountered some memory leakage in the plug-in bitblting parts ...
well, i'll also have to dive into GDI and HDC usage as well.
Still a lot of work to be done.
But, at least, things are going forward.
|
|
|
|
|
Yeah, I usually just import my methods using an IntPtr, so I can just send the value returned from GetHDC to the imported methods. Just to give you a heads up, sometimes the HDC returned from GetHDC will NOT function correctly with the Windows API (for me it is when I make a call to Graphics.FromImage, followed by an ExtFloodFill). In that case, you will need to call GetCompatibleDC (or CreateCompatibleDC, I don't remember which). Your current memory leak may be plugged by doing the following cleanup (I think)...
Graphics g = null;
IntPtr _srcDC = IntPtr.Zero;
HDC trgDC = null;
try {
RECT rc;
GetClientRect(hWnd, &rc);
trgDC = GetDC(hWnd);
g = iForm.CreateGraphics();
_srcDC = g.GetHdc();
HDC srcDC = (HDC)_srcDC.ToPointer();
BitBlt(trgDC, 0, 0, rc.right, rc.bottom, srcDC, 0, 0, SRCCOPY);
} finally {
if (trgDC != null)
ReleaseDC(hWnd, trgDC);
if (g != null) {
if (_srcDC != IntPtr.Zero)
g.ReleaseDC(_srcDC);
g.Dispose();
}
}
I'm glad you got it working,
Jeff
|
|
|
|
|
Sorry for it took me so long to respond.
Well, i'm [dead] stuck.
The method you described in your last post works well, BUT ...
it's also a 'simple' BitBLT of the form, so it suffers from all
the disadvantages linked to that [ that is, overlaying 'things'
are blted as well and nothing is blted when the form is not visible ]
My approach to bitBLT from a Bitmap object still did suffer from
memory leaks; when i tried to avoid that using a picturebox
object, all 'the known' bitblt disadvantages reappeared.
Also i noticed that every 'clone bitmap' approach doesn't run fast
enough for my project. [ let alone the need for a semaphore implementation
to manage collision-free access to such bitmap objects ]
So, i'm stuck.
I suppose, i'll end up using the app in it's own frame for now.
:[
|
|
|
|
|
I have found that the fastest way to copy, or "clone", a bitmap is to use unsafe code with direct pointers to the data. I actually achieved better efficiency doing it that way than I did with BitBlt, so that may help your bitmap copy scenario. Basically, pin both the source and destination bitmaps to memory, then go through 32 bits at a time, copying the contents from one to the other. The code looks something like this (I didn't test it, but you get the idea):
public static Bitmap CopyColorImage(Bitmap src) {
Rectangle bounds = new Rectangle(0, 0, src.Width, src.Height);
Bitmap rval = new Bitmap(src.Width, src.Height, src.PixelFormat);
BitmapData rvalData = rval.LockBits(bounds, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
BitmapData srcData = null;
try {
srcData = src.LockBits(bounds, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
unsafe {
int* maxAddr = (int*)srcData.Scan0.ToPointer() + src.Width * src.Height;
int* srcPtr = (int*)srcData.Scan0.ToPointer() - 1;
int* rvalPtr = (int*)rvalData.Scan0.ToPointer();
while (++srcPtr < maxAddr) {
*rvalPtr = *srcPtr;
++rvalPtr;
}
}
return rval;
} catch {
return null;
} finally {
if (srcData != null)
src.UnlockBits(srcData);
rval.UnlockBits(rvalData);
}
} Don't know if this helps, but just thought I would propose it in case you haven't tried it yet.
Sounds like somebody's got a case of the Mondays
-Jeff
|
|
|
|
|
Hi Everyone,
i have 2 Forms( Form 1 & Form 2 ) i have Button 'Add' on Form 2 & i need when i press it (in runtime) the values added on form 2 appears on form 1;
Regards
Geronimo_p3
|
|
|
|
|
Sorry I misunderstood your question, I was thinking about web form where you cannot have two forms on the page. And the forum is not letting me delete this message.
-- modified at 15:55 Monday 26th November, 2007
-----
|
|
|
|
|
You can remove this by selecting the Delete option in the bottom right hand corner of the post. It will ask you if you want to delete it.
|
|
|
|
|
thanks for your guidance... I did this but it gave me server error.. so the server at that time must have been busy..;P
-----
|
|
|
|
|
|
That article should be stickied to the top of this forum. Oft have i seen people asking about passing data between forms or similar, and someone has replied with a link to that article.
My current favourite word is: PIE!
I have changed my name to my regular internet alias. But don't let the 'Genius' part fool you, you don't know what 'SK' stands for.
-The Undefeated
|
|
|
|
|
The really huge hint filter states - Please don't cross post.
|
|
|
|
|
Hi all,
I'm trying to create a documentation file (.chm or a web Report)
That uses my Code comments.
I generate the XML documentation file using VS2005.
I can't produce the documentation with NDoc http://ndoc.sourceforge.net/ because there is not an Ndoc version for framework .NET 2.0
Is there an other why to generate C# documentation ?
Thanks for any help.
kort
|
|
|
|
|
|
Search MSDN for SandCastle.
|
|
|
|
|
hi
how can i convert xls to csv in c# code ?
thank's
|
|
|
|
|
Read this article[^] to get you started. It demonstrates how to read data from an Excel file.
Creating a CSV file is trivial. Use a System.Text.StringBuilder object to create the text for your file, and write it to the file system using the System.IO.File.WriteAllText() method.
Paul Marfleet
"No, his mind is not for rent
To any God or government"
Tom Sawyer - Rush
|
|
|
|
|
thank's alot
but can i get sample code ?
|
|
|
|
|
E_Gold wrote: but can i get sample code ?
I gave you a link to an article for reading the Excel file.
I'm not giving you the code to create the CSV file. If I did, I would be doing your work for you and you wouldn't have learned anything. I've told you the steps to need to follow to create the file. Now you have to think for yourself. If you can't be bothered to take my advice, maybe software development isn't the right career path for you.
Paul Marfleet
"No, his mind is not for rent
To any God or government"
Tom Sawyer - Rush
|
|
|
|
|
Is there any way that we can save the .xls file as csv? I have a problem when reading data from the excel as it rounds the decimal values. To solve my issue I have to save the .xls as a csv as then read the contents. Need help
|
|
|
|
|
hi
how can i convert xls to csv in c# code ?
thank's alot
|
|
|
|
|
Are you still having trouble with this? I think there are some articles around here that can help.
"Real programmers just throw a bunch of 1s and 0s at the computer to see what sticks" - Pete O'Hanlon
|
|
|
|
|
Hi,
This is really annoying - I set a field to disabled or read-only and it's set to a grey color with black text which isn't very easy to read at all.
I want to display my text in a read-only text box so that it can't be edited but so it can still be read clearly. Even though I try setting the background color different it doesn't work.
Can anyone suggest how I might make such fields more readable?
|
|
|
|
|
well don't disable it instead set readonly=true and then set the background color to whatever you want. I normally use LightGrey as background color which looks fine with black text. (I am referring to a web form text box not windows)
-----
|
|
|
|
|
I am looking for scripting tools in c# like .groovy in java
I want to code in that script then call some code in C#,
ANY IDEA??
Please Let Me Know
|
|
|
|
|
|