| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Bitman Lt

Registrado: 30 Mar 2004Mensajes: 80
|
Publicado: Vie 09 Sep, 2011 7:21 pm Asunto: Arrastrar formulario de tamaño mayor al escritorio |
|
|
Hola,
Necesito realizar un entorno para una nueva aplicación que ha de trabajar con formularios con estas caracteristicas:
-. Tamaño superior al escritorio.
-. Poderse arrastrar mediante el evento MouseDown solo verticalmente y no superando los limites del mismo.
He buscado por los foros y he encontrado una solucion que permite arrastrar el formulario implementando en el evento FormMouseDown:
| Código: |
void __fastcall TForm1::FormMouseDown(.....
{
ReleaseCapture();
Perfom(WM_SYSCOMMAND, 0xF012, 0);
}
|
El problema que me he encontrado con este metodo es que permite mover el formulario hacia cualquier dirección y no puedo controlar de una forma elegante que solo sea verticalmente y que no supere los limites del formulario, es decir el efecto que busco es parecido a la del navegador web pero sin la barra de desplazamiento.
| Código: |
void __fastcall TForm1::FormMouseDown(.....
{
ReleaseCapture();
Perfom(WM_SYSCOMMAND, 0xF012, 0);
Left=0;
}
|
Si añado un Left=0 funciona pero no de forma elegante como comentaba.
El otro problema que me encuentro es cuando arrastro el formulario de forma vertical hacia arriba y se sale del escritorio, en cuanto suelto el boton me lo posiciona automaticamente el formulario en la posición Top=0, como puedo hacer para desplazar fuera del margen del escritorio por la parte superior?
Y si alguien tiene idea como aplicar el efecto de arrastrar y velocidad que hace el iphone seria fantastico. |
|
| Volver arriba |
|
 |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
Publicado: Lun 12 Sep, 2011 5:33 pm Asunto: |
|
|
| Código: |
//---------------------------------------------------------------------------
#include <vcl>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//====
int topForm;
bool movForm=false;
//====
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Form1->Left=0;
Form1->Top=0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
POINT cur;
cur=ScreenToClient(Mouse->CursorPos);
topForm=cur.y;
movForm=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
Form1->Cursor=crDrag;
if( movForm==true ) {
Application->ProcessMessages();
POINT cur;
cur=ScreenToClient(Mouse->CursorPos);
Form1->Top=cur.y+Form1->Top - topForm;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
movForm=false;
Form1->Cursor=crDefault;
}
//---------------------------------------------------------------------------
|
|
|
| Volver arriba |
|
 |
Bitman Lt

Registrado: 30 Mar 2004Mensajes: 80
|
Publicado: Lun 12 Sep, 2011 7:16 pm Asunto: |
|
|
Hola Felip,
Muchas gracias por tu respuesta.
La forma en la que tu me propones para realizar el arrastre del formulario es una alternativa que tambien he probado, tanto una como la otra son validas.
De todas formas el mayor problema que se me esta planteando ahora es otro:
| Cita: | | El otro problema que me encuentro es cuando arrastro el formulario de forma vertical hacia arriba y se sale del escritorio, en cuanto suelto el boton me lo posiciona automaticamente el formulario en la posición Top=0, como puedo hacer para desplazar fuera del margen del escritorio por la parte superior? |
No se como evitar que este problema... sino evito esto no tiene sentido el mover el formulario como yo quiero. Haber si alguien sabe como parchear el formualrio para evitar reposicionado que me hace automaticamente. |
|
| Volver arriba |
|
 |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
Publicado: Mar 13 Sep, 2011 3:28 am Asunto: |
|
|
| Cita: |
El otro problema que me encuentro es cuando arrastro el formulario de forma vertical hacia arriba y se sale del escritorio, en cuanto suelto el boton me lo posiciona automaticamente el formulario en la posición Top=0, como puedo hacer para desplazar fuera del margen del escritorio por la parte superior?
|
Hola, Bitman. No estoy seguro de que entiendo muy bien lo que quiere, pero el código que yo os he enviado permite que el formulario se mantienen arriba de Top = 0, sin se posicionar automaticamente. |
|
| Volver arriba |
|
 |
Bitman Lt

Registrado: 30 Mar 2004Mensajes: 80
|
Publicado: Mie 14 Sep, 2011 8:48 am Asunto: |
|
|
Disculpa Felip, tienes toda la razon. Funciona perfectamente y no hace este efecto no deseado que yo mencionaba. El problema es que el codigo es muy similar al que yo mismo realice y pense que tambien tenia el mismo problema.
Muchas gracias. |
|
| Volver arriba |
|
 |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
Publicado: Mie 14 Sep, 2011 12:08 pm Asunto: |
|
|
El código todavía tiene un problema: puede ser retirado de la margen izquierda a través de la barra de título. Para resolver este problema:
| Código: |
// Unit.h:
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void __fastcall WMNCHitTest(TMessage &Msg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_NCHITTEST, TMessage, WMNCHitTest)
END_MESSAGE_MAP(TForm)
|
| Código: |
// Unit.cpp:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Form1->Left=0;
Form1->Top=0;
// insertar esta línea
DeleteMenu(GetSystemMenu(Handle, 0), SC_MOVE, NULL);
}
//..........
void __fastcall TForm1::WMNCHitTest(TMessage &Msg)
{
TForm::Dispatch(&Msg);
if (Msg.Result == HTCAPTION) Msg.Result = HTCLIENT;
}
|
|
|
| Volver arriba |
|
 |
Bitman Lt

Registrado: 30 Mar 2004Mensajes: 80
|
Publicado: Mie 14 Sep, 2011 4:31 pm Asunto: |
|
|
OK, muchas gracias.
Yo mediante las propiedades en este caso le quite barra del titulo. Pero tu opción es muy buena. |
|
| Volver arriba |
|
 |
|