2011-05-05 33 views
10

पर बाध्य किए बिना विंडोज टूलटिप कंट्रोल का उपयोग कैसे करें मैं मूल विंडोज टूलटिप कंट्रोल (शुद्ध विन 32 एपीआई, एमएफसी सामान) का उपयोग करना चाहता हूं।किसी टूल

मैं दस्तावेज़ पढ़, ऐसा लगता है मैं टूलटिप नियंत्रण के लिए एक उपकरण संयोजित करना चाहते थे एक TTM_ADDTOOL संदेश भेजने के लिए है। इसके बाद ही मैं टूलटिप दिखाने के लिए TTM_TRACKACTIVATE & TTM_TRACKPOSITION भेज सकता हूं।

लेकिन मैं कहीं भी टूलटिप को प्रदर्शित करना चाहता हूं, जिसे मैं चाहता हूं। उदाहरण के लिए, जब माउस मेरी खिड़की के एक क्षेत्र में होवर करता है। यह क्षेत्र विंडोज की आंखों में एक उपकरण नहीं है, यह मेरी खिड़की में सिर्फ एक क्षेत्र है।

शायद मैं टूलटिप नियंत्रण में विंडो को बंधन कर सकता हूं, लेकिन इसका मतलब यह नहीं है कि मुझे टूलटिप नियंत्रण में बनाए गए हर विंडो को बंधन करना है?

क्या कोई आसान समाधान है ताकि मुझे हर विंडो के लिए TTM_ADDTOOL संदेश भेजने की आवश्यकता न हो?


मैंने वास्तव में कुछ कोड लिखा है, लेकिन टूलटिप बस प्रकट नहीं होता है। एंडर्स का जवाब वास्तव में कुछ प्रश्न हल करता है। और जब मैं अपने कोड के चारों ओर पोक करता हूं, तो मैं इसे काम करता हूं।

HWND toolTipWnd = ::CreateWindowExW(WS_EX_TOPMOST, 
      TOOLTIPS_CLASSW,0,WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, 
     CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, 
     0,0,appHandle,0); 

TOOLINFOW ti = {}; 
ti.cbSize = sizeof(TOOLINFOW); 
ti.uFlags = TTF_ABSOLUTE | TTF_IDISHWND /* | TTF_TRACK */; // Don't specify TTF_TRACK here. Otherwise the tooltip won't show up. 
ti.hwnd = toolTipWnd; // By doing this, you don't have to create another window. 
ti.hinst = NULL; 
ti.uId = (UINT)toolTipWnd; 
ti.lpszText = L""; 

::SendMessageW(toolTipWnd, TTM_ADDTOOLW, 0, (LPARAM)&ti); 
::SendMessageW(toolTipWnd, TTM_SETMAXTIPWIDTH,0, (LPARAM)350); 

यह एक टूलटिप विंडो जो किसी अन्य विंडो के लिए बाध्य नहीं है पैदा करेगा:

मामले में किसी को पता करने के लिए यह कैसे काम करना चाहता है। तो जब आप टूलटिप (जैसे में संदेश WM_MOUSEHOVER का जवाब) दिखाना चाहते हैं, इस फोन:

TOOLINFOW ti = {}; 
ti.cbSize = sizeof(TOOLINFOW); 
ti.hwnd  = toolTipWnd; 
ti.uId  = (UINT)toolTipWnd; 
ti.lpszText = L"Sample Tip Text"; 
::SendMessageW(toolTipWnd,TTM_UPDATETIPTEXTW,0,(LPARAM)&ti); // This will update the tooltip content. 
::SendMessageW(toolTipWnd,TTM_TRACKACTIVATE,(WPARAM)TRUE,(LPARAM)&ti); 
::SendMessageW(toolTipWnd, TTM_TRACKPOSITION,0,(LPARAM)MAKELONG(x,y)); // Update the position of your tooltip. Screen coordinate. 
//::SendMessageW(toolTipWnd,TTM_POPUP,0,0); // TTM_POPUP not working.. Don't know why. 

उत्तर

5

आप TTM_ADDTOOL कम से कम एक बार कॉल करने की आवश्यकता है, तो आप TTM_SETTOOLINFO फोन या AFAIK इसके बिना TTN_GETDISPINFO प्राप्त नहीं कर सकते।

यदि आपका लक्ष्य यह XP + आप किसी भी स्थान पर और किसी भी समय टिप प्रदर्शित करने के लिए TTM_POPUP उपयोग करने के साथ प्राप्त कर सकते हैं (लेकिन आप प्रारंभिक देरी अपने आप को जब तक आप एक ट्रैकिंग टूलटिप चाहते संभालने की ज़रूरत है) आम तौर पर आप

TTM_ADDTOOL को कॉल करें और इसे आयताकार (TOOLINFO.rect) या एक बाल विंडो से संबद्ध करें, या आप टेक्स्ट को LPSTR_TEXTCALLBACK पर सेट कर सकते हैं और TTN_GETDISPINFO को संभाल सकते हैं यदि सब कुछ एक टिप है। MSDN कुछ है sample code आप पर एक नज़र ...

+0

ठीक रखना चाहिए। मैं अंत में उस समस्या को हल करता हूं। देशी Win32 एपीआई के साथ काम करना एक सिरदर्द है। मैं इसे टीटीएम_POPUP के साथ काम कर सकता हूं लेकिन मैं इसे टीटीएम_TRACKPOSITION के साथ हल करता हूं। – MorrisLiang

+0

नमूना कोड में सब कुछ ठीक है ... धन्यवाद –

0

अलावा Windows 10 (विजुअल स्टूडियो 2015, Win32 कंसोल अनुप्रयोग)

#include "Commctrl.h"     
#pragma comment (lib,"comctl32.lib")  
#pragma comment(linker,"\"/manifestdependency:type='win32' \ 
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ 
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") 

TOOLINFOW ti = {}; 
ti.cbSize = sizeof(TOOLINFOW); 
ti.uFlags = TTF_ABSOLUTE | TTF_IDISHWND | TTF_TRACK ; // WITH TTF_TRACK! Otherwise the tooltip doesn't follow TTM_TRACKPOSITION message! 
ti.hwnd = toolTipWnd;      
ti.hinst = 0; 
ti.uId = (UINT)toolTipWnd; 
ti.lpszText = L""; 

LRESULT result; 
int error; 
if (!SendMessageW(toolTipWnd, TTM_ADDTOOLW, 0, (LPARAM)&ti)) { 
    MessageBox(NULL, L"Couldn't create the ToolTip control.", L"Error", MB_OK); 
    error = 0; 
    error = GetLastError(); 
} 
if (!SendMessageW(toolTipWnd, TTM_SETMAXTIPWIDTH, 0, (LPARAM)350)) { 
    MessageBox(NULL, L"Couldn't create the ToolTip control.", L"Error", MB_OK); 
    error = 0; 
    error = GetLastError(); 
} 
संबंधित मुद्दे