Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Tooltip erzeugen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
17.01.2008, 20:34 Uhr
~Uilbeska
Gast


hallo,

ich kriege zum verrecken einen tooltip nicht erzeugt. habe jetzt der einfachheithalber versucht einen tooltip über die ganze client-area zu machen.

headerdatei der commctrl ist drin, das .lib file ist drin. InitCommControl() wird aufgerufen

hab mich an diesem beispiel orientiert: http://msdn2.microsoft.com/en-us/library/bb760252.aspx#tooltip_for_control

kann mir jemand sagen was falsch ist ?

C++:
// tooltip.cpp : Definiert den Einstiegspunkt für die Anwendung.
//

#include "stdafx.h"
#include "tooltip.h"
#include "commctrl.h"

#define MAX_LOADSTRING 100
#pragma comment(lib, "comctl32.lib")

// Globale Variablen:
HINSTANCE hInst;                                // Aktuelle Instanz
TCHAR szTitle[MAX_LOADSTRING];                    // Titelleistentext
TCHAR szWindowClass[MAX_LOADSTRING];            // Klassenname des Hauptfensters

HWND g_Butt;
void CreateToolTipForRect(HWND hwndParent);

// Vorwärtsdeklarationen der in diesem Codemodul enthaltenen Funktionen:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

     // TODO: Hier Code einfügen.
    MSG msg;
    HACCEL hAccelTable;

    // Globale Zeichenfolgen initialisieren
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_TOOLTIP, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // Anwendungsinitialisierung ausführen:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TOOLTIP));

    // Hauptmeldungsschleife:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}



//
//  FUNKTION: MyRegisterClass()
//
//  ZWECK: Registriert die Fensterklasse.
//
//  KOMMENTARE:
//
//    Sie müssen die Funktion verwenden,  wenn Sie möchten, dass der Code
//    mit Win32-Systemen kompatibel ist, bevor die RegisterClassEx-Funktion
//    zu Windows 95 hinzugefügt wurde. Der Aufruf der Funktion ist wichtig,
//    damit die kleinen Symbole, die mit der Anwendung verknüpft sind,
//    richtig formatiert werden.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style            = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra        = 0;
    wcex.cbWndExtra        = 0;
    wcex.hInstance        = hInstance;
    wcex.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TOOLTIP));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName    = MAKEINTRESOURCE(IDC_TOOLTIP);
    wcex.lpszClassName    = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassEx(&wcex);
}

//
//   FUNKTION: InitInstance(HINSTANCE, int)
//
//   ZWECK: Speichert das Instanzenhandle und erstellt das Hauptfenster.
//
//   KOMMENTARE:
//
//        In dieser Funktion wird das Instanzenhandle in einer globalen Variablen gespeichert, und das
//        Hauptprogrammfenster wird erstellt und angezeigt.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
   HWND hButt;

   InitCommonControls();

   hInst = hInstance; // Instanzenhandle in der globalen Variablen speichern

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);


   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  FUNKTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  ZWECK:  Verarbeitet Meldungen vom Hauptfenster.
//
//  WM_COMMAND    - Verarbeiten des Anwendungsmenüs
//  WM_PAINT    - Zeichnen des Hauptfensters
//  WM_DESTROY    - Beenden-Meldung anzeigen und zurückgeben
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
    case WM_CREATE:
        {
        CreateToolTipForRect(hWnd);
        break;
        }

    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Menüauswahl bearbeiten:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: Hier den Zeichnungscode hinzufügen.
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// Meldungshandler für Infofeld.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

void CreateToolTipForRect(HWND hwndParent)
{
   // Create a ToolTip.
    HWND hwndTT = 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(hwndTT, HWND_TOPMOST,
        0, 0, 0, 0,
        SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);

    // Set up "tool" information.
    // In this case, the "tool" is the entire parent window.
    TOOLINFO ti = { 0 };
    ti.cbSize = sizeof(TOOLINFO);
    ti.uFlags = TTF_CENTERTIP;
    ti.hwnd = hwndParent;
    ti.hinst = hInst;
    ti.lpszText = TEXT("This is your ToolTip string.");
    GetClientRect (hwndParent, &ti.rect);

    // Associate the ToolTip with the "tool" window.
    SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);    
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.01.2008, 09:35 Uhr
~Uilbeska
Gast


keiner ne idee?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.01.2008, 09:41 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
dein Tooltip-Info wird nach verlassen deiner Funktion zerstört, wodurch das info nicht mehr gültig ist -> kein tooltip
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.01.2008, 14:34 Uhr
~Uilbeska
Gast



Zitat von FloSoft:
Hi,
dein Tooltip-Info wird nach verlassen deiner Funktion zerstört, wodurch das info nicht mehr gültig ist -> kein tooltip


kann ich das problem mit einer static HWND Variablen lösen?

Mal eine generelle Fragen, binde ich den tooltip für die ganze laufzeit dann an das element, sprich einmal gesetzt bleibt er dort bis er explizit gelöscht wird oder das programm beendet wird?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.01.2008, 19:44 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



C++:
TOOLINFO ti = { 0 }; // <-- das ist das was zerstört wird beim verlassen der funktion, wodurch dein Zeiger den du
SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);   // <-- hier übergibst nicht mehr gilt dann später.


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.01.2008, 20:12 Uhr
~Uilbeska
Gast


ich hab die struktur mal global definiert, leider ohne den gewünschten effekt.

Wieso (sollen) eigentlich diese MSDN Beispiele dann klappen? da sind die Infostrukturen auch nur lokal in der funktion drin?!?
http://msdn2.microsoft.com/en-us/library/bb760252.aspx
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.01.2008, 12:02 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hmm okay, die Funktion scheint das wohl intern zu kopieren, zumindest sollte sie das.

Was mir noch auffällt, WM_CREATE könnte evtl zu "früh" zum Erstellen des Tooltips sein, benutz mal WM_INITDIALOG, bzw vergleich mal schritt für schritt deine Anwendung mit der des Beispiels.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
19.01.2008, 15:31 Uhr
~uilbeska
Gast


also ich bin mit meinem latein am ende, ich hab jetzt so ziemlich jede variation durch die ich bei msnd finden konnte.

die code-schnipsel laufen alle durch und alles wir sauber erstellt. ich weis nicht, warum er mir meinen tooltip nicht machen will.

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: