|
I commented out just the pd.Print(); and it worked fine. No exceptions, correct bitmap saved each time.
I'm assuming the stack trace is the green arrow/highlight? If so, it points at the line PrintDocument pd = new PrintDocument(); .
Any ideas?
Mel
|
|
|
|
|
In case anyone needs it, the problem is in this line:
pd.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(PrintCurrentPage);
PrintCurrentPage looked like this:
private void PrintCurrentPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)<br />
{<br />
if (CurrentPage != null){CurrentPage = new Bitmap(@"C:\sCurrentPage.bmp");} <br />
}
I found that "When a bitmap image is loaded from a file the file remains locked open. This may be the root of the problem.
To overcome the file locking open the file on a stream, read the image from the stream and explicitly close the stream."
So I changed PrintCurrentPage to look like this:
if (CurrentPage != null)<br />
{<br />
FileStream fs = File.Open(@"C:\sCurrentPage.bmp", FileMode.Open, FileAccess.Read);<br />
Bitmap bm = (Bitmap)Bitmap.FromStream(fs);<br />
CurrentPage = bm;<br />
e.Graphics.DrawImage(CurrentPage, 0, 0);<br />
fs.Close();<br />
bm.Dispose();<br />
}
And it all worked fine.
Cheers,
Mel
|
|
|
|
|
Thank you!
Just needed it.
|
|
|
|
|
why it doesn't work? It show the draw i want, but when i write text the draw disappear:
public partial class UserControl1 : TextBox
{
public UserControl1()
{
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
this.BorderStyle = BorderStyle.None;
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
Pen p = new Pen(Color.Red ,3.0f);
g.DrawRectangle(p, new Rectangle(0, 0, this.Width, this.Height));
}
}
|
|
|
|
|
Sasuko wrote: but when i write text the draw disappear:
Do you mean that the text you type is never displayed? If so, I would expect this is happening because your OnPaint() method isn't writing it.
/ravi
My new year's resolution: 2048 x 1536
Home | Music | Articles | Freeware | Trips
ravib(at)ravib(dot)com
|
|
|
|
|
OnPaint doesnt fire for TextBox based controls. Its by design. You will have to hack with P/Invoke.
|
|
|
|
|
My assembly is compiled for 64-bit, it is calling an unmanaged DLL, also compiled for 64-bit.
The kicker is that "long" compiles to Int64 on my side whereas "long" compiles to Int32 on the unmanaged side (right?)
So if I declare the unmanaged API like this
[DllImport("MyDll.dll", SetLastError = false)]
static extern void FillTheLong
(
out long theLong,
);
And call it like this
long myLong = 0xFFFFFFFF;
long myOtherLong;
FillTheLong(out myLong, out myOtherLong);
I would expect to hose the stack, but nothing adverse happens across hundreds of calls like this. Hard to believe I am just getting lucky, is the runtime protecting me somehow.
Anybody got a pointer to resources on details of P/Invoke and marshaling?
Thanks
NIK
|
|
|
|
|
It depends. Does FillTheLong take a C++ long? Or an 8 byte integer (i.e. a C# long)?
If the former, your call will mess things up eventually; you'll have some bizzare errors occuring at some point most likely. If you have Visual Studio 2005 and you run this under a debugger, Visual Studio's Managed Debugger Assistant will catch this and let you know the stack is corrupted.
Tech, life, family, faith: Give me a visit.
I'm currently blogging about: Islamic Domination: Coming to a Jewish state near you!
The apostle Paul, modernly speaking: Epistles of Paul
Judah Himango
|
|
|
|
|
FillTheLong takes a C++ (32-bit) long, but I am passing a C# (64-bit) long.
in my example I should have been using
long myLong = 0x0F0F0F0FFFFFFFF;
There is a type mismatch, as confirmed by the fact that the value gets truncated.
I'm just surprised there isn't obvious stack corruption.
NIK
|
|
|
|
|
|
nicknotyet wrote: I'm just surprised there isn't obvious stack corruption.
Why would there be? Isn't that passed "by value". If the function parameter is only 32 bit then only a 32bit space is pushed onto the stack correct?
"What classes are you using ? You shouldn't call stuff if you have no idea what it does" Christian Graus in the C# forum
led mike
|
|
|
|
|
I'm not familiar with the physical layout of the stack, but yes as long as the construction of the callee's (unmanaged DLL) stack only pulls a 32-bit value from an allocated 64-bit space, then it should be ok.
Either way I still have re-write my code to explicitly use Int32 in place of long because of the truncation issues.
Thanks for the feedback.
|
|
|
|
|
nicknotyet wrote: Either way I still have re-write my code to explicitly use Int32 in place of long because of the truncation issues.
Do you need a 64-bit integer? Will you ever encounter numbers in your managed app that will be too big to fit in a 32-bit int?
Matt Newman
Even the very best tools in the hands of an idiot will produce something of little or no value. - Chris Meech on Idiots
|
|
|
|
|
Fortunately no, not for this assembly. The truncation will probably never be an issue, its just a matter of correctness at this point.
Nice quote, I'll try not to take it personally, and I will remind my boss of it if he ever tries to hire on the cheap.
Thanks for the response.
NIK
|
|
|
|
|
nicknotyet wrote: I would expect to hose the stack, but nothing adverse happens across hundreds of calls like this. Hard to believe I am just getting lucky, is the runtime protecting me somehow.
You could just be lucky with stack alignment, maybe there is some padded space. Why not step with the debugger , and look at the memory of the stack with proper and the wrong values?
|
|
|
|
|
1) Can't drill down from the managed side, maybe I need some education on this.
2) Tried debugging from the unmanaged side, but VS barfed.
Haven't had time to resolve either debugging issue. I wrote some code on the unmanaged side to show me what I needed to know and moved on.
Thanks for the response
NIK
|
|
|
|
|
Hi All,
Wondering if anyone has a good recommendation for a c# grid control? Looking for something that allows for "virtual grid" type of thing. I've tried ComponentOne, and wasn't crazy about theirs (too hard to customize). Anybody used one that they have been happy with?
|
|
|
|
|
SourceGrid[^] is a nice one, but be carefull, download it from the devage website (mentioned in the CP article) cause there is a new version already, but the CP articel gives a good shot what you can do with it.
|
|
|
|
|
Hey,
Thanks for the tip. This looks a heck of a lot better than the one we paid $500 to use. I suppose it's OK to use this in commercial software?
|
|
|
|
|
Yeah you can use it for commercial use, but I think you need some license information to put somewhere on it to then. You should look to the licensing information on the website. But it's completely free, no additional payments either.
We use it in a Windows form project and we copied the licensing information in the about screen on an extra tab.
|
|
|
|
|
Yes it is. And its really good. You will have to invest some time at first but after that its more flexible than any other grid I have seen (and I made a full week of evaluations before choosing the grid for my last project).
Unless you have the need to display hierarchical data go for it.
|
|
|
|
|
So far it looks really nice. I have no need for heirarchical data, but I do need some flexibility as far as the types of controls, styles in the grid, etc. SO far, I've been pretty disappointed in the commercial offerings and the lack of flexibility. I can see there's a little bit of a learning curve with it, but can tell the developers went to a lot of trouble to build in a great amount of extensibility.
|
|
|
|
|
hi all,
first: i want to show notifyicon's contextmenustrip if user clicks both right and left button of mouse ? (double <left> clicks will restore but single <left> click only shows the contextmenu)
second: if user clicks one of Minimize, Resize or Close buttons ( at right-up corner of form) i want to hide the form. only Exit button on contextmenustrip should close the the application.
how can i do the aboves ?
help please ...
|
|
|
|
|
first: search the event for mouse-click, and open a method for that, inside just write:
if ((e.Button == MouseButtons.Left) || (e.Button == MouseButtons.Right))<br />
contextMenuStrip1.Show(MousePosition);
this will check if some-one has pressed the right or left button, and will show the contextmenustrip at mouseposition.
second: again, search the events you want in the events (i.e formclosing for clicking close (X)), and open their methods, and write (this is for formclosing):
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true;
this.Hide();
}
|
|
|
|
|
I am making a search engine and i want the control to shift from the query box to search button automatically i.e if user presses enter after writing the query the search button automatically get pressed.. currently user has to use mouse to press the search button...
Looking farward to your help
Regards,
|
|
|
|