ToolTip Text zur Laufzeit ändern

michbach

Grünschnabel
Hallo Zusammen,

ich möchte einen ToolTip-Text während der Laufzeit ändern. Also das Grundgerüst (siehe Code) zur Erstellung eines ToolTip-Fensters habe ich schon aber irgenwie komme ich nicht weiter wie ich während der Laufzeit einen neuen Text (z.B. Uhrzeit etc.) zuweisen kann.

Es scheint irgendwie im Case-Zweig WM_NOTIFY mit case TTN_NEEDTEXT eine neue Zuweisung möglich aber bisher hab ich es noch nicht hinbekommen bzw. die Lösung in Google gefunden. Vieleicht kann jemand weiterhelfen, wäre Super! Gruss an Alle, michbach

PS: Mal ne Frage. Schon öfters ist mir beim googeln nach Lösungen aufgefallen dass es weit mehr MFC-Beiträge gibt als zu WinApi. WinApi scheint wohl nicht so gefragt zu sein oder täusche ich mich da? Ich hab halt mal mit Api angefangen weil ich ein Fenster basteln wollte und weil ichs vorher nicht besser wusste.. Ist wohl besser auf MFC zu wechseln, oder?

Code:
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "comctl32.lib")
#include <windows.h>
#include <commctrl.h>
#include <time.h>
#include <sstream>
#include <tchar.h>
using namespace std;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void CreateToolTipForRect(HWND hwndParent, int tt_nr);

HINSTANCE hInst;
HWND fe_haupt;
HWND bu_uhrzeit;
HWND *HW_TT	 = new HWND[50];

//####################################################################################################
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
  MSG  msg ;    
  WNDCLASS wc = {0};
  wc.lpszClassName = "Tooltip" ;
  wc.hInstance     = hInstance ;
  wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
  wc.lpfnWndProc   = WndProc ;
  wc.hCursor       = LoadCursor(0, IDC_ARROW);

  hInst = hInstance;
  RegisterClass(&wc);

  //XXX Hauptfenster und Button erstellen
  fe_haupt = CreateWindow(wc.lpszClassName,"Haupt",WS_OVERLAPPEDWINDOW|WS_VISIBLE,100,100,200,150,0,0,hInstance,0);  
  bu_uhrzeit = CreateWindow ("button","A",WS_CHILD|WS_VISIBLE,0,0,50,50,fe_haupt,(HMENU)100,hInstance,NULL) ;

  //XXX Tooltip-Fenster erstellen
  CreateToolTipForRect(fe_haupt, 0);	// für Hauptfenster
  CreateToolTipForRect(bu_uhrzeit, 1);	// für Button

  while( GetMessage(&msg, NULL, 0, 0)) 
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  return (int) msg.wParam;
}


//####################################################################################################
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
  switch(msg)  
  {
	//___________________________________
	case WM_NOTIFY:
		{
			switch (((LPNMHDR)lParam)->code) 
			{
				//****? case TTN_NEEDTEXT:
				//****? Zuweisung neuer Text
			}
		}
	break;
	//___________________________________
    case WM_DESTROY:
        PostQuitMessage(0);
    break;
  }return DefWindowProc(hwnd, msg, wParam, lParam);
}

//####################################################################################################
void CreateToolTipForRect(HWND hwndParent, int tt_nr)
{
	INITCOMMONCONTROLSEX ic;
	ic.dwSize	= sizeof(INITCOMMONCONTROLSEX);
	ic.dwICC	= ICC_TAB_CLASSES;
	InitCommonControlsEx(&ic);

    //XXX Tooltip-Fenster erstellen
    HW_TT[tt_nr] = CreateWindowEx(WS_EX_TOPMOST,TOOLTIPS_CLASS,NULL,WS_POPUP|TTS_NOPREFIX|TTS_ALWAYSTIP,	
    CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hwndParent,NULL,hInst,NULL);
    
	SetWindowPos(HW_TT[tt_nr],HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);

    //XXX Tool-Information
    TOOLINFO ti = { 0 };
    ti.cbSize	= sizeof(TOOLINFO);
    ti.uFlags	= TTF_SUBCLASS;
    ti.hwnd		= hwndParent;
    ti.hinst	= hInst;
	//ti.lpszText = "TestTest";

	if(hwndParent == fe_haupt){ti.lpszText = "Hauptfenster";}
	else if(hwndParent == bu_uhrzeit){ti.lpszText = "Button-Uhrzeit";}
    GetClientRect (hwndParent, &ti.rect);

    //XXX Associate the ToolTip with the "tool" window.
    SendMessage(HW_TT[tt_nr], TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);	
	SendMessage(HW_TT[tt_nr], TTM_ACTIVATE, true, NULL);
}
 
Bei TTN_NEEDTEXT musst du nur sowas machen:

NMTTDISPINFO* pTTHdr = (NMTTDISPINFO*)pHdr;
pTTHdr->lpszText = szTemp;
pTTHdr->hinst = NULL;

Denk aber dran, dass die Variable szTemp stehen bleiben muss, also nicht irgendwas Lokales sein darf.


Sich mit WinAPI auszukennen ist schon meistens ein grosser Vorteil, auch wenn man mit MFC arbeitet. MFC ist dann gut, wenn man eine grössere Anwendung bastelt. Da kommt schon ein stattliches Grundgerüst mit, auf dem man aufsetzen kann. Wenn man aber mal an MFC vorbei will, dann kommt einem das Wissen der WinAPI doch zugute. Die meisten Fälle kann man dann auch direkt nach MFC übersetzen, aber manche auch nicht.
 
Danke für die Antwort! Wenn ich mehr Zeit hab werd mir doch mal die Mühe machen und MFC näher anschauen :)
liebe grüsse, michbach
 
Zurück