Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.10.12;
Скачать: [xml.tar.bz2];

Вниз

Поворот формы на 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.053 c
15-1219061215
Dmitry S
2008-08-18 16:06
2008.10.12
Как быстро выполнить операцию?


3-1204791768
Tzw
2008-03-06 11:22
2008.10.12
Выборка через процедуру, Firebird 2.0


15-1219385138
vajo
2008-08-22 10:05
2008.10.12
Про активацию Windows XP


15-1219145496
keymaster
2008-08-19 15:31
2008.10.12
Как правильнее?


2-1220709929
Витя_1
2008-09-06 18:05
2008.10.12
FindFirstFile





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский