Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Изменение размеров окна


Автор: ZufuS 18.12.2007, 22:35
Надо сделать, чтобы при изменении размеров окна, курсор с ухваченной границей сдвигался на N пикселей в сторону движения мыши.

Автор: baldina 18.12.2007, 22:42
А сейчас он на сколько двигается?

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

На сколько и мышка.

Автор: Mihhail 18.12.2007, 23:12
Т.е. что бы не плавно изменялся размер, а рывками по N пикселей?

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

Да

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

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

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

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


Автор: ZufuS 18.12.2007, 23:59
По-моему это не совсем то, что я имел в виду, если я правильно понял, размер окна здесь изменится, когда курсор отодвинится от границы на N пикселей, а я хотел чтобы при перемещении курсора на один пиксель, он перемещался на N пикселей вместе с ухваченной границей.

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


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

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;

не оказывает влияния на изменение размеров окна

Автор: Mihhail 19.12.2007, 17:47
Ты один момент не заметил: замени break; на return (1); т.к. при в твоём случае вызывается стандартный обработчик сообщения.
А возвращая TRUE значение показываешь что программа обрабатывает это собщение.

Автор: ZufuS 19.12.2007, 17:56
То же самое

Автор: Mihhail 19.12.2007, 18:09
Цитата(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 = ....
в зависимости от того какая из границ перетаскивается.

Автор: ZufuS 19.12.2007, 22:28
Цитата(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);

хорошо бы код вместо комментария увидеть, уже много времени потратил, чтобы разобраться, что-то не сходится. А оно у меня ограничено.

Автор: 586 19.12.2007, 22:52
Код
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;
}

ЭТО?

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

Автор: Mihhail 20.12.2007, 16:01
Код
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);


Автор: WM_SASHA 30.1.2008, 09:43
ой извеняюсь, не туда запостил

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)