|
try PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)(m.LParam.ToPointer());
cheers..Milton KB.
|
|
|
|
|
Thanks a lot Milton,
It works.
Vicky
|
|
|
|
|
Guess u forgot the fact that C++/CLI ^ pointer operator and the tracking reference operator % are not equivalent to its native like counterpart operators * pointer and the & reference. Actually ^ is a handle to its managed heap object and its not a pointer to that. But the handle can provide us with the underlying pointer just like we did.
cheers..Milton KB
|
|
|
|
|
Yup, You are right.
Thanks for the detail explaination for C++/CLI handle which is new to me.
vicky
|
|
|
|
|
Why is the .NET graphics in windows forms app is so slow, manualy ploting some N points line segments using double buffer takes considerable time compared to say builder compiled app?
Is there special tips to make it faster.
9ine
|
|
|
|
|
9ine wrote: ploting some N points line segments using double buffer
Are you drawing into an Image and then displaying the Image on the Window?
led mike
|
|
|
|
|
This is the whole code to render some float array to a form
/////////data////////////////////////////////////////////////////////
Bitmap *canvas = new Bitmap(1280,1024);
Graphics *memg = Graphics::FromImage(canvas);
memg->SmoothingMode = SmoothingMode::HighSpeed;
/////////////////////////////////////////////////////////////////////
private: System::Void p2Dform_Paint(System::Object *sender, System::Windows::Forms::PaintEventArgs *e)
{
paint();
}
private: System::Void p2Dform_Resize(System::Object *sender, System::EventArgs *e)
{
resize();
}
private: void p2Dform::paint(void)
{
Graphics *g = CreateGraphics();
System::Drawing::Rectangle rect(0,0,ClientSize.Width,ClientSize.Height);
//draw image data
g->DrawImage(canvas,0,0,rect,GraphicsUnit::Pixel);
g->Dispose();
}
private: void p2Dform::resize(void)
{
memg->FillRectangle(wbrush,0,0,ClientSize.Width,ClientSize.Height);
//draw file data to memg
draw(ClientSize.Width,ClientSize.Height,color,m_data,len,miny,maxy);
paint();
}
private: void p2Dform::draw(int width,int height,int color, float *data,int len,float minY,float maxY)
{
bpen = new Pen(Color::FromArgb(color));
float stepx,stepy,X1,Y1,X2,Y2;
stepx = float(width-1 - addX*2)/float(len-1);
stepy = float(height-1 - addY*2)/Math::Abs(float(maxY-minY));
for(int i=1; i<len; i++)
{
X1 = stepx*float(i-1);
X2 = stepx*float(i);
Y1 = data[i-1];
if(minY < 0) Y1 += (-1.0f)*minY;
if(minY > 0) Y1 -= minY;
Y1 = float(height-1) - Y1*stepy;
Y2 = data[i];
if(minY < 0) Y2 += (-1.0f)*minY;
if(minY > 0) Y2 -= minY;
Y2 = float(height-1) - Y2*stepy;
memg->DrawLine(bpen,X1+addX,Y1-addY,X2+addX,Y2-addY);
}
bpen->Dispose();
}
9ine
|
|
|
|
|
I can't follow the code.
what does this do? Graphics *g = CreateGraphics();
I don't understand why you have this:
Bitmap *canvas = new Bitmap(1280,1024);
Graphics *memg = Graphics::FromImage(canvas);
memg->SmoothingMode = SmoothingMode::HighSpeed;
and then in paint() you have this: g->DrawImage(canvas,0,0,rect,GraphicsUnit::Pixel);
So you are drawing the bitmap into the graphics object of the bitmap?
led mike
|
|
|
|
|
the float data needs to be drawn once if there is resize event in the form. the data is drawn to memg graphics object. from which it is drawn to a form if it is obscured and then released by another window.
if the form itself resized the data plot needs to be redrawn to fit changed dimensions of the form.
this is double buffer. the float data is put into memg object wich then is painted to a form, so we dont see flick due to clearing the form and ploting data directly to a form.
Graphics *g = CreateGraphics();
creates graphics objects of the form in OnPaint event and the memg object is painted into it.
paint() and resize() is just stubs for OnPaint() and OnResize() events
9ine
|
|
|
|
|
Sorry, my fault I missed the g vs. memg variable.
Did you try only redrawing the Bitmap when the data changes and let DrawImage() scale the image to the size of the window? That way your plotting code would not execute during resizing of the window.
led mike
|
|
|
|
|
it is not possible, we need to plot a resized version of the plot like in magnifying the 1D plot by means of incresing size of the canvas
9ine
|
|
|
|
|
Sorry, I am not following that. Using DrawImage you can scale to whatever size you want.
led mike
|
|
|
|
|
The short answer is the .NET GDI runs in a way which precludes parts of it from being accelerated by a graphics card. The second issue is the extensive marshalling that goes on between .NET and the Win32 GDI layer.
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
|
|
|
|
|
Thats very silly, having so much of the product developed and failed to beat simple builder C++ application??? Consider even compilation times! I noticed that builder compiled app 1D plotting runs faster on modern video cards compared to simple ones from the last century.
I think there is another reason is the Bitmap object itself. In builder you can ajust bitmap canvas properties by simply adjusting its size without deleting the bitmap!
However in .NET Bitmap object it can be created only of the fixed size! and you can not change its dimensions during run-time. The possible sollution is to delet it and allocate a new one to fit the form during the resize method. But in __gc compiled resources you can not delete them the garbage cleaner do it. So if rely on the garbage cleaner to delete all the allocated Bitmaps during form resizing events you end up without free mem
Very silly.
9ine
|
|
|
|
|
probably the best application of the VC is the console ones
9ine
|
|
|
|
|
9ine wrote: In builder you can ajust bitmap canvas properties by simply adjusting its size without deleting the bitmap!
Some helper class is doing this, and probably deleting/recreating the bitmap in the background. Bitmaps are a fixed size, like any allocation of memory.
9ine wrote: . But in __gc compiled resources you can not delete them
You can Dispose them, which is the same thing, the unmanaged resource is cleaned up.
Christian Graus - Microsoft MVP - C++
Metal Musings - Rex and my new metal blog
|
|
|
|
|
dispose is of no help. consider resizing a window it is about dozen resize messages and you end up with no free mem. it does not delete the Bitmap object immediatly once executed!?
Thats the great disadvantage of .NET objects you can not resize them once allocated nor delete them
Simple Borland Builder posses all these features, the only disadvantage is its debugging process, VC provides more useful quickwatch.
9ine
|
|
|
|
|
9ine wrote: consider resizing a window it is about dozen resize messages and you end up with no free mem. it does not delete the Bitmap object immediatly once executed!?
Like I said, you can delete the bitmap every time, Dispose does this.
9ine wrote: Thats the great disadvantage of .NET objects you can not resize them once allocated nor delete them
NOR DOES BORLAND BUILDER !!!
9ine wrote: Simple Borland Builder posses all these features
You're just plain wrong. Borland cannot change the nature of Windows, it cannot create a world where you can resize a bitmap without deallocating and reallocating it. All it can do is hide the facts from you.
Christian Graus - Microsoft MVP - C++
Metal Musings - Rex and my new metal blog
|
|
|
|
|
then the builder is more succesfull in hiding windows facts from me than the native VC does.
dispose results in delayed memory deallocation
9ine
|
|
|
|
|
Yes, that is precisely what a wrapper does. MFC doesn't wrap bitmaps in a way to hide these facts. It's no different to std::vector or CArray. Using those, you'd never guess that you can't create an array and then just keep adding stuff to it without it having to reallocate memory. The class hides this task from you.
Christian Graus - Microsoft MVP - C++
Metal Musings - Rex and my new metal blog
|
|
|
|
|
I wonder if builder is using a DIB Section below the surface.
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
|
|
|
|
|
What is it. and is it useful?
The problem is to render promptly floating array of data to a window.
Once you created bitmap in Builder you can alter its size without deleting it. So without a flick you can plot the data you want.
.NET graphics is good for ploting image files not some floating array to fit a window.
Probably the only solution to a lame .NET graphics is opengl one?
9ine
|
|
|
|
|
http://www.3dsoftware.com/Programming/WindowsAPI/DIB_Section/[^]
Realize that builder isn't just alerting the size; it is recreating bitmaps below the surface and copying the old data to the new one. Using DIB Sections you could do this copy fairly quickly.
One solution is to write the code you want at the Win32 layer with C++/CLI. Another is to look around and see if any company is selling a toolkit that does what you want. I'd also suggest working with .NET some more and thoroughly understanding the graphics layer to make sure there isn't a great third solution I haven't thought of. (Oh, and you may need to rethink how you are doing your application. Perhaps a different algorithm on your part would make a purely .NET solution viable.)
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
|
|
|
|
|
Hi All,
I am New user for vc.net,
My code is
String ^str1=L"1",^str2=L"2",^str3=L"3";
String ^str=String::Format("{0}{1}{2}",str1,str2,str3);
MessageBox::Show(str);
But I want Increase the String length like
in VC++;
CString str;
str.Format("%25s%15s%15s",str1,str2,str3);
I want modify above code like that
Plz suggest me
Nagaraju
|
|
|
|
|
You need to look into formatting support in .NET. String.Format does not do formatting just template placement. ToString() supports formatting. Also see IFormatProvider and NumberFormatInfo etc.
String ^str=String::Format("{0}{1}{2}",str1->ToString(IFormatProvider),str2,str3);
led mike
|
|
|
|