|
In the future, if you believe a certain problem is with a product, you'd be better off asking in their forums (if possible). You can find more targetted advice and help with a particular product that way.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I have figured out how to open a JPG file and then resize it. However, I cannot find out how to save the resized image to a different File.
Can someone give me an idea where to start? (I'm using C#)
Mr Mike
|
|
|
|
|
Image.Save() method.
Mazy
You're face to face,
With the man who sold the world - David Bowie
|
|
|
|
|
I've donwloaded the cool CheckBoxItem control discussed here:
http://www.codeproject.com/aspnet/DataGridCheckBox.asp
It works fine when I bind to a DataTable, but when I bind to one of my custom objects (A collection of type ProcessMap), which has a boolean property of Exists, I get the error: "Specified cast is not valid"
I tracked it to this line in the CheckBoxItem:
<br />
string data = ((DataRowView) container.DataItem)[dataField].ToString();<br />
Basicaly it is expecting a DataRow to bind to. I know that the usual datagrid columns can bind to a custom object, no matter what it is. Anybody have any idea how to do this?
Thanks eveyone!
Also, when I figure it out, how do I re-submit the code? Just email him a new version?
|
|
|
|
|
The easiest way is to use the TypeDescriptor to get the properties and bind against the collection.
If want specific details of how the DataGridTextBoxColumn and DataGridBoolColumn work, you can use ildasm.exe (the IL Disassembler) that comes with .NET and view the IL (helps to understand Intermediate Language that is contained in assemblies), or use a good decompiler like .NET Reflector[^] to view the decompiled code (it's alright, but not always exact).
There's always good tips and tricks that the .NET developers use that can be handy to know.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Excuse my ignorance, i'm quite a novice to programming
my problem is i can't get my program to find the appropriate window handle for it to hide/minimize when the game is in fullscreen.... it will do it fine in windowed mode (i use process.mainWindowHandle property), but after i fullscreen it (Even if i go back) it won't find the right handle again...
i've seen pieces of code using the FindWindow(string window class, string window name) method from the Windows API (user32.dll) but it will return something well out of the bounds of a window handle (way out of the bounds of an integer :p )
so i made a class that is derived from a process.. i added a method called ToggleState()
(note, hWND is also set to "this.MainWindowHandle" in the constructor of the class)
<br />
public void ToggleState()<br />
{<br />
<br />
if ( IsWindowVisible(hWND) != 0 )<br />
{<br />
this.hWND = (int) this.MainWindowHandle;<br />
ShowWindow(this.hWND, SW_HIDE );<br />
}<br />
<br />
else if ( IsWindowVisible(hWND ) == 0 )<br />
{<br />
ShowWindow(hWND, SW_RESTORE );<br />
SetForegroundWindow(hWND);<br />
}<br />
}<br />
In summary: if i launch the game in windowed mode, it will work indefinately, but then if i fullscreen it (or start in fullscreen) it will cease to function (even if i go back to windowed)
i've tried other alternatives, like creating a new process object and doing GetProcessByName and then getting the main handle of THAT (still no luck)
Thanks for your time anybody who reads this
|
|
|
|
|
You really should read the .NET Framework SDK documentation, especially if you're just starting out. All controls in System.Windows.Forms already expose their window handles through the Handle property. And you don't need to P/Invoke ShowWindow - you just use Show and Hide (or set the Visible property accordingly). You can also control the full-screen behavior - as well as maximized, minimized, and normal states - all through the .NET Framework. Most of these classes just encapsulate the Windows APIs anyway.
If you're trying to do this for a separate process, things change. But judging by your code fragments, you're trying to do this to your own window. Is that correct?
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I used an ActiveX Object in my VB6 project like this:
obj = CreateObject("AAA.BBB");
When I tried to do the same thing in C# .Net project, I can't not find this object in "Add reference" dialog.
Does anyone know why?
Thanks in advance!
|
|
|
|
|
Choose Add Reference and find it through COM tab, then you can create it like this:
yourobject obj = bew yourobject();
Mazy
You're face to face,
With the man who sold the world - David Bowie
|
|
|
|
|
When you add an assembly reference (an interop assembly is created automatically for COM libraries), you must know in which library the COM object is contained.
To generate an ActiveX wrapper (known as a Runtime Callable Wrapper, or RCW) for this specific object, right-click on the toolbox and select Customize (or similar). Click the COM tab and find the control you're looking for. This generates a wrapper, which you can then use the new operator to instantiate. The typelib for that ActiveX control is converted to an interop assembly and automatically added to your project references.
.NET isn't VB6 - far from it. It's a type-safe runtime that manages memory and provides code access security, among many other things.
For more information on COM interoperability in .NET, see Interoperating with Unmanaged Code[^] in the .NET Framework SDK on MSDN Online, specifically the section Exposing COM Components to the .NET Framework[^].
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Thank you both very much, this is very helpful.
However I don't know which com dll I am using. Because this com dll is not provided for development purpose. It's registered by installing a specific software. I just happen to know this back door.
When I tried to find the same com in the COM tab in VS.Net, I can not find it. Then I went to my registry table, it didn't tell me which dll it's, it just showed like this under the CLSID folder: 'C:\program files\AAA\aaa.exe Automation'.
According to my understanding, VS.Net should be able to pick up the registered COM and show them in the COM tab.
Now I don't understand why in VB6 it is ok, but doesn't work in VS.Net. Is it because this COM doesn't register correctly?
Thanks in advance!
|
|
|
|
|
That's a not a back door. Going into your registry and finding out which executable contains the component is what COM does anyway. That's how it works.
It appears that this COM component you want is actually an out-of-proc automation server. You should still have no problems using it, but you first need to use the write "COM tab", or just create it manually using tlbimp.exe. If you're looking to add a COM component, you need to use the toolbox customization dialog, not the project references dialog. That would be to add an entire typelib.
It would help if you knew where the typelib for this automation server is located. Sometimes they are embedded in the executable itself, and sometimes they are external files. You can easily use tlbimp.exe on that to create an interop assembly.
You should also read the links I gave you. Again, .NET is not VB6 and works a little differently under the covers when dealing with COM.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Thanks again! I work it out with your help. It's a late-binding COM.
However another thing is I found late-binding in VS.Net is a bit more complicated than in VB6.
In VB6:
if com_obj.State.Result = com_obj.SUCCESS<br />
then<br />
.....
But In C#.Net, I have to do this:
object success = t.InvokeMember("SUCCESS", <br />
BindingFlags.Public |BindingFlags.GetProperty | BindingFlags.GetField, <br />
null, com_obj, null);<br />
<br />
object state = t.InvokeMember("State", <br />
BindingFlags.Public |BindingFlags.GetProperty | BindingFlags.GetField, <br />
null, com_obj, null);<br />
object result = result.GetType().InvokeMember("Result", <br />
BindingFlags.Public |BindingFlags.GetProperty | BindingFlags.GetField, <br />
null, state, null);<br />
if ( state.Equals(success) )<br />
....
Is it there any more convenient way in VS.Net to do the same thing?
Thanks in advance!
|
|
|
|
|
Because of the fundamental architecture of COM and .NET interoperability. The code you're doing is essentially what the VB virtual machine does in the background using the IDispatch implementation of automation classes (it finds the method by the DISPID and invokes it with the specified parameters).
You shouldn't have to do this, though. If you create your interop assembly correctly, you just use the classes and methods from that. That's what the interop assembly is for - wrapping the COM control in a runtime-callable wrapper (RCW).
Again, read that link about exposing COM components to the .NET Framework I posted before. It's important to truly understand and not just accept the first thing that works. If you keep doing what you're doing, it'll take you forever to finish! Do it right and create and use the interop assembly.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Hi,
I am working on an application which enumerates the shares from a remote computer and open it in explorer.
I have successfully got the names of the shares and now I am trying to open a directory lets say //station1/eBooks on the remote station1.
The behavior would be the same as typing //station1/eBooks on Run in Start Menu Or any other share scaner like shed. I have tried a new process for "explorer.exe" and passing the path as argument. It works fine for local shares but access denied instead of giving the login prompt for remote folders.
Anyone knows how to do it Plz reply. Thanks in advance.
|
|
|
|
|
I think you should do something liek this:
file://username:password@your/path
but I am not shure
Q:What does the derived class in C# tell to it's parent?
A:All your base are belong to us!
|
|
|
|
|
That syntax is no longer supported after the URL moniker was patch to fix a bug.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Accessing the path via .NET does not prompt for credentials. This is a function of the shell. .NET is not the shell. If you want to prompt for credentials, catch the exception, prompt for their username and password, and then impersonate the user and try reconnecting. For more information on impersonating a set of credentials, see the class documentation fo the WindowsImpersonationContext in the .NET Framework SDK, which also includes an example.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Thanks for your reply.
Let me restate by problem. I enumerate the shares, user doulbe click on the share in the list view, the share is opened in the explorer (if password is required windows asks for it itself). Its the same behaviour like lan netscan or any other share scan software.
Plz take a look at shed. Its a realy small software but great speed. Download link is below.
http://keir.net/shed.html
|
|
|
|
|
Sorry, I didn't quite understand you before. Take a look at System.Diagnostics.Process . You could invoke Windows Explorer on the share like so:
string path = "share path";
Process.Start("explorer.exe", string.Concat("/e,", path)); You can find more about the Windows Explorer command line switches at http://support.microsoft.com/default.aspx?scid=kb;en-us;130510[^].
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Alright, anyone knows how to put a ProgressBar as one of the panels in a StatusBar?
<font=arial>Weiye Chen
When pursuing your dreams, don't forget to enjoy your life...
|
|
|
|
|
Yes. First, make sure that StatusBar.ShowPanels is true , and add your panels. To make things easier, make your panel that will host the ProgressBar fixed-width (this is common in most apps beside).
Next, handle the StatusBar.DrawItem event. Your event handler should look something like the following (assume statusBar1 is your StatusBar , and progressBar1 is your ProgressBar ):
private void statusBar1_DrawItem(object sender, StatusBarDrawItemEventArgs e)
{
Rectangle bounds = e.Bounds;
bounds.Y = statusBar1.Top + SystemInformation.Border3DSize.Height;
bounds.Height += SystemInformation.BorderSize.Height * 2;
bounds.X -= SystemInformation.BorderSize.Width;
if (statusBar1.SizingGrip && ((Form)statusBar1.Parent).WindowState ==
FormWindowState.Maximized)
bounds.Width += SystemInformation.VerificationScrollBarWidth;
progressBar1.Bounds = bounds;
} This works, though there might be more elegant solutions you could search for.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Heath Stewart wrote:
though there might be more elegant solutions you could search for.
If a shorter code means elegant, perhaps this is one. Btw, thanks again.
private void statusBarBrowser_DrawItem(object sender, System.Windows.Forms.StatusBarDrawItemEventArgs sbdevent)
{
if(sbdevent.Panel == statusBarPanelProgress)
{
Rectangle rectPanel = sbdevent.Bounds;
rectPanel.Y += statusBarBrowser.Location.Y;
progressBarBrowser.Bounds = rectPanel;
}
}
<font=arial>Weiye Chen
When pursuing your dreams, don't forget to enjoy your life...
|
|
|
|
|
The reason some of that code was there because the code you have above won't draw quite right in the bounds specified by the StatusBarPanel , especially if you need to take a sizing grip into account.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Heath Stewart wrote:
especially if you need to take a sizing grip into account.
I see... I have disabled the sizing grip.
<font=arial>Weiye Chen
When pursuing your dreams, don't forget to enjoy your life...
|
|
|
|
|