Hallo!
Ich habe ein eigenes Steuerelement geschrieben. Ähnlich dem System.Windows.Forms.TabControl.
[ToolboxItem(true), ToolboxBitmap(typeof(RegisterCtrl), "RegisterCtrl"), Designer(typeof(Extends.Design.RegisterCtrlDesigner), typeof(IDesigner))]
public partial class RegisterCtrl : System.Windows.Forms.UserControl
{ ... }
Dieses verrichtet seinen Dienst sehr gut. Nur im Designer hat es nicht das selbe Verhalten wie das TabContol. Wenn man dort auf ein Tab klickt wird erst das Steuerelement ausgewählt und anschließend können die Tabs gewechselt werden.
Ich habe eine eigene Designer-Klasse erstellt. Die GetHitTest-Methode liefert immer true. Damit können schon mal die Tabs gewechselt werden. Aber jetzt kommt die Frage: Wie bekomme ich mit, ob das Steuerelement ausgewählt ist oder nicht??? Oder gibt es da eine andere Möglichkeit?
Hier meine Designer-Klasse:
class RegisterCtrlDesigner : System.Windows.Forms.Design.ParentControlDesigner
{
...
protected override bool GetHitTest(Point point)
{
// sollte false zurückliefern wenn noch nicht ausgewählt, sonst true
return true;
}
}
Danke für eure Hilfe!
LG René
Hallo,
ich habe ein Programm geschrieben, welches auf die Anwendung "XAnw" als COM-Server zugreift. hier ist die Objekt-Hierarchie:
1. Reihe 2. Reihe 3. Reihe
obj1_0 obj2_0 obj3_0
obj1_1 obj2_1 obj3_1
obj1_2 obj2_2 obj3_2
......... ........ ........
obj1_n obj2_n obj3_n
also ich kann die Applikation starten und leider NUR auf die Objekte der 1. Reihe bzw. auf ihre Methoden und Eigenschaften zugreifen und zwar folgendes:
XAnw.Application meinXAnw;
meinXAnw = new XAnw.Application();
//1.Reihe
XAnw.Obj1_0 mObj;
mObj = (CAnw.Obj1_0) meinXAnw.Obj1_0;
mObj.Start();
Aber auf die die Objekte der 2. und 3. Reihe bzw. auf ihre Methoden und Eigenschaften kann ich leider NICHT zugreifen bzw. ansprechen? ich habe versucht auf die gleiche Weise über ein doppeltes casting darauf zugreifen aber geht nicht!!!
wie mache ich das denn? ich bin auf ihre Hilfe angewiesen.
Danke sehr
Sorry ich glaube ich habe mich etwas unverständlich ausgedrückt :=) Ich möchte einen Text in einem externen Game darstellen. Ich möchte einen Text anzeigen lassen der über allem drüber steht. Er soll auch in Vollbild Anwendungen sichtbar sein.
Hallo,
das geht so:
http://www.microsoft.com/germany/msdn/library/net/csharp/MitCSharpArbeitenVerwendenVonWin32UndAnderenBibliotheken.mspx?mfr=true
Jockel
Das is für mich einfach nur ein verhunztes Design weil ich dann nicht mehr von Spezialisierung sprechen kann sondern das gesammte System in Frage stelle.
Was wenn es dann Spezial3 gibt, die write von Spezial2 überspringen muss und die von spezial1 und base benötigt ?
AFAIK wird das protected nicht helfen da write_real in in Spezial2 nicht aufgerufen werden kann. (Wurde in Spezial1 zu priavate).
Macht man es public oder internal hat jede Klasse plötzlich die Möglichkeit write_real aufzurufen und man kann so dringend notwendige Initialisierungen umgehen.
Das ist für mich kein Funktionierendes Interface. Das ist mehr pfusch als in Spezial1 ne protected bool einzufügen und das entsprechend in spezial1::write zu prüfen. Das kann dann durch Spezial2 angepasst werden. (Aber das ist auch keine Spezialisierung mehr wie ich sie gerne hätte :o( )
MisterX schrieb:
Wenn ich nun die größe der Form durch ziehen mit der Maus verändere, werden logischerweise die Ränder abgeschnitten
Überhaupt nicht logisch sondern eine Frage der Einstellung. Stell mal den Anchor-Parameter deiner Child-elemente richtig ein
indem Du einen Rechtsclick auf "References" machst und den Menüpunt "Add" auswählst, dann im folgenden Auswahlfenster "System.management" auswählst und OK clickst?
Das Paint - Event sollte dir weiterhelfen.
Hinterleg in einer Membervariablen die Koordinaten (z. B. bei einem Buttonclick).
Im Paint Event Handler zeichnest du dann das Kreuz an die jeweilige Position.
Um das Paint Event "von Hand" auszulösen, muss die Methode "Refresh()" der PictureBox aufgerufen werden.
myPictureBox.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
namespace foo
{
public partial class myPictureBox : PictureBox
{
Rectangle m_position;
public myPictureBox()
{
InitializeComponent();
m_position = new Rectangle(0, 0, 10, 10);
}
private void myPictureBox_Paint(object sender, PaintEventArgs e)
{
Pen pen = new Pen(Brushes.Red);
e.Graphics.DrawEllipse(pen, m_position);
}
private void myPictureBox_MouseClick(object sender, MouseEventArgs e)
{
m_position.X = e.X;
m_position.Y = e.Y;
// force paint event
this.Refresh();
}
}
}
myPictureBox.Designer.cs
namespace foo
{
partial class myPictureBox
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
((System.ComponentModel.ISupportInitialize)(this)).BeginInit();
this.SuspendLayout();
//
// myPictureBox
//
this.Paint += new System.Windows.Forms.PaintEventHandler(this.myPictureBox_Paint);
this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.myPictureBox_MouseClick);
((System.ComponentModel.ISupportInitialize)(this)).EndInit();
this.ResumeLayout(false);
}
#endregion
}
}
Es hat sich schon erledigt, da ich den Wert nicht mehr vergleichen muss. Wenn jemand aber Lust hat, kann er mich trotzdem gerne aufklären.
Ich habe ein string-Array, in diesem Array möchte ich, dass im ersten string des Arrays der dritte Buchstabe(also wieder ein Array - char-Array) mit einem anderen Buchstaben verglichen wird.
Beispiel:
public string[] Str = new string[2];
Str[0] = "Grafwald"
string [0][5] == 'w'
so ich habs jetz etwas umgemodelt. es gibt nämlich nen bitmap-konstruktor mit dem ptr auf die pixeldaten. mein einziges problem ist genau dieser IntPtr.
public Bitmap (
int width,
int height,
int stride,
PixelFormat format,
IntPtr scan0
wie bekomm ich ihn dazu das der IntPtr auf mein array zeigt?
Falls es mal jemanden interssiert, hab eine Lösung gefunden. Allerdings nicht mit DataGRidView, sondern mit SourceGrid. http://www.devage.com/Wiki/ViewArticle.aspx?name=sourcegrid&version=0
Meiner Meinung nach keine schlechte Alternative zu DataGrid / DataGRidView.
Die derzeitige Lösung schaut so aus:
internal interface IAbfrageObjekte
{}
public abstract class Basis : IAbfrageObjekte
{}
class Text : Basis
{
internal static Basis Create()
{
return new Text();
}
internal override void Register()
{
Fabrik.reg(FeldTypen.Text, Create);
}
public delegate Basis Creator();
public static class Fabrik
{
public static void fakeinit_Fabrik(){}
static System.Collections.Generic.Dictionary<FeldTypen, Creator> objects;
static Fabrik()
{
objects = new System.Collections.Generic.Dictionary<FeldTypen, Creator>();
Assembly asm = Assembly.GetExecutingAssembly();
foreach (Type typ in asm.GetTypes())
{
if (typ.IsAbstract || typ.GetInterface("IAbfrageObjekte") == null)
continue;
Basis b = (Basis)asm.CreateInstance(typ.FullName);
b.Register();
}
}
public static void reg(FeldTypen typ, Creator c)
{
objects.Add(typ, c);
}
}
Es gefällt mir aber nicht.
a) ich hab keine Erfahrung mit Reflections
b) ich muss mühsig alle Typen untersuchen ob diese zur Fabrik gehören
c) ich muss davon eine Instanz erstellen um die Reg Methode der eigentlichen Klasse aufzurufen.
Der Aufwand gegenüber der alten C++ Lösung ist enorm. Ich hoffe das es eine bessere Möglichkeit gibt, sonst muss ich doch jede einzelne Klasse manuell ansprechen was bei der Anzahl der zu erwartenden Klassen Fehleranfällig wird :o(
Ich kann dir leider nur in C# weiterhelfen, aber im Prinzip müsste es in VB.net ähnlich funktionieren.
Wenn du Arrays marshalen willst, musst du vorher die Größe des Arrays angeben.
In C# geschieht das über ein Attribut:
[MarshalAs(UnmanagedType.ByValArray, SizeConst=5)]
byte[] b;
And dieser Stelle wird jetzt davon ausgegangen, dass ein ByteArray mit der Länge 5 verwendet wird. Wenn du die Größe vorher nicht weist, fällt mir eigentlich nur noch Handarbeit ein (oder unsicheren code zulassen, hab ich aber noch nie probiert und kann deshalb auch nichts dazu sagen).
Du musst die Struktur selbst Byte für Byte durchlaufen und damit ein byteArray füllen. Dieses Byte Array bekommst du dann mit Marshal.Copy(...) unmanaged - und rückwärts genau gleich - Den Pointer Byte für Byte auslesen und damit die Struktur füllen.
@CMatt und AndreasW: Ich sehe gerade das ich die Frage im falschen Forum gestellt habe. Könntet Ihr es zum Framework Forum verschieben?
http://www.c-plusplus.net/forum/viewforum-var-f-is-58.html
Nein, dort ist der übliche Weg, ein Interface zu definieren und anstelle eines Delegate-Objekts eine Instanz des Interfaces weiterzureichen (z.B. für Event-Listener). Wenn man diese Instanz des Interface mit einer Delegate-Instanz vergleicht, hat man dadurch mehr oder weniger das selbe erreicht.
Delegates sind aber ein schöneres Konstrukt IMHO, weil weniger Schreibarbeit erforderlich ist (anonyme Methoden vs. anonyme Klassen) und sie auch nette Sachen wie Futures gleich mitbringen. Man kann ein Delegate asynchron aufrufen und kriegt ein Handle zurück mit dem man irgendwann viel später sich das Ergebnis holen kann.