Форум: "Начинающим";
Текущий архив: 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.043 c