Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение размеров окна 
:(
    Опции темы
ZufuS
Дата 18.12.2007, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Надо сделать, чтобы при изменении размеров окна, курсор с ухваченной границей сдвигался на N пикселей в сторону движения мыши.
PM   Вверх
baldina
Дата 18.12.2007, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: нет
Всего: 101



А сейчас он на сколько двигается?
PM MAIL   Вверх
ZufuS
Дата 18.12.2007, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Цитата(baldina @  18.12.2007,  23:42 Найти цитируемый пост)
А сейчас он на сколько двигается?

На сколько и мышка.
PM   Вверх
Mihhail
Дата 18.12.2007, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 13.9.2007

Репутация: 5
Всего: 9



Т.е. что бы не плавно изменялся размер, а рывками по N пикселей?
PM MAIL WWW   Вверх
ZufuS
Дата 18.12.2007, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Цитата(Mihhail @  19.12.2007,  00:12 Найти цитируемый пост)
Т.е. что бы не плавно изменялся размер, а рывками по N пикселей?

Да
PM   Вверх
Mihhail
Дата 18.12.2007, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 13.9.2007

Репутация: 5
Всего: 9



Тебе нужно сообщение WM_SIZING оно передаётся еще до изменения самого окна, в lparam содержится указатель на структуру RECT значения в которой можно поменять на собственные.

Код
....
case WM_SIZING:
   memcpy( &GrRc, (LPRECT)lparam, sizeof(RECT) );

   //Здесь проверяем если курсор от границы окна меньше чем N пикселей установить в GrRc значения которые были при предыдущем вызове, в противном случае ни чего не делать т.е. позволить изменить размер

   memcpy( (LPRECT)lparam, &GrRc, sizeof(RECT) );
   return(0);


PM MAIL WWW   Вверх
ZufuS
Дата 18.12.2007, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



По-моему это не совсем то, что я имел в виду, если я правильно понял, размер окна здесь изменится, когда курсор отодвинится от границы на N пикселей, а я хотел чтобы при перемещении курсора на один пиксель, он перемещался на N пикселей вместе с ухваченной границей.
PM   Вверх
Mihhail
Дата 19.12.2007, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 13.9.2007

Репутация: 5
Всего: 9



Тогда при каждом WM_SIZING проверяем на сколько пикселей разница между границей и курсором умножаем на N соответственно изменяя значения в GrRc и перемещаем курсор в нужную координату - SetCursorPos .


PM MAIL WWW   Вверх
ZufuS
Дата 19.12.2007, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



В общем предложенный вариант тоже подойдёт, но почему-то не работает
Код

case WM_ENTERSIZEMOVE:
    GetCursorPos(&curpos1);
    break;
case WM_SIZING:
    GetCursorPos(&curpos2);
    memcpy(&GrRc, (LPRECT)lParam, sizeof(RECT));
    if(curpos2.x-curpos1.x<N || curpos1.x-curpos2.x<N)
    {
        memcpy((LPRECT)lParam, &GrRc, sizeof(RECT));
        curpos1.x = curpos2.x;
        curpos1.y = curpos2.y;
    }
    break;

не оказывает влияния на изменение размеров окна
PM   Вверх
Mihhail
Дата 19.12.2007, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 13.9.2007

Репутация: 5
Всего: 9



Ты один момент не заметил: замени break; на return (1); т.к. при в твоём случае вызывается стандартный обработчик сообщения.
А возвращая TRUE значение показываешь что программа обрабатывает это собщение.
PM MAIL WWW   Вверх
ZufuS
Дата 19.12.2007, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



То же самое
PM   Вверх
Mihhail
Дата 19.12.2007, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 13.9.2007

Репутация: 5
Всего: 9



Цитата(ZufuS @  19.12.2007,  18:38 Найти цитируемый пост)
if(curpos2.x-curpos1.x<N || curpos1.x-curpos2.x<N)
    {
        memcpy((LPRECT)lParam, &GrRc, sizeof(RECT));
        curpos1.x = curpos2.x;
        curpos1.y = curpos2.y;
    }

Да, вот сразу не заметил - ты же не изменяешь координаты прямоугольника окна GrRc, естественно всё как есть остаётся!
Вычислять нужно и менять правую/левую верхнюю нижнюю границы:
GrRc.right = ....
GrRc.bottom = ....
в зависимости от того какая из границ перетаскивается.
PM MAIL WWW   Вверх
ZufuS
Дата 19.12.2007, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Цитата(Mihhail @  19.12.2007,  00:40 Найти цитируемый пост)
case WM_SIZING:   memcpy( &GrRc, (LPRECT)lparam, sizeof(RECT) );   //Здесь проверяем если курсор от границы окна меньше чем N пикселей установить в GrRc значения которые были при предыдущем вызове, в противном случае ни чего не делать т.е. позволить изменить размер   memcpy( (LPRECT)lparam, &GrRc, sizeof(RECT) );   return(0);

хорошо бы код вместо комментария увидеть, уже много времени потратил, чтобы разобраться, что-то не сходится. А оно у меня ограничено.
PM   Вверх
586
Дата 19.12.2007, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Код
INT_PTR CALLBACK MainDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    LPRECT r;
    switch(uMsg)
    {
    case WM_CLOSE: EndDialog(hWnd, 0); break;
    case WM_SIZING:
        r=(LPRECT)lParam;
        r->right-=r->right % 50;
        r->bottom-=r->bottom % 50;
        break;

    default: return FALSE;
    }
    return TRUE;
}

ЭТО?
PM   Вверх
ZufuS
Дата 19.12.2007, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Похоже, но надо чтобы размер ширины клиентской области всегда был кратен N, а по высоте фиксирован.

Это сообщение отредактировал(а) ZufuS - 19.12.2007, 23:05
PM   Вверх
Mihhail
Дата 20.12.2007, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 13.9.2007

Репутация: 5
Всего: 9



Код
case WM_ENTERSIZEMOVE:
   GetCursorPos( &curpos1 );
   GetWindowRect( hwnd, &GrRc1 );
   break;

case WM_SIZING:{
   GetCursorPos( &curpos2 );
   memcpy( &GrRc, (LPRECT)lparam, sizeof(RECT) );

   H = GrRc.bottom - GrRc.top;

   //Фиксированый размер по высоте
   if( H > MAXH ){
      if( curpos2.y > curpos1.y ) GrRc.bottom = GrRc.top + MAXH;
         else GrRc.top = GrRc.bottom - MAXH;
      }
   if( H < MAXH ){
      if( curpos2.y < curpos1.y ) GrRc.bottom = GrRc.top + MAXH;
         else GrRc.top = GrRc.bottom - MAXH;
      }

   //При каждом изменении ширины граница смещается на N
   K = curpos2.x - curpos1.x;
   if( K ){
      if( GrRc1.left != GrRc.left ){
         if( K < 0 ){
            GrRc.left = GrRc1.left - N;
            if( GrRc.left < 0 ) GrRc.left = 0;
            }
            else{
               GrRc.left = GrRc1.left + N;
               if( GrRc.left > GrRc1.right - MINW ) GrRc.left = GrRc1.right - MINW;
               }

         curpos1.x = GrRc.left;
         curpos2.x = GrRc.left;
         GrRc1.left = GrRc.left;
         }

      if( GrRc1.right != GrRc.right ){
         if( K < 0 ){
            GrRc.right = GrRc1.right - N;
            if( GrRc.right < GrRc1.left + MINW ) GrRc.right = GrRc1.left + MINW;
            }
            else{
               GrRc.right = GrRc1.right + N;
               if( GrRc.right > 1024 ) GrRc.right = 1024;
               }

         curpos1.x = GrRc.right;
         curpos2.x = GrRc.right;
         GrRc1.right = GrRc.right;
         }
      }
   SetCursorPos( curpos2.x, curpos2.y );

   memcpy((LPRECT)lparam, &GrRc, sizeof(RECT));
   } return (1);


PM MAIL WWW   Вверх
WM_SASHA
Дата 30.1.2008, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 12.4.2007
Где: Узбекистан г.Ташк ент

Репутация: нет
Всего: нет



ой извеняюсь, не туда запостил

Это сообщение отредактировал(а) WM_SASHA - 30.1.2008, 09:55
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.