Laden...

Balloon-Help im Usercontrol

Erstellt von gernegut vor 20 Jahren Letzter Beitrag vor 20 Jahren 1.994 Views
G
gernegut Themenstarter:in
4 Beiträge seit 2004
vor 20 Jahren
Balloon-Help im Usercontrol

Hallo,

bevor ich den Code poste ein paar Worte zu meinem Problem. Ich greife über die User32.Dll unter WinXP auf die Balloon-Tipps zu. Nun wollte ich mir ein Usercontrol erstellen das von der System.Windows.Forms.TextBox abgeleitet ist und eine Methode bietet eben diese Balloon-Tipps je nach Kontext anzuzeigen. Gesagt, getan. Die Balloon-Tipps werden aber nicht angezeigt wenn ich über eine Host-applikation die Methode meines Controls aufrufe !? Der Debuger läuft durch die Methode des/meines Usercontrols aber anstandslos durch ?! Binde ich diese Klassen aber in ein Windows.Form ein dann werden diese Balloon-Tipps aber angezeigt, die selbe Funktionalität. Hier der Code des abgeleiteten Controls:

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace myspace
{
	public class stdTextBox : System.Windows.Forms.TexBox
	{
	private System.ComponentModel.Container components = null;

	public enum TooltipIcon : int
	{
		None,
		Info,
		Warning,
		Error
	}

	[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
	private struct EDITBALLOONTIP
	{
		public int cbStruct;
		public string pszTitle;
		public string pszText;
		public int ttiIcon;
	}

	private const int ECM_FIRST = 0x1500;
	private const int EM_SHOWBALLOONTIP = ECM_FIRST + 3;

	[DllImport("User32", SetLastError=true)]
	private static extern int SendMessage(
		IntPtr hWnd,
		int Msg,
		int wParam,
		IntPtr lParam);
		

	public stdTextBox(System.ComponentModel.IContainer container)
	{

	container.Add(this);
	InitializeComponent();

	}

	public stdTextBox()
	{
	InitializeComponent();
	}

	public void ErrorMsg(string errtitle, string errmsg)
	{
	EDITBALLOONTIP ebt = new EDITBALLOONTIP();

	ebt.cbStruct = Marshal.SizeOf(ebt);
	ebt.pszText = errmsg;
	ebt.pszTitle = errtitle;
	ebtiIcon = (int)TooltipIcon.Warning;

	IntPtr ptrStruct = Marshal.AllocHGlobal(Marshal.SizeOf(ebt));
			Marshal.StructureToPtr(ebt, ptrStruct, true);

	int ret = SendMessage(this.Handle, 
				EM_SHOWBALLOONTIP,
				0, ptrStruct);

	Marshal.FreeHGlobal(ptrStruct);
	}

Aufgerufen wird die Methode aus der Host-Applikation wie folgt:

private void stdTextBox1_Leave(object sender, System.EventArgs e)
{
if (stdTextBox1.Text != "14" && stdTextBox1.Text != "")
{
	stdTextBox1.Focus();
	stdTextBox1.ErrorMsg("Schwerwiegender Fehler","Hier darf nur die Bewertungskennziffer 15 eingegeben werden");
}

}

--> Bitte Codetags verwenden, Danke Noodles

Danke und Gruß