Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 августа!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Возможности языков семейства Си по истине безграничны, однако, в этой свободе кроются и недостатки: всегда нужно программисту держать ухо востро и контроллировать "переполнение буфера", чтобы потом программа не вылетала в "синий экран" на массе разнообразных версий Windows и железа у пользователей. Те же крэкеры и реверсеры специально ищут в коде программ на Си уязвимости, куда можно подсадить любой вирусный код, об этом более подробно автор рассказывал в своём видеокурсе здесь. Я там многое узнал и теперь мой код стал значительно более безопасный.

Активный курсор в Scroll Bar.

Компилятор: Visual C++ 6

Автор: Siarhei Akulich.

Данный пример позволяет динамически менять курсор на scrollbar-е окна. Переменные m_nVIDResource и m_nHIDResource используются для предотвращения множественной загрузки курсора.

CMyWnd наследован от CWnd.
 
 UINT m_nVIDResource;          //Текущий ID ресурса курсора
                               //(вертикальный scroll bar)
 UINT m_nHIDResource;          //Текущий ID ресурса курсора
                               //(горизонтальный scroll bar)
 
 CMyWnd::CMyWnd()
 {
   m_nVIDResource = 0;
   m_nHIDResource = 0;
 }
 
 BOOL CMyWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
 {
   if(nHitTest == HTVSCROLL)
   {
     //Меняем курсор на горизонтальном скролбаре
     SetCursor(AfxGetApp()->LoadCursor(IDC_VSCROLLBAR));
     if(m_nVIDResource != IDC_VSCROLLBAR)
       m_nVIDResource = IDC_VSCROLLBAR;
     return true;
   }
   else if(nHitTest == HTHSCROLL)
   {
     //Меняем курсор на вертикальном скролбаре
     SetCursor(AfxGetApp()->LoadCursor(IDC_HSCROLLBAR));
     if(m_nHIDResource != IDC_HSCROLLBAR)
       m_nHIDResource = IDC_HSCROLLBAR;
     return true;
   }
   else
   {
     if(m_nVIDResource != 0) m_nVIDResource = 0;
     if(m_nHIDResource != 0) m_nHIDResource = 0;
   }
 
   return BaseClass::OnSetCursor(pWnd, nHitTest, message);
 }
 
 void CMyWnd::OnVScroll(UINT nSBCode, UINT nPos,
                        CScrollBar* pScrollBar)
 {
   switch (nSBCode) {
   case SB_THUMBTRACK:         //Перемещаем ползунок в
                               //определённое положение
     if(m_nVIDResource != IDC_VTHUMBTRACK)
     {
       SetCursor(AfxGetApp()->LoadCursor(IDC_VTHUMBTRACK));
       m_nVIDResource = IDC_VTHUMBTRACK;
     }
     break;
   case SB_LINEDOWN:           //Скроллинг на одну линию вниз
     if(GetScrollPos(SB_VERT) == GetScrollLimit(SB_VERT))
     {
       if(m_nVIDResource != IDC_VLINEDOWN_DISABLE)
       {
         SetCursor(AfxGetApp()->LoadCursor(IDC_VLINEDOWN_DISABLE));
         m_nVIDResource = IDC_VLINEDOWN_DISABLE;
       }
     }
     else if(m_nVIDResource != IDC_VLINEDOWN)
     {
       SetCursor(AfxGetApp()->LoadCursor(IDC_VLINEDOWN));
       m_nVIDResource = IDC_VLINEDOWN;
     }
     break;
   case SB_LINEUP:             //Скроллинг на одну линию вверх
     SCROLLINFO  info;
     info.cbSize = sizeof(SCROLLINFO);
     GetScrollInfo(SB_VERT, >info);
     if(info.nPos == info.nMin)
     {
       if(m_nVIDResource != IDC_VLINEUP_DISABLE)
       {
         SetCursor(AfxGetApp()->LoadCursor(IDC_VLINEUP_DISABLE));
         m_nVIDResource = IDC_VLINEUP_DISABLE;
       }
     }
     else if(m_nVIDResource != IDC_VLINEUP)
     {
       SetCursor(AfxGetApp()->LoadCursor(IDC_VLINEUP));
       m_nVIDResource = IDC_VLINEUP;
     }
     break;
   case SB_PAGEDOWN:           //Скроллинг на одну страницу вниз
     if(m_nVIDResource != IDC_VPAGEDOWN)
     {
       SetCursor(AfxGetApp()->LoadCursor(IDC_VPAGEDOWN));
       m_nVIDResource = IDC_VPAGEDOWN;
     }
     break;
   case SB_PAGEUP:             //Скроллинг на одну страницу вверх
     if(m_nVIDResource != IDC_VPAGEUP)
     {
       SetCursor(AfxGetApp()->LoadCursor(IDC_VPAGEUP));
       m_nVIDResource = IDC_VPAGEUP;
     }
     break;
   }
   BaseClass::OnVScroll(nSBCode, nPos, pScrollBar);
 }
 
 void CMyWnd::OnHScroll(UINT nSBCode, UINT nPos,
                        CScrollBar* pScrollBar)
 {
   switch (nSBCode) {
   case SB_THUMBTRACK:         //Перемещаем ползунок в
                               //определённое положение
     if(m_nHIDResource != IDC_HTHUMBTRACK)
     {
       SetCursor(AfxGetApp()->LoadCursor(IDC_HTHUMBTRACK));
       m_nHIDResource = IDC_HTHUMBTRACK;
     }
     break;
   case SB_LINEDOWN:           //Скроллинг на одну линию вниз
     if(GetScrollPos(SB_HORZ) == GetScrollLimit(SB_HORZ))
     {
       if(m_nHIDResource != IDC_HLINEDOWN_DISABLE)
       {
         SetCursor(AfxGetApp()->LoadCursor(IDC_HLINEDOWN_DISABLE));
         m_nHIDResource = IDC_HLINEDOWN_DISABLE;
       }
     }
     else if(m_nHIDResource != IDC_HLINEDOWN)
     {
       SetCursor(AfxGetApp()->LoadCursor(IDC_HLINEDOWN));
       m_nHIDResource = IDC_HLINEDOWN;
     }
     break;
   case SB_LINEUP:             //Скроллинг на одну линию вверх
     SCROLLINFO  info;
     info.cbSize = sizeof(SCROLLINFO);
     GetScrollInfo(SB_HORZ, &info);
     if(info.nPos == info.nMin)
     {
       if(m_nHIDResource != IDC_HLINEUP_DISABLE)
       {
         SetCursor(AfxGetApp()->LoadCursor(IDC_HLINEUP_DISABLE));
         m_nHIDResource = IDC_HLINEUP_DISABLE;
       }
     }
     else if(m_nHIDResource != IDC_HLINEUP)
     {
       SetCursor(AfxGetApp()->LoadCursor(IDC_HLINEUP));
       m_nHIDResource = IDC_HLINEUP;
     }
     break;
   case SB_PAGEDOWN:           //Скроллинг на одну страницу вниз
     if(m_nHIDResource != IDC_HPAGEDOWN)
     {
       SetCursor(AfxGetApp()->LoadCursor(IDC_HPAGEDOWN));
       m_nHIDResource = IDC_HPAGEDOWN;
     }
     break;
   case SB_PAGEUP:             //Скроллинг на одну страницу вверх
     if(m_nHIDResource != IDC_HPAGEUP)
     {
       SetCursor(AfxGetApp()->LoadCursor(IDC_HPAGEUP));
       m_nHIDResource = IDC_HPAGEUP;
     }
     break;
   }
 
   BaseClass::OnHScroll(nSBCode, nPos, pScrollBar);
 }
 

Downloads

Скачать демонстрационный пример - 49 Kb

 



<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS