//{{AFX_MSG_MAP(CODListBox)
// NOTE β the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CODListBox message handlers
void CODListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) {
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
ASSERT_VALID(pDC);
int nSavedDC = pDC->SaveDC();
CString strItem;
if (lpDrawItemStruct->itemID != β1) {
GetText(lpDrawItemStruct->itemID, strItem);
}
COLORREF TextColor;
COLORREF BackColor;
UINT nItemState = lpDrawItemStruct->itemState;
if (nItemState & ODS_SELECTED) {
TextColor = RGB(255, 255, 255); // ΠΠ΅Π»ΡΠΉ
BackColor = RGB(255, 0, 0); // ΠΡΠ°ΡΠ½ΡΠΉ
} else {
TextColor = RGB(255, 0, 0); // ΠΡΠ°ΡΠ½ΡΠΉ
BackColor = RGB(255, 255, 255); // ΠΠ΅Π»ΡΠΉ
}
CRect ItemRect(lpDrawItemStruct->rcItem);
// ΠΠ°ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠ½
pDC->FillSolidRect(ItemRect, BackColor);
// ΠΠ°ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΠΊΡΡ
pDC->SetTextColor(TextColor);
pDC->SetBkMode(TRANSPARENT);
pDC->SelectObject(&m_Font);
ItemRect.left += m_nEdgeSpace;
pDC->DrawText(strItem, ItemRect, DT_LEFT | DT_SINGLELINE | DT_VCENTER);
ItemRect.left β= m_nEdgeSpace;
// ΠΠ°ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΠ°ΠΌΠΊΡ ΡΠΎΠΊΡΡΠ°
if (nItemState & ODS_FOCUS) {
pDC->DrawFocusRect(ItemRect);
}
pDC->RestoreDC(nSavedDC);
}
void CODListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) {
lpMeasureItemStruct->itemHeight = m_nFontHeight + (m_nEdgeSpace * 2);
}
CODListBox::GetIdealItemRect ΠΏΠ΅ΡΠ΅ΠΊΡΡΠ²Π°Π΅Ρ ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΌΠ΅ΡΠΎΠ΄ Π² ΠΊΠ»Π°ΡΡΠ΅ CTitleTipListBox. ΠΠ°ΠΊ Π²Ρ Π²ΠΈΠ΄ΠΈΡΠ΅, Π΅Π³ΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΡ ΠΎΠΆΠ° Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Π° Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π½ΠΎΠ²ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π΄Π»Ρ ΡΡΠΈΡΡΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ m_Font. ΠΠΎΠ½Π΅ΡΠ½ΠΎ, Ρ ΠΌΠΎΠ³ Π±Ρ Π΄ΠΎΠ±ΠΈΡΡΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° ΠΈ Π±Π΅Π· ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Π° Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°, Π΅ΡΠ»ΠΈ Π±Ρ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΡΡ CWnd::SetFont Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΡΠΈΡΡΠ° Π΄Π»Ρ ΡΠΏΠΈΡΠΊΠ°. ΠΠ΄Π½Π°ΠΊΠΎ Ρ Ρ ΠΎΡΠ΅Π» ΠΏΠΎΠΊΠ°Π·Π°ΡΡ, ΠΊΠ°ΠΊ Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΊΡΡΠ²Π°ΡΡ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π² Π΄ΡΡΠ³ΠΈΡ ΡΠ»ΡΡΠ°ΡΡ . ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π²Π°ΠΌ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ CTitleTipListBox::GetIdealItemRect, Π΅ΡΠ»ΠΈ Π²Ρ Π·Π°Ρ ΠΎΡΠΈΡΠ΅ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ Π² ΡΠΏΠΈΡΠΊΠ΅ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ.
CODListBox::DrawItem ΡΠΈΡΡΠ΅Ρ ΡΡΡΠΎΠΊΡ ΠΏΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈΠ· ΡΡΡΡΠΊΡΡΡΡ DrawItemStruct. ΠΡΠΎΡ ΠΊΠΎΠ΄ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ΅Π½ ΠΊΠΎΠ΄Ρ Π² ΡΡΠ½ΠΊΡΠΈΠΈ CTitleTip::OnPaint, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΡΠ²Π΅ΡΠΎΠ² ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΊΡΠ°ΡΠ½ΡΠΉ ΠΈ Π±Π΅Π»ΡΠΉ ΡΠ²Π΅ΡΠ°. ΠΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΈΠ· ΠΊΠ»Π°ΡΡΠ° CTitleTip Π΄Π»Ρ ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²Π½ΡΡΡΠΈ Π΅Π³ΠΎ ΠΎΠΊΠ½Π°.
CODListBox::MeasureItem Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ Π²ΡΡΠΎΡΡ ΡΡΡΠΎΠΊΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΡΠΈΡΡΠ° ΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° Π²ΠΎΠΊΡΡΠ³ ΡΠ΅ΠΊΡΡΠ°. ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Windows ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Ρ ΡΡΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° "ΡΠΏΠΈΡΠΎΠΊ" ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ ΡΡΠΈΠ»Ρ LBS_OWNERDRAWFIXED. Π ΡΠ»ΡΡΠ°Π΅ ΡΠΎ ΡΡΠΈΠ»Π΅ΠΌ LBS_OWNERDRAWVARIABLE ΠΌΠ΅ΡΠΎΠ΄ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ.
Π Π΄ΠΈΠ°Π»ΠΎΠ³Π΅ CTTDemoDlg ΠΏΡΠΈΡΡΡΡΡΠ²ΡΡΡ ΠΎΠ±Π° ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° "ΡΠΏΠΈΡΠΎΠΊ", ΠΈ Π±ΠΎΠ»ΡΡΠ°Ρ ΡΠ°ΡΡΡ ΠΊΠΎΠ΄Π° Π±ΡΠ»Π° ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π° AppWizard'ΠΎΠΌ (ΡΠΌ. ΡΠΈΡ.14). Π― Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π² ΠΊΠ»Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ m_RegListBox ΠΈ m_ODListBox Π΄Π»Ρ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° ΠΈ ΡΠΏΠΈΡΠΊΠ° Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΎΠΉ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ. ΠΡΠ΅ Ρ Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΊΠΎΠ΄ Π² ΡΡΠ½ΠΊΡΠΈΡ CTTDemoDlg::OnInitDialog, Π³Π΄Π΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΡΠ°Π±ΠΊΠ»Π°ΡΡΠΈΠ½Π³ ΠΎΠ±ΠΎΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² "ΡΠΏΠΈΡΠΎΠΊ" Π²ΡΠ·ΠΎΠ²ΠΎΠΌ CWnd::SubclassWindow. Π― Π·Π°Π³ΡΡΠΆΠ°Ρ ΠΎΠ±Π° ΡΠΏΠΈΡΠΊΠ° ΠΈΠ· ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π° pszItemArray.
Π ΠΈΡ.14. CTTDemoDlg
// TTDemoDlg.h : header file /////////////////////////////////////////////////////////////////////////////
// CTTDemoDlg dialog
#include "TitleTipListBox.h"
#include "ODListBox.h"
class CTTDemoDlg : public CDialog { // Construction public:
CTTDemoDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CTTDemoDlg)
enum { IDD = IDD_TTDEMO_DIALOG };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CTTDemoDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
CTitleTipListBox m_RegListBox; // ΠΠ±ΡΡΠ½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ
CODListBox m_ODListBox; // Π‘ΠΏΠΈΡΠΎΠΊ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΎΠΉ
// Generated message map functions
//{{AFX_MSG(CTTDemoDlg)
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
// TTDemoDlg.cpp : implementation file
#include "stdafx.h"
#include "TTDemo.h"
#include "TTDemoDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTTDemoDlg dialog
CTTDemoDlg::CTTDemoDlg(CWnd* pParent /*=NULL*/) : CDialog(CTTDemoDlg::IDD, pParent) {
//{{AFX_DATA_INIT(CTTDemoDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CTTDemoDlg::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTTDemoDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTTDemoDlg, CDialog)
//{{AFX_MSG_MAP(CTTDemoDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTTDemoDlg message handlers
BOOL CTTDemoDlg::OnInitDialog() {
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// Π‘Π°Π±ΠΊΠ»Π°ΡΡΠΈΠ½Π³ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° "ΡΠΏΠΈΡΠΎΠΊ"
HWND hwndRegListBox = ::GetDlgItem(GetSafeHwnd(), IDC_REGLISTBOX);
ASSERT(hwndRegListBox);
VERIFY(m_RegListBox.SubclassWindow(hwndRegListBox));
// Π‘Π°Π±ΠΊΠ»Π°ΡΡΠΈΠ½Π³ ΡΠΏΠΈΡΠΊΠ° Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΎΠΉ
HWND hwndODListBox = ::GetDlgItem(GetSafeHwnd(), IDC_ODLISTBOX);
ASSERT(hwndODListBox);
VERIFY(m_ODListBox.SubclassWindow(hwndODListBox));
// ΠΠ°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠΈΡ ΡΠΏΠΈΡΠΊΠΎΠ² ΡΡΡΠΎΠΊΠ°ΠΌΠΈ
static char* pszItemArray[] = {
"The C++ Programming Language",
"C++ Primer",
"OLE Controls Inside Out",
"Inside OLE 2nd Edition",
"Inside ODBC",
"Code Complete",
"Rapid Software Development",
"The Design Of Everyday Things",
"Object-Oriented Analysis And Design",
"MFC Internals",
"Animation Techniques In Win32",
"Inside Visual C++",
"Writing Solid Code",
"Learn Java Now"
};
static int nItemArrayCount = sizeof(pszItemArray) / sizeof(pszItemArray[0]);
for (int n = 0; n < nItemArrayCount; n++) {
VERIFY(m_RegListBox.AddString(pszItemArray[n]) != LB_ERR);
VERIFY(m_ODListBox.AddString(pszItemArray[n]) != LB_ERR);
}
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CTTDemoDlg::OnPaint() {
if (IsIconic()) {
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() β cxIcon + 1) / 2;
int y = (rect.Height() β cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
} else {
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CTTDemoDlg::OnQueryDragIcon() {
return (HCURSOR) m_hIcon;
}
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡΠ°ΠΊ, Ρ Π΄Π°Π» Π²Π°ΠΌ ΠΏΡΡΡ ΡΠΎΠ²Π΅ΡΠΎΠ² ΠΏΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΎΠΊ. ΠΠ°Π΄Π΅ΡΡΡ, ΠΎΠ½ΠΈ Π²Π΄ΠΎΡ Π½ΠΎΠ²ΡΡ Π²Π°Ρ Π½Π° Π±ΠΎΠ»Π΅Π΅ ΡΠΈΡΠΎΠΊΠΎΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΎΠΊ ToolTips, TitleTips ΠΈ DataTips Π² Π²Π°ΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ ΠΈ Web-ΡΡΡΠ°Π½ΠΈΡΠ°Ρ . Π ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ, Π²Ρ Π΄Π°ΠΆΠ΅ ΠΏΡΠΈΠ΄ΡΠΌΠ°Π΅ΡΠ΅ Π½ΠΎΠ²ΡΠΉ Π²ΠΈΠ΄ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠΌ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΠ΅ΡΡ ΡΠΎ Π²ΡΠ΅ΠΌΠΈ Π½Π°ΠΌΠΈ!
ΠΠ²ΡΠΎΡ Π²ΡΡΠ°ΠΆΠ°Π΅Ρ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ½ΠΎΡΡΡ ΠΠΈΠ»Π»Ρ ΠΠΈΠ½ΡΠ»ΠΈ ΠΈ Π΄ΡΡΠ³ΠΈΠΌ ΠΈΠ· ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ AM Communications, Inc.
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π΅ΡΠΆΠ΅ΠΊ ΠΊ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ°ΠΌ
ΠΠ»Π΅ΠΌΠ΅Π½Ρ TitleTip, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ ΠΌΠ½ΠΎΠΉ, Π½Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ ΠΏΠ΅ΡΠ΅Π΄ ΠΏΠΎΠΊΠ°Π·ΠΎΠΌ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΈ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠΌ ToolTip Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ TTM_SETDELAYTIME. Π― Π½Π΅ ΡΡΠ°Π» Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π·Π°Π΄Π΅ΡΠΆΠ΅ΠΊ ΠΏΠΎ ΠΏΡΠΈΠΌΠ΅ΡΡ Microsoft, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»Π° Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ Π² ΡΠ²ΠΎΠΈΡ TitleTip'Π°Ρ . ΠΠ΄Π½Π°ΠΊΠΎ, Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ Π΄ΡΡΠ³ΠΈΡ Π²ΠΈΠ΄ΠΎΠ² ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΎΠΊ ΡΡΠ° Π·Π°Π΄Π΅ΡΠΆΠΊΠ° ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ, ΠΏΠΎΡΡΠΎΠΌΡ Π΅ΡΠ»ΠΈ Π²Ρ ΠΆΠ΅Π»Π°Π΅ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π·Π°Π΄Π΅ΡΠΆΠΊΡ ΠΏΠ΅ΡΠ΅Π΄ ΠΏΠΎΠΊΠ°Π·ΠΎΠΌ Π²Π°ΡΠΈΡ ΡΠ°ΠΌΠΎΠΏΠΈΡΠ½ΡΡ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΎΠΊ, Ρ ΠΎΠ±ΡΡΡΠ½Ρ, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ.
Π ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΡΡ ΡΠ΅ΡΠ΅Π· Windows-ΡΠ°ΠΉΠΌΠ΅ΡΡ. Π ΠΊΠ»Π°ΡΡΠ΅ CWnd ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π΄Π²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΠ½ΠΎΡΡΡΡΡ ΠΊ ΡΠ°ΠΉΠΌΠ΅ΡΠ°ΠΌ: CWnd::SetTimer ΠΈ CWnd::KillTimer. CWnd::SetTimer ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠ°ΠΉΠΌΠ΅Ρ, ΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ID ΡΠ°ΠΉΠΌΠ΅ΡΠ°, Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» Π² ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°Ρ ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ, Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΡ ΠΏΠΎ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π°. ΠΡΠ»ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ ΡΠ°Π²Π΅Π½ NULL, ΡΠΎ ΡΠ°ΠΉΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ WM_TIMER Π΄Π»Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΎΠΊΠ½Π° ΠΎ Π½Π°ΡΡΡΠΏΠΈΠ²ΡΠ΅ΠΌ ΡΠΎΠ±ΡΡΠΈΠΈ. CWnd::KillTimer ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠ°ΠΉΠΌΠ΅Ρ, ΠΏΡΠΈΠ½ΠΈΠΌΠ°Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ID ΡΠ°ΠΉΠΌΠ΅ΡΠ°.
ΠΠ°ΡΡΡΠΈΠ²ΡΠΈΡΡ ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ, Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ ΠΊ Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΌ Π²Π°ΠΌΠΈ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ°ΠΌ. Π― ΠΏΠΎΠΊΠ°ΠΆΡ, ΠΊΠ°ΠΊ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ TTDT_AUTOPOP ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ TTM_SETDELAYTIME. Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Ρ ΡΡΠΈΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π²ΡΠ΅ΠΌΡ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ ΠΏΠ΅ΡΠ΅Π΄ ΡΠΊΡΡΡΠΈΠ΅ΠΌ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΈ, Π΅ΡΠ»ΠΈ ΠΊΡΡΡΠΎΡ ΠΌΡΡΠΈ Π½Π΅ΠΏΠΎΠ΄Π²ΠΈΠΆΠ΅Π½.