Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π˜ΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰Π΅Π΅ руководство ΠΏΠΎ написанию Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… подсказок». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 2

Автор Π ΠΎΠ΄ΠΆΠ΅Ρ€ Π”ΠΆΠ΅ΠΊ

Π’ MFC вСрсий Π½ΠΈΠΆΠ΅ 4.0 ΠΈΠ· CDialog::DoModal Π½Π΅ вызываСтся CDialog::PreTranslateMessage, поэтому придСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ дСйствия для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сообщСний ΠΌΡ‹ΡˆΠΈ элСмСнту ToolTip. НуТно ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ CWinApp::ProcessMessageFilter ΠΈ Π² Π½Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ сообщСния элСмСнту ToolTip. CWinApp::ProcessMessageFilter вызываСтся Ρ…ΡƒΠΊΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ MFC для Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ сообщСния Windows. Π—Π° дСталями, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π² Π±Π°Π·Π΅ Π·Π½Π°Π½ΠΈΠΉ.

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ подсказок ΠΊ Web-страницам

ДСмонстрационный ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ WebButton

Как ΠΈ Π² прилоТСниях, подсказки Π½Π° Web-страницах ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹. Подсказки ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π² Π΄Π²ΡƒΡ… ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Ρ… случаях: для ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ ΠΈ элСмСнтов ActiveX. Π― написал ΠΏΡ€ΠΈΠΌΠ΅Ρ€ элСмСнта "ΠΊΠ½ΠΎΠΏΠΊΠ°", Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ просто Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ подсказки ΠΊ элСмСнтам ActiveX. На рис.3 ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ ΠΈ элСмСнт ActiveX – ΠΊΠ½ΠΎΠΏΠΊΠ° с ΡƒΠ»Ρ‹Π±Π°ΡŽΡ‰Π΅ΠΉΡΡ Ρ€ΠΎΠΆΠΈΡ†Π΅ΠΉ, ΠΈ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° – нСбольшоС "худоТСство" прямо ΠΏΠΎΠ΄ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ.

Рис.3. Подсказки Π½Π° Web-страницС


Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ подсказку ΠΊ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅ ΠΏΡ€ΠΎΡ‰Π΅ простого, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ эта Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ встроСна Π² язык HTML (см. рис.4). Π­Ρ‚Π° строка:

<img src="Image.gif" height=48 width=48 alt="Image ToolTip" >

Π·Π°Π΄Π°Π΅Ρ‚ имя ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ. ΠŸΠΎΠ΄ΡΡ‚Ρ€ΠΎΠΊΠ° "Image ToolTip" ΠΈ Π΅ΡΡ‚ΡŒ тСкст подсказки, которая появляСтся ΠΏΡ€ΠΈ ΠΏΠΎΠ΄Π²Π΅Π΄Π΅Π½ΠΈΠΈ курсора ΠΌΡ‹ΡˆΠΈ ΠΊ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅. Π’Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ для ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ нСсколько "Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Π·ΠΎΠ½" (HotSpots) ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ нСсколько подсказок, Π½ΠΎ это Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ ΡΡ‚Π°Ρ‚ΡŒΠΈ. Π― Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, насколько просто Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ подсказки Π½Π° языкС HTML.

Рис.4. HTML-код для подсказки

<OBJECT ID="WebButton1" WIDTH=31 HEIGHT=28 CLASSID="CLSID:381C5023-2FDA-11D0-8BC1-444553540000">

 <PARAM NAME="_Version" VALUE="65536">

 <PARAM NAME="_ExtentX" VALUE="786">

 <PARAM NAME="_ExtentY" VALUE="731">

 <PARAM NAME="_StockProps" VALUE="0">

 <PARAM NAME="ToolTipText" VALUE="WebButton ToolTip Test">

 </OBJECT>

</P>

<br><img src="Image.gif" height=48 width=48 alt="Image ToolTip" >

<SCRIPT LANGUAGE="VBScript">

 <!-–

 Sub WebButton1_Click()

  MsgBox "WebButton was clicked"

 end sub

-->

</SCRIPT>

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ ActiveX прСдставляСт собой ΠΊΠ½ΠΎΠΏΠΊΡƒ с подсказкой. Для Ρ‡Π΅Π³ΠΎ ΠΌΠ½Π΅ Π²ΠΎΠ·ΠΈΡ‚ΡŒΡΡ с созданиСм ΠΊΠ½ΠΎΠΏΠΊΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½Π° Web-страницу Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΊΠ½ΠΎΠΏΠΊΠ°? На это Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΊΠ½ΠΎΠΏΠΊΠ° выглядит рСалистичнСС – ΠΎΠ½Π° наТимаСтся ΠΈ отТимаСтся ΠΏΠΎ Ρ‰Π΅Π»Ρ‡ΠΊΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΊΠ°ΠΊ ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΎ настоящСй ΠΊΠ½ΠΎΠΏΠΊΠ΅. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, я Ρ…ΠΎΡ‚Π΅Π» ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ подсказок ΠΊ элСмСнтам ActiveX, Π° ΠΊΠ½ΠΎΠΏΠΊΠ° – это ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я ΠΌΠΎΠ³ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² дСмонстрационных цСлях.

Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° я использовал AppWizard. Π― установил Ρ„Π»Π°ΠΆΠΎΠΊ "Activate when visible" ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΠ» всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π»Π°ΠΆΠΊΠΈ. Π’ ΠΎΠΏΡ†ΠΈΠΈ "Which window class, if any, should this control subclass?" я Π²Ρ‹Π±Ρ€Π°Π» BUTTON. AppWizard Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ массу Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Π½Π΅ относящСгося ΠΊ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅. Π’ основном, я ΠΎΡΡ‚Π°Π½ΠΎΠ²Π»ΡŽΡΡŒ Π½Π° ΠΊΠΎΠ΄Π΅, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΠΎΠΌ ΠΌΠ½ΠΎΠΉ Π² класс CWebButtonCtrl (см. рис.5). Π”Π°Π²Π°ΠΉΡ‚Π΅ для Π½Π°Ρ‡Π°Π»Π° взглянСм Π½Π° ΠΏΠ°Ρ€Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… класса. CWebButtonCtrl::m_bToolTipEnabled устанавливаСтся Π² TRUE, Ссли подсказки Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹. Π’ CWebButtonCtrl::m_strToolTipText хранится тСкст подсказки. Π― Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΎΠ±Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‡Π΅Ρ€Π΅Π· ClassWizard ΠΈ ΠΎΠ½ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ OLE-свойства, автоматичСскиС обновляСмыС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ MFC ΠΏΡ€ΠΈ ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ.

Рис.5. CWebButtonCtrl

// WebButtonCtl.cpp : Implementation of the CWebButtonCtrl OLE control class.


/////////////////////////////////////////////////////////////////////////////

// CWebButtonCtrl::RelayToolTipEvent – Pass mouse messages to ToolTip

void CWebButtonCtrl::RelayToolTipEvent(const MSG* pMsg) {

 MSG MsgCopy;

 ::memcpy(&MsgCopy, pMsg, sizeof(MSG));

 FilterToolTipMessage(&MsgCopy);

}


int CWebButtonCtrl::OnToolHitTest(CPoint point, TOOLINFO* pTI) const {

 if (m_bToolTipEnabled && pTI != NULL && pTI->cbSize >= sizeof(TOOLINFO)) {

  // setup the TOOLINFO structure

  pTI->hwnd = m_hWnd;

  pTI->uId = 0;

  pTI->uFlags = 0;

  GetClientRect(&(pTI->rect));

  pTI->lpszText = LPSTR_TEXTCALLBACK;

 }

 return (m_bToolTipEnabled ? 1 : –1);

}


/////////////////////////////////////////////////////////////////////////////

// CWebButtonCtrl message handlers

int CWebButtonCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) {

 if (COleControl::OnCreate(lpCreateStruct) == –1) {

  return –1;

 }

 if (m_Bitmap.LoadBitmap(IDB_WEBBUTTON)) {

   SendMessage(BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)m_Bitmap.GetSafeHandle());

 } else {

  TRACE("Unable to load bitmap for button.");

 }

 EnableToolTips(TRUE);

 return 0;

}


void CWebButtonCtrl::OnMouseMove(UINT nFlags, CPoint point) {

 RelayToolTipEvent(GetCurrentMessage());

 COleControl::OnMouseMove(nFlags, point);

}


void CWebButtonCtrl::OnLButtonDown(UINT nFlags, CPoint point) {

 RelayToolTipEvent(GetCurrentMessage());

 COleControl::OnLButtonDown(nFlags, point);

}


void CWebButtonCtrl::OnLButtonUp(UINT nFlags, CPoint point) {

 RelayToolTipEvent(GetCurrentMessage());

 COleControl::OnLButtonUp(nFlags, point);

}


BOOL CWebButtonCtrl::OnToolNeedText(UINT id, NMHDR * pNMHDR, LRESULT * pResult) {

TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;

 ::strcpy(pTTT->szText, m_strToolTipText);

 return TRUE;

}


/////////////////////////////////////////////////////////////////////////////

// Property changed handlers

void CWebButtonCtrl::OnToolTipEnabledChanged() {

 SetModifiedFlag();

}


void CWebButtonCtrl::OnToolTipTextChanged() {

 SetModifiedFlag();

}

CWebButtonCtrl::PreCreateWindow ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΉ Π΅ΠΌΡƒ структурой CREATESTRUCT. Π― Π·Π°Π΄Π°Π» для ΠΊΠ½ΠΎΠΏΠΊΠΈ ΡΡ‚ΠΈΠ»ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ отрисовки (owner-draw) – BS_OWNERDRAW – для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Ρ€ΠΈΡΠΎΠ²Π°Π»Π°ΡΡŒ Ρ€Π°ΠΌΠΊΠ° фокуса (focus rect) ΠΏΡ€ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, Ρ€Π°ΠΌΠΊΠ° Π±Ρ‹Π»Π° Π±Ρ‹ всС врСмя Π²ΠΈΠ΄Π½Π°. Как ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт задания Ρ‚Π°ΠΊΠΎΠ³ΠΎ стиля приходится ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ CWebButtonCtrl::OnOcmDrawItem для рисования ΠΊΠ½ΠΎΠΏΠΊΠΈ. CWebButtonCtrl::OnCreate Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΈ устанавливаСт ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ для ΠΊΠ½ΠΎΠΏΠΊΠΈ посылкой сообщСния BM_SETIMAGE. Она Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ CWebButton::EnableToolTips, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ подсказок классом CWnd.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ CWebButtonCtrl::OnMouseMove, CWebButtonCtrl::OnLButtonDown, ΠΈ CWebButtonCtrl::OnLButtonUp Π΄Π΅Π»Π°ΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ – ΠΎΠ½ΠΈ всС Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ CWnd::RelayToolTipEvent. ΠœΠ΅Ρ‚ΠΎΠ΄ CWebButtonCtrl::RelayToolTipEvent Π΄Π΅Π»Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΡƒΡŽ копию ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΅ΠΌΡƒ сообщСния ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ CWnd::FilterToolTipMessage. Копия сообщСния дСлаСтся ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ CWnd::FilterToolTipMessage Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ нСконстантного указатСля Π½Π° сообщСниС. Π― ΠΌΠΎΠ³ Π±Ρ‹, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, привСсти ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΊ нСконстантному, Π½ΠΎ это нСбСзопасно, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² этом случаС CWnd::FilterToolTipMessage ΠΌΠΎΠ³Π»Π° Π±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ исходноС сообщСниС. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ CWnd автоматичСски Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ CWnd::FilterToolTipMessage Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CWnd::PreTranslateMessage. Однако, Π² элСмСнтС ActiveX сообщСния ΠΌΡ‹ΡˆΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² CWnd::PreTranslateMessage, ΠΎΠ½Π° вызываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π° (CWnd::PreTranslateMessage Π² основном ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π½Ρ‹ΠΌΠΈ аксСлСраторами). Π’ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ MFC-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ CWnd::PreTranslateMessage вызываСтся Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CWinThread::PumpMessage.

CWebButtonCtrl::OnToolHitTest вызываСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ CWnd::FilterToolTipMessage, ΠΈ я ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ» Π΅Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡƒΡŽ Π΅ΠΉ структуру TOOLINFO. Π—Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ структуры происходит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли для элСмСнта Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ подсказки. Подсказка (элСмСнт ToolTip) Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½Π° экранС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… полях структуры TOOLINFO. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° NULL ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ структуры – ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π½Π° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ. ПослС заполнСния структуры TOOLINFO функция устанавливаСт ΠΏΠΎΠ»Π΅ rect Ρ€Π°Π²Π½Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ клиСнтской части ΠΊΠ½ΠΎΠΏΠΊΠΈ. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, вся ΠΊΠ½ΠΎΠΏΠΊΠ° задаСтся ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ инструмСнт. Полю lpszText присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ LPSTR_CALLBACK, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ элСмСнт ToolTip посылаСт ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ TTN_NEEDTEXT, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ тСкст подсказки. CWebButtonCtrl::OnToolNeedText ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ это ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎΡ‚ элСмСнта ToolTip, копируя строку ΠΈΠ· m_strToolTipText Π² ΠΏΠΎΠ»Π΅ szText ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠΉ структуры TOOLTIPTEXT.

Как Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, эта Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ элСмСнта управлСния ActiveX основываСтся Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ подсказок классом CWnd. Π‘Ρ‚Π°Ρ‚ΡŒΡ Q141871 Π±Π°Π·Ρ‹ Π·Π½Π°Π½ΠΈΠΉ описываСт Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄ добавлСния подсказок ΠΊ элСмСнтам ActiveX ΠΏΡƒΡ‚Π΅ΠΌ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса CToolTipCtrl ΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ AddTool ΠΈ UpdateTipText. ВСрсия элСмСнта ActiveX, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ эту Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ, прилагаСтся вмСстС с исходным ΠΊΠΎΠ΄ΠΎΠΌ (см. ΡΡ‚Π°Ρ‚ΡŒΡŽ Q165577). Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° для ΠΎΠ±ΠΎΠΈΡ… ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ² практичСски ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ². Π’Π°ΠΊ ΠΊΠ°ΠΊ Π΄Π°Π»Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ подсказок, здСсь я Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΠ»Π½Π΅Π΅ Ρ€Π°ΡΠΊΡ€Ρ‹Ρ‚ΡŒ Π΄Π΅Ρ‚Π°Π»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ подсказок классом CWnd.

Π₯ΠΎΡ‡Ρƒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΠΈΡ‚ΡŒ вас ΠΎΠ± ограничСнности ΠΌΠΎΠ΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ появятся ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² элСмСнта ActiveX. Π Π°Π·ΠΌΠ΅Ρ€ инструмСнта Π½Π΅ измСнится. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°Π΄ΡƒΠΌΠ°Π½Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹ вряд Π»ΠΈ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΊΠ½ΠΎΠΏΠΊΠΈ послС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Web-страницы. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌΡƒ элСмСнту ActiveX понадобится ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ для создания сСртификата Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, ΠΈΠ½Π°Ρ‡Π΅ любой ΠΏΠΎΡΠ΅Ρ‚ΠΈΡ‚Π΅Π»ΡŒ этой Web-страницы ΡƒΠ²ΠΈΠ΄ΠΈΡ‚ ΠΎΠΊΠ½ΠΎ с ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ. Наш дСмонстрационный элСмСнт ActiveX нСподписан. Π’ Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ…, Π² ΠΊΠ½ΠΎΠΏΠΊΡƒ ТСстко Π·Π°ΡˆΠΈΡ‚Π° ΠΎΠ΄Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°. Настоящий элСмСнт ActiveX Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΌΠ΅Ρ‚ΡŒ динамичСски ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ΅.

Для добавлСния ActiveX-элСмСнта Π½Π° страницу я использовал ActiveX Control Pad, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ доступСн для бСсплатного скачивания ΠΏΠΎ адрСсу http://www.microsoft.com/workshop/author/cpad/cpad.htm. На рисункС 4 ΠΏΠΎΠΊΠ°Π·Π°Π½ сгСнСрированный этой ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ HTML-ΠΊΠΎΠ΄. Π’ этом ΠΊΠΎΠ΄Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ значСния OBJECT ID, WIDTH, HEIGHT, ΠΈ CLASSID. Π’Π°ΠΊΠΆΠ΅ Ρƒ элСмСнта ActiveX имССтся список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΈΠ»ΠΈ свойств. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ToolTipText (ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ "WebButton ToolTip Test") Π·Π°Π΄Π°Π΅Ρ‚ тСкст подсказки для нашСй ΠΊΠ½ΠΎΠΏΠΊΠΈ. Π‘Ρ‚Ρ€ΠΎΠΊΠ°