На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
С Днём Победы, друзья!
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> Изменение курсора Win API
    Доброго времени суток. Необходимо изменять курсор над определённой областью окна. Вот мой код, курсор меняется, однако не над областью, которая мне нужна, а над всей рабочей областью окна. Подскажите, где ошибка, заранее благодарен!
    ExpandedWrap disabled
      case WM_SETCURSOR:
      {
        HCURSOR hBlackCursor = LoadCursor(hInstan, "BLACK_CUR");
        HCURSOR hBlueCursor = LoadCursor(hInstan, "BLUE_CUR");
        HCURSOR hWhiteCursor = LoadCursor(hInstan, "WHITE_CUR");
        HCURSOR hRedCursor = LoadCursor(hInstan, "RED_CUR");
         if(((LOWORD(lp) >= 0 && HIWORD(lp) >= 0) &&
            (LOWORD(lp) <= 800 && HIWORD(lp) <= 600)) && (ActiveChip == 1))
         {
           SetCursor(hBlackCursor);
           break;
         }
         if(((LOWORD(lp) >= 0 && HIWORD(lp) >= 0) &&
            (LOWORD(lp) <= 800 && HIWORD(lp) <= 600)) && (ActiveChip == 5))
         {
           SetCursor(hBlueCursor);
           break;
         }
         if(((LOWORD(lp) >= 0 && HIWORD(lp) >= 0) &&
            (LOWORD(lp) <= 800 && HIWORD(lp) <= 600)) && (ActiveChip == 25))
         {
           SetCursor(hWhiteCursor);
           break;
         }
         if(((LOWORD(lp) >= 0 && HIWORD(lp) >= 0) &&
            (LOWORD(lp) <= 800 && HIWORD(lp) <= 600)) && (ActiveChip == 100))
         {
           SetCursor(hRedCursor);
           break;
         }
      }
      Вполне возможно, что у вас ActiveChip принимает какое-то одно значение, а потому другие виды курсора не ставятся. Проясните значение и место изменения этой переменной, тогда посмотрим внимательнее.
      И скажите, какова нужная вам область, а то везде 800x600 ?.. :scratch:

      Добавлено
      А ещё лучше как-то бы так, наверное:
      ExpandedWrap disabled
        if( (LOWORD(lp)>=0 && HIWORD(lp)>=0 && LOWORD(lp)<=800 && HIWORD(lp)<=600 )
          switch( ActiveChip )
          {
            case 1: SetCursor(hBlackCursor); break;
            ...
            case 100: SetCursor(hRedCursor); break;
          }
        else SetCursor(LoadCursor(IDC_ARROW));// стандарт


      Добавлено
      Ну и ещё один break опосля if/else... :blush:
        а что такое lp?
          Цитата Relaxander @
          а что такое lp?
          Очевидно
          ExpandedWrap disabled
            LPARAM lp
            Славян , ActiveChip принимает значения 1, 5, 25, 100. По идее оно меняется. Вот код по ActiveChip:
            ExpandedWrap disabled
              case LBUTTONDOWN:
              {
                ...
                if ((LOWORD(lp) >= 50 && HIWORD(lp) >= 638) &&
                    (LOWORD(lp) <= 130 && HIWORD(lp) <= 718))
                 ActiveChip = Chip1;
                if ((LOWORD(lp) >= 150 && HIWORD(lp) >= 638) &&
                    (LOWORD(lp) <= 230 && HIWORD(lp) <= 718))
                  ActiveChip = Chip5;
                if ((LOWORD(lp) >= 250 && HIWORD(lp) >= 638) &&
                    (LOWORD(lp) <= 330 && HIWORD(lp) <= 718))
                 ActiveChip = Chip25;
                if ((LOWORD(lp) >= 350 && HIWORD(lp) >= 638) &&
                    (LOWORD(lp) <= 430 && HIWORD(lp) <= 718))
                 ActiveChip = Chip100;
                ...
              }


            А насчёт области, везде нужна 800х600, в зависимости от ActiveChip курсор должен изменятся над это областью.
              Цитата kalter14i77 @
              А насчёт области, везде нужна 800х600, в зависимости от ActiveChip курсор должен изменятся над это областью.
              Ясно. Ну тогда примените те строки, кои я выше написал. Добавить к ним ещё надо
              ExpandedWrap disabled
                default: SetCursor(LoadCursor(IDC_ARROW));// стандарт
              в switch'е. Ну и SetCursor можно вынести, для краткости кода...
                Славян Попробовал ваш вариант. Вот что получилось:
                ExpandedWrap disabled
                  case WM_SETCURSOR:
                       {
                         HCURSOR hBlackCursor = LoadCursor(hInstan, "BLACK_CUR");
                         HCURSOR hBlueCursor = LoadCursor(hInstan, "BLUE_CUR");
                         HCURSOR hWhiteCursor = LoadCursor(hInstan, "WHITE_CUR");
                         HCURSOR hRedCursor = LoadCursor(hInstan, "RED_CUR");
                          if(((LOWORD(lp) >= 0 && HIWORD(lp) >= 0) && (LOWORD(lp) <= 800 && HIWORD(lp) <= 600)))
                           switch( ActiveChip)
                           {
                             case 1: {SetCursor(hBlackCursor); break;}
                             case 5: {SetCursor(hBlueCursor); break;}
                             case 25: {SetCursor(hWhiteCursor); break;}
                             case 100: {SetCursor(hRedCursor); break;}
                             default: SetCursor(LoadCursor(hInstan, IDC_ARROW));
                           }
                            else SetCursor(LoadCursor(hInstan, IDC_ARROW));
                       }
                    return 0;


                Теперь, когда ActiveChip = 0, курсор не отображается вообще, а когда равно 1, 5, 25, 100, выбирается нужный, но работает опять же над всей областью.
                Изначально в классе окна я прописывал так
                ExpandedWrap disabled
                  wc.hCursor = NULL;
                  Цитата kalter14i77 @
                  Изначально в классе окна я прописывал так

                  wc.hCursor = LoadCursor(hInstan, IDC_ARROW);
                    Relaxander прописал по вашему, всё равно та же проблемма
                      Цитата kalter14i77 @
                      а когда равно 1, 5, 25, 100, выбирается нужный, но работает опять же над всей областью.
                      Ваш обработчик - для всего окна или только для вашей области? Если для всего окна, то странно, т.к. у вас есть явные проверки попадания в 800x600. Опишите поподробнее цепочку "выбирается нужный, но работает над всей областью". Верно ли, что выбрался, скажем, красный, а после ухода за область (0,0)..(800,600) он остался красным? Или как?
                      П.С. фигурные скобки в case'ах можете=лучше убрать.
                        Цитата kalter14i77 @
                        Необходимо изменять курсор над определённой областью окна.
                        ExpandedWrap disabled
                          case WM_SETCURSOR:
                          {
                            HCURSOR hBlackCursor = LoadCursor(hInstan, "BLACK_CUR");
                            HCURSOR hBlueCursor = LoadCursor(hInstan, "BLUE_CUR");
                            HCURSOR hWhiteCursor = LoadCursor(hInstan, "WHITE_CUR");
                            HCURSOR hRedCursor = LoadCursor(hInstan, "RED_CUR");
                             if(((LOWORD(lp) >= 0 && HIWORD(lp) >= 0) &&
                                (LOWORD(lp) <= 800 && HIWORD(lp) <= 600)) &&
                          //...
                          }

                        А это что, действительно так ?
                        Что по сообщению WM_SETCURSOR передаются координаты курсора ?
                        Я думаю, что нужно самому вычислить координаты курсора, сравнить и после этого
                        поменять курсор.
                        Сообщение отредактировано: ЫукпШ -
                          Цитата ЫукпШ @
                          Что по сообщению WM_SETCURSOR передаются координаты курсора ?
                          Я думаю, что нужно самому вычислить координаты курсора, сравнить и после этого
                          поменять курсор.
                          Блин, точно. Привыкли мы ко всяким WM_LBUTTONDOWN'ам... :yes-sad:
                            Попробуй так:
                            ExpandedWrap disabled
                                 case WM_SETCURSOR:
                              {
                               POINT cpoint;
                               RECT  wrect;
                               RECT  crect;
                               if(::GetCursorPos(&cpoint))
                               {
                                if(::GetWindowRect(hwnd, &wrect))
                                {
                                 if(::GetClientRect(hwnd, &crect))
                                 {
                                  LONG dxw = wrect.right  - wrect.left;
                                  LONG dxc = crect.right  - crect.left;
                                  LONG dx = (dxw - dxc)/2;// толщина рамки
                                  LONG dy = (wrect.bottom - wrect.top) - (crect.bottom - crect.top) - dx; // толщина заголовка
                               
                              // координаты курсора в координатах клиентской области окна:
                                  LONG xc = cpoint.x - wrect.left - dx;
                                  LONG yc = cpoint.y - wrect.top  - dy;
                               
                                  BOOL changecur=FALSE;
                                  
                                  HCURSOR hcura = ::LoadCursor(NULL, IDC_ARROW);
                                  HCURSOR hcurc = ::LoadCursor(NULL, IDC_CROSS);
                                  if((xc >= 50)&&(xc <= 100))
                                  {
                                   if((yc >= 70)&&(yc <= 190))
                                   {
                                     changecur=TRUE;
                                   }
                                  }
                               
                                  if(changecur)
                                  {
                                   ::SetCursor(hcurc);
                                  }
                                  else
                                  {
                                   ::SetCursor(hcura);
                                  }
                               
                              //...
                              //...
                              ЫукпШ огромное спасибо Вам, Огроомное! Я с Win API только знакомлюсь, поэтому такие банальные ошибки допускаю, заранее извиняюсь. Славян Вам тоже огромное спасибо за терпение. Всего вам самого наилучшего! :)

                              Добавлено
                              Вот код под чистый си, мало ли кому понадобится
                              ExpandedWrap disabled
                                case WM_SETCURSOR:
                                     {
                                       POINT cpoint;
                                       RECT  wrect;
                                       RECT  crect;
                                       HCURSOR hBlackCursor = LoadCursor(hInstan, "BLACK_CUR");
                                       HCURSOR hBlueCursor = LoadCursor(hInstan, "BLUE_CUR");
                                       HCURSOR hWhiteCursor = LoadCursor(hInstan, "WHITE_CUR");
                                       HCURSOR hRedCursor = LoadCursor(hInstan, "RED_CUR");
                                       GetCursorPos(&cpoint);
                                       GetWindowRect(hwnd, &wrect);
                                       GetClientRect(hwnd, &crect);
                                       LONG dxw = wrect.right  - wrect.left;
                                       LONG dxc = crect.right  - crect.left;
                                       LONG dx = (dxw - dxc) / 2;
                                       LONG dy = (wrect.bottom - wrect.top) - (crect.bottom - crect.top) - dx;
                                       LONG xc = cpoint.x - wrect.left - dx;
                                       LONG yc = cpoint.y - wrect.top  - dy;
                                       /*BOOL changecur = FALSE;*/
                                       HCURSOR hcura = LoadCursor(NULL, IDC_ARROW);
                                         if(((xc >= 0)&&(xc <= 800)) && ((yc >= 0)&&(yc <= 600)))
                                         {
                                           switch(ActiveChip)
                                           {
                                             case 1: SetCursor(hBlackCursor); break;
                                             case 5: SetCursor(hBlueCursor); break;
                                             case 25: SetCursor(hWhiteCursor); break;
                                             case 100: SetCursor(hRedCursor); break;
                                             default: SetCursor(hcura); break;
                                           }
                                         }
                                            else
                                             SetCursor(hcura);
                                     }


                              Добавлено
                              =)
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0.0864 ]   [ 16 queries used ]   [ Generated: 10.05.26, 04:50 GMT ]