> 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;
>}
Добавление задержек к подсказкам
Элемент 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. Сообщение с этим параметром устанавливает время задержки перед скрытием подсказки, если курсор мыши неподвижен.
Во-первых, добавим protected– или private-переменные в наш класс, чтобы хранить ID таймера и координаты курсора мыши, когда подсказка видна на экране. Также добавим константу, в которой будет находиться время задержки до автоматического скрытия подсказки. Код будет выглядеть следующим образом:
>class CCustomTip: public CWnd {
> .
> .
> .