Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Реализация ТулТипса


Автор: Moonlit_angel 12.10.2007, 12:13
Имеется код для реализации ТулТипса. При его вписании у меня дергается окно программы, как лапповый телик, что вот вот да и сгорит...

Хедер
Код

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// TableToolTip.h : header file
//
namespace RsUiSpecifications
{

/////////////////////////////////////////////////////////////////////////////
// TableToolTip window

typedef BOOL (*TRANSPARENTWINDOWPROC)(
HWND hwnd, // handle to the layered window
COLORREF crKey, // specifies the color key
BYTE bAlpha, // value for the blend function
DWORD dwFlags // action
);

class TableToolTip : public CWnd
{
// Construction
public:
    TableToolTip();

// Attributes
public:

// Operations
public:
    /// @ create the tool tip
    BOOL Create(CSize szSize, CWnd *pWnd = NULL);

    /// @ adjust tip size
    void SetToolTipSize(CSize szSize);

    /// @ Show tip 
    void ShowTips(int nX, int nY,CString sSizeTxt);

    /// @ hide tip
    void HideTips();

    /// @ Set back ground color
    void SetBkColor(COLORREF clrBack);

    /// @ Set tip text color
    void SetTipTextColor(COLORREF clrText);

    /// @ Set Frame color
    void SetFrameColor(COLORREF clrFrame);


// Implementation
public:
    virtual ~TableToolTip();
private: 
    CPoint  m_ptOrg;
    CSize   m_TipSize;
    CString m_strTips;
    COLORREF m_clrBack;
    COLORREF m_clrText;
    COLORREF m_clrFrameColor;

    // Generated message map functions
protected:
    //{{AFX_MSG(C_ColorToolTip)
    afx_msg void OnPaint();
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};
}



Соурсе 
Код

// TableToolTip.cpp : implementation file
//

#include "stdafx.h"
#include "TableToolTip.h"

#ifndef  WS_EX_LAYERED
#define  WS_EX_LAYERED           0x00080000
#endif

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

using namespace RsUiSpecifications;

/////////////////////////////////////////////////////////////////////////////
// TableToolTip

TableToolTip::TableToolTip()
:m_ptOrg(0,0),
m_TipSize(0,0)
{
    m_clrFrameColor = RGB(155, 110, 53);
    m_clrBack = RGB(249, 249, 238);
    m_clrText = RGB(0, 0, 0);

}

TableToolTip::~TableToolTip()
{

}


BEGIN_MESSAGE_MAP(TableToolTip, CWnd)
    //{{AFX_MSG_MAP(TableToolTip)
    ON_WM_PAINT()
    ON_WM_ERASEBKGND()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()


BOOL TableToolTip::Create(CSize szSize, CWnd *pWnd)
{
    HWND hWnd = NULL;
    if (pWnd != NULL && IsWindow(pWnd->m_hWnd))
    {
        hWnd = pWnd->m_hWnd;
    }
    // register class 
    LPCTSTR lpszClassName = AfxRegisterWndClass(NULL);
    BOOL bRet = CreateEx(WS_EX_TOPMOST | WS_EX_TOOLWINDOW, lpszClassName, _T(""),
        WS_POPUP /*| WS_BORDER*/, 0, 0, 1, 1, NULL, NULL);
    if (bRet)
    {
        MoveWindow(CRect(m_ptOrg, szSize));    
        m_TipSize = szSize;
    }
    return bRet;
}

void TableToolTip::SetToolTipSize(CSize szSize)
{
    if (IsWindow(m_hWnd))
    {
        MoveWindow(CRect(m_ptOrg, szSize));
    }
}

void TableToolTip::ShowTips(int nX, int nY, CString sSizeTxt)
{      
      m_ptOrg = CPoint(nX, nY);
      m_strTips = sSizeTxt;
      MoveWindow(nX, nY, m_TipSize.cx, m_TipSize.cy, TRUE);
      if (!IsWindowVisible())
      {
         ShowWindow(SW_SHOW);
      }
      Invalidate(TRUE);  
}


/////////////////////////////////////////////////////////////////////////////
// TableToolTip message handlers

void TableToolTip::OnPaint() 
{
    CPaintDC dc(this); // device context for painting
    
    // TODO: Add your message handler code here
    CRect rtWin;
    GetClientRect(rtWin);
    dc.FillSolidRect(rtWin, m_clrBack);
    dc.SetBkMode(TRANSPARENT);
    dc.Draw3dRect(rtWin, m_clrFrameColor, m_clrFrameColor);
    dc.SetTextColor(m_clrText);                
    dc.DrawText(m_strTips, rtWin,  DT_CENTER |DT_VCENTER | DT_SINGLELINE);    
}


BOOL TableToolTip::OnEraseBkgnd(CDC* pDC) 
{
    // TODO: Add your message handler code here and/or call default    
    // return CWnd::OnEraseBkgnd(pDC);
    return TRUE;
}

void TableToolTip::HideTips()
{
    if (IsWindow(m_hWnd))
    {
        ShowWindow(SW_HIDE);
    }
}


void TableToolTip::SetBkColor(COLORREF clrBack)
{
    m_clrBack = clrBack;
}

void TableToolTip::SetFrameColor(COLORREF clrFrame)
{
    m_clrFrameColor = clrFrame;
}

void TableToolTip::SetTipTextColor(COLORREF clrText)
{
    m_clrText = clrText;
}




Реализация ( результатом должен быть вывод и в хедер таблицы параметр и так же тул типсом)
Код

void CTableTempGrid::OnColSizing(int col, int *width)
{
   CBaseGridCtrl::OnColSizing(col, width);

   int iTableCol = GetTableColumn(col);
   CString sSizeTxt;
  
   int iNewWidth = (int)GetSizeInTable((*width), true);
   sSizeTxt.Format("%s%d", LOAD_STRING(IDS_TABLETEMP_WIDTH),iNewWidth); 
   //TableToolTip ToolTip;
   CDataColumn* pCol = m_pTempData->GetColumn(iTableCol);
   
   if (pCol->IsA() == CCellBase::CTDYNAMICCOLUMN)
   {
       int iFirstDynColInd = GetGridColumnIndex(iTableCol);

       for (int i = iFirstDynColInd; i < iFirstDynColInd+3; i++)
       {
          if (col == i)
             continue;
          SetColWidth(i, *width);
          QuickSetText(i, -1, sSizeTxt);
         //m_Tips.ShowTips(i, -1, sSizeTxt);   // это то что я реализую, но в результате просто дёргаутся окно...
        
       }
                 QuickSetText(col, -1, sSizeTxt);
    //m_Tips.ShowTips(col, -1, sSizeTxt);
      
   }
   else
   {
      QuickSetText(col, -1, sSizeTxt);  // эта функция в хедер грида выводит "Ширина - хх"
                //m_Tips.ShowTips(col, -1, sSizeTxt);
   }
      
}


 Что я не дописала или где моя ошибка ???!  smile 

Автор: Rapalex 12.10.2007, 15:49
А чем тебе виндовый тултип не угодил?
Его используй...

Автор: Moonlit_angel 15.10.2007, 10:48
Дело в том, что тут идет реч о сетке. Винндовский ... А думаеш прокатит ??? Да, ктсате, с этим, что пытаюсь реализовать, в дочернем окне не выводит даже мессаги, а корнемое окно, дрыгается, как при последнем вздохе, при драгинге...

Автор: Rapalex 15.10.2007, 12:06
Цитата(Moonlit_angel @  15.10.2007,  10:48 Найти цитируемый пост)
Дело в том, что тут идет реч о сетке

Непонял, причём ту то над чем он появлятся будет.

Цитата(Moonlit_angel @  15.10.2007,  10:48 Найти цитируемый пост)
 Винндовский ... А думаеш прокатит ???

А что с ним не то?

Автор: Moonlit_angel 15.10.2007, 12:53
Код


void RsBitmapButton::SetTooltip(UINT strId, HINSTANCE hInstance)
{
   CString tooltip;
   tooltip.LoadString(hInstance, strId);
   CButton::SetWindowText(tooltip);
}




Такова структура ?? Виндовского ?? Или есть проще что-то ?

Автор: FREEDEV 15.10.2007, 13:21
что-то типа этого:

Код

this->toolTip1->ToolTipIcon = System::Windows::Forms::ToolTipIcon::Info;
            this->toolTip1->ToolTipTitle = L"Title";
            this->toolTip1->SetToolTip(this->button1,"Text");


Добавлено через 47 секунд
это для 2005. Ассоциируем тул тип с конкретной кнопкой

Автор: Moonlit_angel 15.10.2007, 13:32
Ещё, мне не на буттон нужен тул тип... а чтоб он зависал вместе с хедером..

Добавлено через 9 минут и 46 секунд
У меня нет кнопок!!! У меня только сетка!!!

Автор: Rapalex 15.10.2007, 14:15
И что, туттип может над чем угодно висеть, при желании его можно заставить висеть в любой точке экрана.
Юзай TOOLTIPS_CLASS и TTM_TRACKPOSITION

Автор: Moonlit_angel 15.10.2007, 15:02
В любой точке экрана - да, его к мышке в таком случае привязать... 
http://www.codeproject.com/useritems/Color_Tool_Tip.asp?df=100&forumid=460615&exp=0&select=2234813
И опять же, тут есть к чему привязать.. Хм... Хотя на мысль натолкнул...
Кстате, в моём случае эта реализация не подошла, так как у меня не одно, а 2 как ми окна, а он всё время перерисовывает коренное окно... Вот...  smile 

Автор: FREEDEV 15.10.2007, 16:27
.. ну. на том же кодепрожекте не льзя порыскать! Там столько примеров на эту тему:
http://www.codeproject.com/miscctrl/tooltipex.asp

рась 
Создаешь тул тип и указываеш родительское окно для него
Код

tooltip.Create(this)
tooltip.AddTool(GetDlgItem(IDC_CONTROL), 
               _T("Tooltip text\rThis is the extended\ntooltip text"));


дьва 
обрабатываешь сообщение TTN_NEEDTEXT
при отображении тултипа (функция OnToolTipNotify) установи в него нужный текст
Код

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
... 
ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipNotify)
END_MESSAGE_MAP()

BOOL CMyDlg::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult)

    TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR; 
    UINT nID = pNMHDR->idFrom;

    if (nID == IDC_CONTROL) // Fill in the text buffer
    {
        _tcscpy(pTTT->szText, _T("Tooltip text\rExtended tooltip text"));
        return TRUE;
    }

    return FALSE;
}



http://www.codeproject.com/combobox/cexlistboc.asp пример создания ListBoxa с поддержкой ToolTipa

Добавлено через 6 минут и 42 секунды
Цитата(Moonlit_angel @  15.10.2007,  15:02 Найти цитируемый пост)
Кстате, в моём случае эта реализация не подошла, так как у меня не одно, а 2 как ми окна, а он всё время перерисовывает коренное окно... Вот...   


че перерисовывает, какие 2 окна?
ты его на каждое перемещение курсора выводишь?

Добавлено через 7 минут и 12 секунд
прикрепи проект сюда

Автор: Moonlit_angel 15.10.2007, 18:10
Нет, значит имеентся базовое окно->окно темплайта таблицы. В нём грид... И при драгинге нужен этот выводится в хедер таблицы длинна\высота, но когда сужаешь до 1 или же 0,5 , естественно не видно что в таблице, какие данные. Эти данные нужно в тултип вувести. Но твой метод попробую... Надеюсь всё получится...
Прикрепляю именно тот сррб что связан с задачей.. Если весь проект... он тяжёлый... 

Автор: FREEDEV 15.10.2007, 19:20
Цитата(Moonlit_angel @  15.10.2007,  18:10 Найти цитируемый пост)
нужен этот выводится в хедер таблицы длинна\высота, но когда сужаешь до 1 или же 0,5 , естественно не видно что в таблице, какие данные. Эти данные нужно в тултип вувести.


т.е. когда ведешь по таблице (ширина которой меньше ширины текста) мышкой, сразу же выводится тултип. В таком варианте нужно реализовывать свой контрол.


Цитата(Moonlit_angel @  15.10.2007,  18:10 Найти цитируемый пост)
Если весь проект... он тяжёлый... 

нужно облегчить  smile  что б можно было запустить и посмотреть что происходит

Автор: Moonlit_angel 15.10.2007, 21:16
Цитата

т.е. когда ведешь по таблице (ширина которой меньше ширины текста) мышкой, сразу же выводится тултип. В таком варианте нужно реализовывать свой контрол.


Тул тип должен постоянно висеть...

Цитата

нужно облегчить    что б можно было запустить и посмотреть что происходит 



Ем... Если толко скришот...Весб код сдесь не влезит... Увы...  smile 

Автор: Moonlit_angel 16.10.2007, 16:21
Как в случае с сеткой создать Control, чтоб к нему прикрепить тултип??

Автор: FREEDEV 16.10.2007, 18:35
унаследуйся от сетки которую используешь
давал же ссылку http://www.codeproject.com/combobox/cexlistboc.asp smile

Автор: Moonlit_angel 19.10.2007, 09:12
OnInitialDialog() - эта функция обязательна?? И какие обязательные функции ТулТипсу ??
P.S. : Уже не первый раз я пытаюсь реализовать на примерах, но видимо что-то упускаю, т.к. код просто игнорирует участки этого кода, т.е. дебуг проходит, результат работы = 0  smile

Добавлено через 9 минут и 9 секунд
 smile  реализации стандартного тул типса!

Автор: Rapalex 19.10.2007, 09:35
Читай MSDN

Автор: Moonlit_angel 19.10.2007, 10:59
Так читала и ни его один... Но на счет таких вещей как OnInitDialog(), PreTranslateMessage(MSG* pMsg), DoDataExchange(CDataExchange* pDX) и подобного ничего не оговаривается, но одни это используют в примерах, другие нет... Млин.. еслиб апликация маленькая была.. я бы тут не сидела... smile 

Автор: FREEDEV 20.10.2007, 17:35
Цитата(Moonlit_angel @ 19.10.2007,  09:12)
 smile  реализации стандартного тул типса!

вот посмотри

Автор: Moonlit_angel 22.10.2007, 12:43
Уф... Вот что ему на этот раз не нравится ?? Вроде по инструкции всё...
Код

BOOL CTableTempGrid::OnToolTip(CString sSizeTxt)
{
    CDialog InitDialog;
    InitDialog.OnInitDialog();
    m_ToolTip.Create(this);
    m_ToolTip.AddTool(this, _T(sSizeTxt)/*,CRect (100, 100, 200, 200)*/);
    m_ToolTip.Activate(TRUE);
    //m_ToolTip.RelayEvent( this);
    return TRUE;
}
BOOL CTableTempGrid::PreTranslateMessage (MSG* pMsg)
{
    m_ToolTip.RelayEvent(pMsg);
    return CTableTempGrid::PreTranslateMessage(pMsg);
}


дебуг проходит успешно, но когда в программе уже нажимаю иконку, которое вызывает окно, где должен быть реализован тултипс мне кидает вот это... ->


AFXCMN_INLINE void CToolTipCtrl::RelayEvent(LPMSG lpMsg)
    { ASSERT(::IsWindow(m_hWnd));  ::SendMessage(m_hWnd, TTM_RELAYEVENT, 0, (LPARAM)lpMsg); }

т.е. уведомление о том, что unhandled exeption...

Автор: FREEDEV 22.10.2007, 16:31
ну если уж так делать, то можно в OnInitDialog создать один раз его
Код

m_tt.Create(this,TTS_ALWAYSTIP);
m_tt.AddTool(this," ");
m_tt.Activate(TRUE);


а в onToolTip просто ставить ему нужный текст 
m_tt.UpdateTipText(sSizeTxt,this);

за основу какой грид берется?

Автор: Moonlit_angel 25.10.2007, 15:39
Цитата

за основу какой грид берется? 

 Базовый.
1) что возвращять в onToolTip ??
2) BOOL CTableTempGrid::PreTranslateMessage (MSG* pMsg) <-это нужно ??
Код

BOOL CTableTempGrid::PreTranslateMessage(MSG *pMsg )
{
    m_ToolTip->RelayEvent(pMsg);
    return CDialog::PreTranslateMessage(pMsg);
}

Tакой вариант не подходит...  Т.е. класс CDialog я исползывать не могу... Унаследовав его - в базавом классе не мало функций перестают работать... И естественно - дебугер уведомлиает об ощибках...

 Да, еще, базовый класс унаследуетя от CWnd, как поступать в етом лучае?

Автор: Moonlit_angel 30.10.2007, 12:35
С классами все рещилось. Теперь другой вопрос: 
Код

void CTableTempGrid::OnToolTip(CString &sText)
{
    m_ToolTip.Create(this);
    CRect rect;
    GetWindowRect(&rect);
    ScreenToClient(&rect);
    m_ToolTip.AddTool(this, "", &rect);;
    m_ToolTip.Activate(TRUE);
}


Код

BOOL CTableTempGrid::PreTranslateMessage(MSG* pMsg) 
{   
    ScreenToClient(&pMsg->pt);
    CRect rect;
    GetClientRect(&rect);
    m_ToolTip.UpdateTipText(sText, this);
    m_ToolTip.RelayEvent(pMsg);
   return CBaseGridCtrl::PreTranslateMessage(pMsg);
}


Код

...
 SetColWidth(i, *width);
          QuickSetText(i, -1, sSizeTxt);
          OnToolTip(sText);        
...


 Цто не так?? Он мне тыла так и не выводит...

Автор: Moonlit_angel 10.11.2007, 11:54
Пасиб за помощ, которая не помогла smile Но а тем, кто будет работать с гридом, пытаться ему пририсоват тултип используйте 
http://forum.vingrad.ru/forum/s/220a652417e42fe5c43bf8f1714a02ce/VisualC++MFC-WTL.html
или 
http://www.codeproject.com/miscctrl/AAArrayCtrlDemo.asp

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)