Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Графический редактор - Как сделать чтобы при изменении размера окна форма не очищалась

Я делаю графический редактор и возник вопрос
-как сделать чтобы при изменении размера окна форма не очищалась?
Ответ: буду делать на TImage
Вопрос: Изменение размера окна по диагонали

Хочу сделать так, чтобы при изменении размера окна размер менялся по диагонали.
Т.е. увеличил ширину на 50 пикселей, на 50 увеличилась и высота. Уменьшили высоту на 10, ширина тоже уменьшилась на 10.
Пишу так:

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      HeightMinusWidth := Height-Width;
    end;
     
    procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
      NewHeight: Integer; var Resize: Boolean);
    var dX, dY: Integer;
    begin
    //  ListBox1.Items.Add(IntToStr(NewWidth) + ' ' + IntToStr(NewHeight));
      dX := NewWidth-Width;
      dY := NewHeight-Height;
      if (dX = 0) and (dY <> 0) then NewWidth := NewHeight-HeightMinusWidth;
      NewHeight := NewWidth+HeightMinusWidth;
    end;

Так вот, если я меняю ширину - всё ок, пока я тяну. Как только отпускаю мышь, размер возвращается на прежний уровень. Потому что с какой-то радости OnCanResize вызывается ещё раз с NewHeight = старому (первоначальному) значению.
Смотрю в ListBox1 (если раскомментировать эту строку):
    368 549 - исходные значения
    369 549 - тяну
    369 550 - после моей обработки
    . . .
    396 577
    397 549 - тяну (почему тут старый Height, а не 577 ???)
    397 578 - после моей обработки
    отпускаю мышь:
    397 549 - высота не изменилась, изменилась только ширина, в итоге мой код сужает окно
    368 549 - результат

Если я тяну вверх-вниз, там вообще окно мерцать начинает...

Что за ерудна?! Как сделать рабочий код?
Ответ:
leo, да, спасибо.
Прикол в том, что я пробовал WM_SIZING, но не в Delphi, а в Lazarus. Там он почему-то не работает, т.е. WM_SIZING не вызывается вообще (и я подумал, что и в Delphi будет то же самое, но сейчас попробовал – работает). Я не понимаю почему, но факт такой.
Не знаешь, почему такое может быть?

Добавлено
Кстати, тут прикол ещё в том, что если какая-то внешняя программа изменит размер окна (либо я нажму Win+Left, Win+Right, разверну окно на весь экран), то WM_SIZING не сработает.
Ну MAXIMIZE ещё можно отловить через WM_SYSCOMMAND, но остальное уже геморнее.
С этой точки зрения, конечно, CanResize (он же WM_WINDOWPOSCHANGING выгоднее), но тут возникает описанная выше проблема...
Вопрос: Плавное изменение размеров окна. Как это реализуется?

Всем привет. Я тут столкнулся с проблемой касательно wpf. Заключается она вот в чем... Есть окно у которого с такими свойствами:
XML
1
2
3
4
 <Setter Property="WindowStyle" Value="None"/>
        <Setter Property="AllowsTransparency" Value="True"/>
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="ResizeMode" Value="CanResizeWithGrip" />
У него есть три части верхняя строка(там тайтл и кнопки закрыть, свернуть), размер задан 40пикс. Центральная часть с контентом размер у нее "auto"? и нижняя строка(footer) размером 50 пикс. Проблема в том, что при изменении размеров окна нижняя строка начинает дёргаться и менять размер немного, пока я не перестану менять размер окна. Пытаюсь убрать такой кривой и дёрганый ресайз. Кто-нибудь поможет предложениями, как его победить? Мб свою функцию для ресайза написать... Спасибо)
Ответ: Я это уже читал, даже скачал этот проект, запустил. Окно всё-равно дёргается если очень быстро менять размер. Это приколы впфа. Тут единственный вариант решение(насколько я понимаю) - написать изменение размеров самому. Только я понятия не имею как
Вопрос: Пропорциональное изменение размеров окна

Как сделать, чтобы при изменении размера окна программы пользователем (мышкой) сохранялось соотношение сторон?

Собсна сам алгоритм понятен. Нужно хранить текущие размеры окна, ловить изменение размера, вычислять что больше меняется - горизонталь или вертикаль - и принудительно менять второй параметр. Но не изобретаю ли я велосипед? Может есть стандартный метод?
Ответ: Переопредели следующие методы:
C++ (Qt)
1
2
virtual bool hasHeightForWidth() const;
virtual int heightForWidth(int w) const;
Вопрос: При изменении размера окна программы меняется и размер изображения

Здравствуйте. Как сделать так, чтобы при изменении размера окна программы менялся и размер изображения ?
Фигуры строил с помощью прямоугольника и многоугольника.
Спасибо.
Ответ:
Сообщение от Garold
изменении размера окна программы менялся и размер изображения ?
Ну, так и ммасштабируй изображение. У тебя координаты задаются статикой.

Не по теме:

Сообщение от Garold
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
Graphics2D g2 = (Graphics2D) g;
Graphics2D g3 = (Graphics2D) g;
Graphics2D g4 = (Graphics2D) g;
Graphics2D g5 = (Graphics2D) g;
Graphics2D g6 = (Graphics2D) g;
Graphics2D title = (Graphics2D) g;
На кой? И что по-твоему происходит, когда операторы выполнятся?

Вопрос: Проверка размера окна в GraphABC

Есть переменная Size:integer; она равна стороне окна - окно квадратное. В цикле проверка: if WindowHeight <> Size then ...
Даже если размер окна не изменяли, в проге if выполняется. Эта штука сделана, чтобы узнать, когда пользователь изменит размер окна. Как исправить это дело?
Ответ: Не надо ичего проверять ни в каком цикле. Есть событие OnResize, вот в его обработчике и проверяй. Как только пользователь изменит размер окна - сработает это событие:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
uses GraphABC;
 
var 
  size : integer:= 400;
 
procedure DoResize;
begin
  if WindowHeight <> size then
    Halt; // ну,или что там нужно делать...
end;
 
begin
  SetWindowSize(size, size);
  OnResize += DoResize;
end.
Вопрос: Не меняется размер окна

Добрый вечер.
Загружаю изображение, если его размер меньше размера окна(800;600), необходимо уменьшить размер окна.

  Image im1 = new Image();

                    BitmapImage bi = new BitmapImage(new Uri(Full_path));
                    im1.Source = bi;

                        if (this.Width > bi.PixelWidth) { grid1.Width = bi.PixelWidth + 4; this.Width = bi.PixelWidth + 4; }
                        if (this.Height > bi.PixelHeight) {grid1.Height = bi.PixelHeight + 24; this.Height = bi.PixelHeight + 24; }
                   
                    grid1.Children.Add(im1);
                    


Собственно, проверяю значения this.Width и this.Height - они меняются на меньшие (300;200), но в реальности размер окна остаётся таким же, просто само изображение становится маленьким относительно размера окна.
Это как возможно?
Ответ: vb_sub,

Кое как получилось: сделал margin 40 от top и размер окна + 80.
Как-то странно, но более-менее работает.
Вопрос: В чем измеряется размер окна в Visual Studio

Всем привет!
Во вложении выделен размер окна моей проги.

В чем это измеряется? Явно не пиксели.
И можно ли как-то включить, чтобы было в пикселях?
Ответ: Кто-нибудь ещё что-нить предложит?
Как именно в самой студии сделать размеры окна по пикселям?
Вопрос: Qml изменение размера Canvas при изменении размера окна

Может есть какой нибудь способ, чтобы при изменении размера окна (в моем случае window) изменялся размер рисунка Canvas (увеличивался или уменьшался по горизонтали или вертикали вслед за размером окна), или же без перерисовки всего Canvas не обойтись?
C++ (QT)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Window {
        id: window
        visible: false
        width: 600
        height: 280
        minimumHeight: 280
        minimumWidth: 600
        title: qsTr("График")
 
 
        Rectangle {
            id: oknoGrafika
            y: 20
            width: 1000
            color: "red"
            height: window.height - 50
            x: { window.width - x1 }
            onXChanged: {
                ricunok.requestPaint()
            }
 
 
            Canvas {
                id: ricunok
                anchors.fill: parent
 
                onPaint: {
                    var ctx = getContext("2d");
                    if(draw == 0)
                    {
                        ctx.clearRect(0, 0, parent.width, parent.height)
                        ctx.save()
                        ctx.strokeStyle = "black";
                        ctx.lineWidth = 2;
                        ctx.moveTo(x2, oknoGrafika.height / 2 - y2 );
                        ctx.lineTo(x1, oknoGrafika.height / 2 - y1 );
                        ctx.stroke();
                        ctx.restore();
 
                        x2 = x1
                        y2 = y1
                        draw = 0
                    }
                    else {
                        ctx.reset();
                        draw = 0;
                    }
                         }
                  }
        }}
Вот, что у меня происходит сейчас:
Ответ: Я не вижу у Canvas таких же методов как у Image, так что скорее всего без перерисовки не обойтись. Но честно признаюсь, близко я Canves не щупал.
Вопрос: Пропорциональное масштабирование элементов при изменении размера окна

Подскажите, как сделать так чтобы при изменении размеров окна пропорционально масштабировались элементы в этом окне?
Ответ:
Сообщение от ViterAlex
aleksskay4, его тоже не достаточно
в некоторых случаях достаточно.