QuickInfo bei Buttons und Eingabefeldern

Olaf Lehmann

Mitglied
Bin inzwischen mit dem unter "Ordner im CFileDialog..." beschriebenen Telemetry-Programm gut voran gekommen. Nun wird es immer umfangreicher...und unübersichtlicher. Ich habe nun viele Schalter mit denen ich die einzelnen Kurven aus und einschalte und viele Eingabefelder zum anzeigen der Werte als Zahlen. Es wäre alles viel anwenderfreundlicher, wenn es mir gelänge QuickInfos zu verwenden. Wenn ich mit dem Mauszeiger über den Button oder noch wichtiger über das entsprechende Eingabefeld gehe sollte es doch zu machen sein, dass ein kleines Fenster aufklappt, in dem z.B. steht Geschwindigkeit in km/h usw, ähnlich wie man es in vielen Programmen sieht.
Lässt sich das auf die Schnelle (ohne umständliche Programmiererei) in VisualC++6.0 machen?
 

SunnyBunny

Mitglied
Hallo,

in der Header Datei Deines Dialoges legst Du Folgendes an:
Code:
CToolTipCtrl* m_pToolTip;

Und zwar an der Stelle wo Deine ganzen anderen Variabel sind:
Code:
// Dialogfelddaten
	//{{AFX_DATA(Dialog_MeinDialog_mit_QuickInfos)

In der Quellcode-Datei(.cpp) habe ich dann im OnInitDialog den folgenden Code verwendet:
Code:
m_pToolTip = new CToolTipCtrl;
	if(!m_pToolTip->Create(this))
	{
		MessageBox("ToolTip konnte nicht erstellt werden.(82)");
		return TRUE;
	}

	CString ToolTip1 ="ToolTip1";
	CString ToolTip2 ="ToolTip2";


	m_pToolTip->AddTool(&Controllvariabel_für_Editfeld1,ToolTip1 );
        m_pToolTip->AddTool(&Controllvariabel_für_Button1,ToolTip1 );
        m_pToolTip->AddTool(&Controllvariabel_für_Editfeld2,ToolTip1 );
        m_pToolTip->AddTool(&Controllvariabel_für_Editfeld3,ToolTip2 );

und so weiter.

Ich hoffe das hilft. Auf Static-Felder habe ich das übrigens nicht hinbekommen, auf Editfelder ganz sicher, bei Buttons habe ich es noch nicht ausprobiert.

Ich hoffe damit geholfen zu haben.

Gruß Sunny.
 

Olaf Lehmann

Mitglied
Heute hab ich mich mal rangesetzt und Deinen Code ausprobiert, Sunny Boy.

Es geschieht leider nichts.

Meine Header-Datei sieht nun so aus:

class CDateiDlg : public CDialog
{
// Konstruktion
public:
CDateiDlg(CWnd* pParent = NULL) ; // Standard-Konstruktor

// Dialogfelddaten
//{{AFX_DATA(CDateiDlg)
enum { IDD = IDD_DATEI_DIALOG };
CToolTipCtrl* m_pToolTip; //HIER NEUER CODE
CButton m_BUTTON22;
CEdit m_EDIT6;
CEdit m_CEdit7;
CListBox m_Liste1;
float m_Anzeige1;

usw...

Der OnInitDialog in der cpp-Datei sieht jetzt so aus:

BOOL CDateiDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Hinzufügen des Menübefehls "Info..." zum Systemmenü.

// IDM_ABOUTBOX muss sich im Bereich der Systembefehle befinden.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt
// wenn das Hauptfenster der Anwendung kein Dialogfeld ist
SetIcon(m_hIcon, TRUE); // Großes Symbol verwenden
SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden

// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
CListBox * pListBox = (CListBox *) GetDlgItem(IDC_LIST1);
if(RZahl>0) pListBox->AddString("E");

CScrollBar * pScrollBar1=(CScrollBar *)GetDlgItem(IDC_SCROLLBAR1);
pScrollBar1->SetScrollRange(0,0);
pScrollBar1->SetScrollPos(0);

CButton * pCheck = (CButton *) GetDlgItem(IDC_RADIO5);
pCheck ->SetCheck(1);

m_pToolTip = new CToolTipCtrl; //AB HIER STEHT DER NEUE CODE
if(!m_pToolTip->Create(this))
{
MessageBox("ToolTip konnte nicht erstellt werden.(82)");
return TRUE;
}
CString ToolTip1 ="ToolTip1";
CString ToolTip2 ="ToolTip2";

m_pToolTip->AddTool(&m_EDIT6,ToolTip1);
// m_pToolTip->AddTool(&Controllvariabel_für_Button1,ToolTip1 );
// m_pToolTip->AddTool(&Controllvariabel_für_Editfeld2,ToolTip1 );
// m_pToolTip->AddTool(&Controllvariabel_für_Editfeld3,ToolTip2 );

return TRUE; // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
}

m_EDIT6 ist eine Controllvariable, die ich für ein Editfeld angelegt habe.
Ich habs auch mit einem Button probiert, ebenfalls keine Reaktion.

Mir ist nicht ganz klar, wo das Programm abfragt über welchem EditFeld oder Button sich der Mauszeiger befindet. Vielleicht nch n Tipp?

Wie gesagt Visual C++6.0.

Danke
 

SunnyBunny

Mitglied
Hallo,

sorry war mein Fehler in der Schnelle:

Nach dem ganzen Zuweisen im OnInitDialog musst Du das Ganze noch aktivieren mit:

Code:
m_pToolTip->Activate(TRUE);

Und in der PretranslateMessage dann noch, genau wie Du fragst, damit er weiss, dass da was passiert:

Code:
if (NULL != m_pToolTip)
	{
		m_pToolTip->RelayEvent(pMsg);
	}

Naja und natürlich beim Beenden des Dialoges sauber die Control löschen:

Code:
delete m_pToolTip;

Ich hoffe so geht es dann. :)
Sonst einfach weiterfragen.

Gruß SunnyBunny
 
Zuletzt bearbeitet:

Olaf Lehmann

Mitglied
Vielen Dank, SunnyBunny,
nun läufts.

Wieder cwas gelernt, dank Deiner Hilfe.

Und die Anwenderfreundlichkeit des Programms steigt deutlich.

MfG
Olaf