Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.10.12;
Скачать: CL | DM;

Вниз

Поворот формы на 180 градусов   Найти похожие ветки 

 
programmer90   (2008-09-01 10:07) [0]

Здравствуйте. У меня такой вопрос можно ли повернуть форму на 180 градусов ? То есть форма при повороте должна выглядеть так будто я смотрю на неё верх ногами, чтобы размер положение и выравнивания не изменялись и текст был аналогичено повёрнут.
Спасибо.


 
oldman ©   (2008-09-01 10:08) [1]

Перевернуть монитор


 
@!!ex ©   (2008-09-01 10:09) [2]

Нельзя стандартными способами.
Ручками писать все контролы, которые нужно повернуть.


 
@!!ex ©   (2008-09-01 10:11) [3]

P.S. - как вариант - рендер контролов на BitMap. И вывод его на форму с поворотом.
Но Caption окна все равно ручками делать, да и контролы не будут правильно реагировать на мышу.


 
oldman ©   (2008-09-01 10:13) [4]


> @!!ex ©   (01.09.08 10:11) [3]


И с комбобоксом такое пройдет?


 
programmer90   (2008-09-01 10:14) [5]

Хорошо облегчим задачу)))
Можно ли печатать не слева-направо и не сверху-вниз, а наоборот?
ЗЫ
Печатаем форму.


 
@!!ex ©   (2008-09-01 10:15) [6]

> [4] oldman ©   (01.09.08 10:13)

А почему нет?


 
programmer90   (2008-09-01 10:16) [7]


> И с комбобоксом такое пройдет?

Не ребята комбобокс не нааадо, у меня вся форма ими завалена вместе с едитами:)


 
oldman ©   (2008-09-01 10:16) [8]


> @!!ex ©   (01.09.08 10:15) [6]
> > [4] oldman ©   (01.09.08 10:13)
>
> А почему нет?


Обработку мыши писать геморройно


 
programmer90   (2008-09-01 10:17) [9]

А можно поподробнее про этот -"рендер контролов на BitMap."?


 
programmer90   (2008-09-01 10:20) [10]


> Обработку мыши писать геморройно

Честно говоря там обработчики мышки особо не нужны.
Да и ещё во время печати наш комбобокс будет уже использован, поэтому его дропдаун направление особого значения не имеет...


 
@!!ex ©   (2008-09-01 10:21) [11]

> [8] oldman ©   (01.09.08 10:16)


> Но Caption окна все равно ручками делать, да и контролы
> не будут правильно реагировать на мышу.


 
Медвежонок Пятачок ©   (2008-09-01 10:29) [12]

ЗЫ
Печатаем форму.


Печатай лучше деньги.


 
Abcdef123   (2008-09-01 10:38) [13]

А можно задать встречный вопрос, ну просто дико интересно, - для чего так заморачиваться в принципе???
У меня просто даже предположения нет. Что есть пользователи-йоги, которые за компом работают стоя на голове? :-)

А для прикола - если нажать Ctrl+Alt+<Стрелка вниз> - то все изображение на мониторе поворачивается на 180. (ну по крайней мере у меня)  :-)


 
Правильный$Вася   (2008-09-01 10:59) [14]

если речь только о печати (на дрюкер, как я понял), то скриншот активного окна можно повернуть перед посылкой на печать
а можно повернуть бумажку, вытащив ее из принтера


 
Медвежонок Пятачок ©   (2008-09-01 11:00) [15]

если речь только о печати

А как запретить переворачивать напечатанный вверх ногами лист обратно вверх головой?


 
Правильный$Вася   (2008-09-01 11:15) [16]


> Медвежонок Пятачок ©   (01.09.08 11:00) [15]

приказом по предприятию


 
Vlad Oshin ©   (2008-09-01 11:50) [17]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   procedure FormPrint(Angle: Double; BackColor: TColor);
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation
    uses Printers;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
FormPrint(180, clWhite);
end;

procedure TForm1.FormPrint(Angle: Double; BackColor: TColor);
var
 FormImage: TBitmap;
 Info: PBitmapInfo;
 InfoSize: DWORD;
 Image: Pointer;
 ImageSize: DWORD;
 Bits: HBITMAP;
 DIBWidth, DIBHeight: Longint;
 PrintWidth, PrintHeight: Longint;

procedure RotateBitmap(Bitmap: TBitmap);
type TRGB = record
      B, G, R: Byte;
    end;
    pRGB = ^TRGB;
    pByteArray = ^TByteArray;
    TByteArray = array[0..32767] of Byte;
    TRectList = array [1..4] of TPoint;

var x, y, W, H, v1, v2: Integer;
   Dest, Src: pRGB;
   VertArray: array of pByteArray;
   Bmp: TBitmap;

 procedure SinCos(AngleRad: Double; var ASin, ACos: Double);
 begin
   ASin := Sin(AngleRad);
   ACos := Cos(AngleRad);
 end;

 function RotateRect(const Rect: TRect; const Center: TPoint; Angle: Double): TRectList;
 var DX, DY: Integer;
     SinAng, CosAng: Double;
   function RotPoint(PX, PY: Integer): TPoint;
   begin
     DX := PX - Center.x;
     DY := PY - Center.y;
     Result.x := Center.x + Round(DX * CosAng - DY * SinAng);
     Result.y := Center.y + Round(DX * SinAng + DY * CosAng);
   end;
 begin
   SinCos(Angle * (Pi / 180), SinAng, CosAng);
   Result[1] := RotPoint(Rect.Left, Rect.Top);
   Result[2] := RotPoint(Rect.Right, Rect.Top);
   Result[3] := RotPoint(Rect.Right, Rect.Bottom);
   Result[4] := RotPoint(Rect.Left, Rect.Bottom);
 end;

 function Min(A, B: Integer): Integer;
 begin
   if A < B then Result := A
            else Result := B;
 end;

 function Max(A, B: Integer): Integer;
 begin
   if A > B then Result := A
            else Result := B;
 end;

 function GetRLLimit(const RL: TRectList): TRect;
 begin
   Result.Left := Min(Min(RL[1].x, RL[2].x), Min(RL[3].x, RL[4].x));
   Result.Top := Min(Min(RL[1].y, RL[2].y), Min(RL[3].y, RL[4].y));
   Result.Right := Max(Max(RL[1].x, RL[2].x), Max(RL[3].x, RL[4].x));
   Result.Bottom := Max(Max(RL[1].y, RL[2].y), Max(RL[3].y, RL[4].y));
 end;

 procedure Rotate;
 var x, y, xr, yr, yp: Integer;
     ACos, ASin: Double;
     Lim: TRect;
 begin
   W := Bmp.Width;
   H := Bmp.Height;
   SinCos(-Angle * Pi/180, ASin, ACos);
   Lim := GetRLLimit(RotateRect(Rect(0, 0, Bmp.Width, Bmp.Height), Point(0, 0), Angle));
   Bitmap.Width := Lim.Right - Lim.Left;
   Bitmap.Height := Lim.Bottom - Lim.Top;
   Bitmap.Canvas.Brush.Color := BackColor;
   Bitmap.Canvas.FillRect(Rect(0, 0, Bitmap.Width, Bitmap.Height));
   for y := 0 to Bitmap.Height - 1 do begin
     Dest := Bitmap.ScanLine[y];
     yp := y + Lim.Top;
     for x := 0 to Bitmap.Width - 1 do begin
       xr := Round(((x + Lim.Left) * ACos) - (yp * ASin));
       yr := Round(((x + Lim.Left) * ASin) + (yp * ACos));
       if (xr > -1) and (xr < W) and (yr > -1) and (yr < H) then begin
         Src := Bmp.ScanLine[yr];
         Inc(Src, xr);
         Dest^ := Src^;
       end;
       Inc(Dest);
     end;
   end;
 end;

begin
 Bitmap.PixelFormat := pf24Bit;
 Bmp := TBitmap.Create;
 try
   Bmp.Assign(Bitmap);
   W := Bitmap.Width - 1;
   H := Bitmap.Height - 1;
   if Frac(Angle) <> 0.0
     then Rotate
     else
   case Trunc(Angle) of
     -360, 0, 360, 720: Exit;
     90, 270: begin
       Bitmap.Width := H + 1;
       Bitmap.Height := W + 1;
       SetLength(VertArray, H + 1);
       v1 := 0;
       v2 := 0;
       if Angle = 90.0 then v1 := H
                       else v2 := W;
       for y := 0 to H do VertArray[y] := Bmp.ScanLine[Abs(v1 - y)];
       for x := 0 to W do begin
         Dest := Bitmap.ScanLine[x];
         for y := 0 to H do begin
           v1 := Abs(v2 - x)*3;
           with Dest^ do begin
             B := VertArray[y, v1];
             G := VertArray[y, v1+1];
             R := VertArray[y, v1+2];
           end;
           Inc(Dest);
         end;
       end
     end;
     180: begin
       for y := 0 to H do begin
         Dest := Bitmap.ScanLine[y];
         Src := Bmp.ScanLine[H - y];
         Inc(Src, W);
         for x := 0 to W do begin
           Dest^ := Src^;
           Dec(Src);
           Inc(Dest);
         end;
       end;
     end;
     else Rotate;
   end;
 finally
   Bmp.Free;
 end;
end;

begin
 Printer.BeginDoc;
 try
  FormImage := GetFormImage;
  RotateBitmap(FormImage);
  Canvas.Lock;
   try
     { Paint bitmap to the printer }
     with Printer, Canvas do
     begin
       Bits := FormImage.Handle;
       GetDIBSizes(Bits, InfoSize, ImageSize);
       Info := AllocMem(InfoSize);
       try
         Image := AllocMem(ImageSize);
         try
           GetDIB(Bits, 0, Info^, Image^);
           with Info^.bmiHeader do
           begin
             DIBWidth := biWidth;
             DIBHeight := biHeight;
           end;
           case PrintScale of
             poProportional:
               begin
                 PrintWidth := MulDiv(DIBWidth, GetDeviceCaps(Handle,
                   LOGPIXELSX), PixelsPerInch);
                 PrintHeight := MulDiv(DIBHeight, GetDeviceCaps(Handle,
                   LOGPIXELSY), PixelsPerInch);
               end;
             poPrintToFit:
               begin
                 PrintWidth := MulDiv(DIBWidth, PageHeight, DIBHeight);
                 if PrintWidth < PageWidth then
                   PrintHeight := PageHeight
                 else
                 begin
                   PrintWidth := PageWidth;
                   PrintHeight := MulDiv(DIBHeight, PageWidth, DIBWidth);
                 end;
               end;
           else
             PrintWidth := DIBWidth;
             PrintHeight := DIBHeight;
           end;
           StretchDIBits(Canvas.Handle, 0, 0, PrintWidth, PrintHeight, 0, 0,
             DIBWidth, DIBHeight, Image, Info^, DIB_RGB_COLORS, SRCCOPY);
         finally
           FreeMem(Image, ImageSize);
         end;
       finally
         FreeMem(Info, InfoSize);
       end;
     end;
   finally
     Canvas.Unlock;
     FormImage.Free;
   end;
 finally
   Printer.EndDoc;
 end;
end;

end.


 
DVM ©   (2008-09-01 13:40) [18]


> Vlad Oshin ©   (01.09.08 11:50) [17]

предупреждать надо, что оно печатает :)


 
han_malign ©   (2008-09-01 14:04) [19]


> Vlad Oshin © [17]

- SetWorldTransform(...)


 
antonn ©   (2008-09-01 14:42) [20]

ого :)
а на канвасе немного сложнее..
canvas.copyrect(rect(0,bt1.height,bt1.width,0),bt1.canvas,rect(0,0,bt1.wid th,bt1.height));


 
Ega23 ©   (2008-09-01 15:04) [21]


> А для прикола - если нажать Ctrl+Alt+<Стрелка вниз> - то
> все изображение на мониторе поворачивается на 180. (ну по
> крайней мере у меня)  :-)


Ух-ты!!! Прикольно!
Не знал.


 
Правильный$Вася   (2008-09-01 15:17) [22]


> > А для прикола - если нажать Ctrl+Alt+<Стрелка вниз> -
> то > все изображение на мониторе поворачивается на 180.

а у меня ничего не поворачивается
может, это в гамерских клавах каких или в растопыренных видюхах?


 
Ega23 ©   (2008-09-01 15:23) [23]


> может, это в гамерских клавах каких или в растопыренных
> видюхах?


Клава обычная, комп - рабочий (видюха - вообще про такую не слышал, но не геймерская - факт).


 
Правильный$Вася   (2008-09-01 15:59) [24]

а, понял
это наверняка нужно установить что-то типа "консоль управления видеокартой", которая идет с драйвером видюхи
там есть такие фичи, в меню видел, только горячих главиш не смотрел
но я все эти прибамбасы не ставлю, только драйвер


 
oldman ©   (2008-09-01 18:00) [25]

Мы в свое пошутили над девочками - поставили в autoexec прогу, разворачивающую картинку вверх ногами (под dos, естественно)
Вопили "ВИРУС!!!" все, кроме одной.
Она сказала "прикольно..." перевернула моник и продолжила работу.

Я аж сам опух!


 
Vlad Oshin ©   (2008-09-02 09:14) [26]

а я писал резидента (под dos, естественно), который буквы случайно(редко) в видеопамяти меняет(реально они не меняются. Т.е. на лабе сидит кто-то, программирует:), и постоянно пишет с опечатками. Возвращается, исправляет, дальше стучит. Смотрит - опять опечатка..(да-да, вот такое я был оно). Зато прикольно. Куча опечаток в операторах, а нажимаешь ctrl+F9 - все работает :)).
Вставил в autoexec, причем, добавив кучу #13, т.е. программка была гдето на 3 странице, если в нортоне листать. Естественно, F3 - и ничего особенного не видно



Страницы: 1 вся ветка

Текущий архив: 2008.10.12;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.022 c
15-1219304588
TRSteep
2008-08-21 11:43
2008.10.12
vbs скрипт и принтеры


3-1207245676
kotyara12
2008-04-03 22:01
2008.10.12
Рекурсивная выборка из таблицы со структурой дерева


3-1207907676
Xmen
2008-04-11 13:54
2008.10.12
Проблемы с DBGridом


2-1220338737
Сергей
2008-09-02 10:58
2008.10.12
Как увеличить высоту ComboBox?


2-1220887663
Terasbetoni
2008-09-08 19:27
2008.10.12
Использование двух классов друг другом. Классы в разных модулях