Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   URL en la barra de titulo??? (https://www.clubdelphi.com/foros/showthread.php?t=29683)

Jonnathan 29-01-2006 17:42:19

URL en la barra de titulo???
 
Buen día amigos del foro, tenía una idea a ver si me pueden dar una sugerencia. Recuerdo que una vez probé una versión beta de Windows Whistler (Actualmente Windows XP), en esa versión las ventanas del sistema tenian una URL al lado de los botones de cerrar, minimizar... que decía "Enviar un Comentario" y cuando hacias clic ahi, te abría un formulario para llenar unos datos y enviar el comentario a la gente de Microsoft.

Voy a entrar en periodo de pruebas de un sistema que estoy haciendo y me parecio buena idea, ya que varias personas van a probar la aplicación en diferentes departamentos de la empresa, ¿alguna idea de como meter un componente en la barra de título o algun botón para hacer eso? :o .

dec 29-01-2006 18:11:14

Hola,

En Torry's aparecen no pocos resultados cuando buscamos por "caption button". Creo que puedes aprovechar alguno de los componentes que se te ofrecen. Empero, si tienes instalada la Jedi Library, cuentas también con un componente de nombre "TJvCaptionButton", en la pestaña "JvButtons" de la paleta de componentes: estoy jugando un poco con él ahora mismo y la verdad es que va muy bien y ofrece no pocas opciones.

roman 30-01-2006 01:13:45

¿Y por qué no optas por soluciones más sencillas pero igualmente eficaces? No sé como tengas dispuestos tus formularios pero siempre habrá algún lugar donde poner el enlace que deseas sin complicarte la vida y sin salirte de los estándares de una interfaz Windows.

// Saludos

dec 30-01-2006 01:24:47

Hola,

Cita:

Empezado por Román
No sé como tengas dispuestos tus formularios pero siempre habrá algún lugar donde poner el enlace que deseas sin complicarte la vida y sin salirte de los estándares de una interfaz Windows.

Puedo estar de acuerdo contigo, pero, me llamó la atención lo que dijiste, por lo que Jonnathan apunta más arriba:

Cita:

Empezado por Jonnathan
Recuerdo que una vez probé una versión beta de Windows Whistler (Actualmente Windows XP), en esa versión las ventanas del sistema tenian una URL al lado de los botones de cerrar, minimizar... que decía "Enviar un Comentario"

Es decir, el propio Windows utilizó ese lugar tan poco habitual (la barra de título) para insertar un enlace para obtener cierto "feedback"...

Por otro lado, y, para este caso, no me cae mal el "botoncito" en la barra de título, precisamente, porque deja claro (como el que no quiere la cosa) que se trata de algo temporal, que ese no es su lugar, pero bien visible para que alguien pueda aportar sus comentarios, tratándose de un programa en pruebas, o sea. ;)

A lo mejor esto es un poco como el "estilo" de un programador a la hora de nombrar variables, identificadores, funciones, etc., etc. Comprendo que haya que mantener ciertas formas en la interfaz de los programas, pero acaso no esté mal romperlas de vez en cuando. ¿No? Pero, ya me callo, que me estoy poniendo muy pesadito con el tema. ;)

roman 30-01-2006 07:46:33

Cita:

Empezado por dec
Es decir, el propio Windows utilizó ese lugar tan poco habitual (la barra de título) para insertar un enlace para obtener cierto "feedback"...

Bueno, ¿cuántos no hemos visto los estándares de código de Borland? Y basta darse una vuelta por el código fuente de la VCL para darse cuenta del sin número de violaciones que ellos mismos hacen.

Pero ciertamente, al final es una cuestión de gusto personal. A mi en lo particular me terminan pareciendo "menos profesionales" los programas que agregan elementos poco ortodoxos. Y por otro lado, un enlace de feedback ni siquiera tiene porque desaparecer aun terminado el periodo de pruebas. Los usuarios siempre agradecerán la posibilidad de enviar comentarios y sugerencias respecto de la interfaz.

// Saludos

roman 30-01-2006 09:04:01

Ahora que, si insisten, aquí está lo básico para empezar:

Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    LinkCaption: String;

    (*
      Windows pinta el título en cualquiera de estos dos mensajes, así
      que hay que interceptarlos para dibujar el título nosotros mismos
    *)
    procedure WMNCPaint(var Msg: TWMNCPaint); message WM_NCPAINT;
    procedure WMNCActivate(var Msg: TWMNCActivate); message WM_NCACTIVATE;
    procedure WMSetCursor(var Msg: TWMSetCursor); message WM_SETCURSOR;

  public
    (* Método para dibujar el título *)
    procedure PaintCaption;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  LinkCaption := 'Enviar sugerencia';
end;

procedure TForm1.WMNCActivate(var Msg: TWMNCActivate);
begin
  inherited;
  PaintCaption; // Pintar el título
end;

procedure TForm1.WMNCPaint(var Msg: TWMNCPaint);
begin
  inherited;
  PaintCaption; // Pintar el título
end;

procedure TForm1.PaintCaption;
var
  ncCanvas: TCanvas;
  cxSmIcon: Integer;
  cxSizeFrame: Integer;
  cySizeFrame: Integer;
  cyCaption: Integer;
  cxText: Integer;
  cyText: Integer;

begin
  ncCanvas := TCanvas.Create;
  try
    { Obtener un canvas que incluya el área no-cliente }
    ncCanvas.Handle := GetWindowDC(Handle);
    with ncCanvas do
    begin
      { Usar fondo transparente }
      Brush.Style := bsClear;

      { Fuente del título }
      if Windows.GetForegroundWindow = Self.Handle
        then Font.Color := clCaptionText
        else Font.Color := clInactiveCaptionText;

      Font.Style := Font.Style + [fsBold, fsUnderline];

      { Medidas para colocar el título }
      cxSmIcon := GetSystemMetrics(SM_CXSMICON);
      cxSizeFrame := GetSystemMetrics(SM_CXSIZEFRAME);
      cySizeFrame := GetSystemMetrics(SM_CYSIZEFRAME);
      cyCaption := GetSystemMetrics(SM_CYCAPTION);
      cxText := TextWidth(LinkCaption);
      cyText := TextHeight(LinkCaption);

      { Pintar el título }
      TextOut(
        ClientWidth - (cxSizeFrame + 3*cxSmIcon + cxText),
        cySizeFrame + ((cyCaption - cyText) div 2) - 1,
        LinkCaption);
    end;
  finally
    ReleaseDC(Handle, ncCanvas.Handle);
    ncCanvas.Free;
  end;
end;

procedure TForm1.WMSetCursor(var Msg: TWMSetCursor);
var
  ncCanvas: TCanvas;
  cxSmIcon: Integer;
  cxSizeFrame: Integer;
  cxText: Integer;
  htPoint: TPoint;

begin
  inherited;

  if Msg.HitTest = HTCAPTION then
  begin
    htPoint := ScreenToClient(Mouse.CursorPos);

    ncCanvas := TCanvas.Create;
    try
      { Obtener un canvas que incluya el área no-cliente }
      ncCanvas.Handle := GetWindowDC(Handle);

      with ncCanvas do
      begin
        Font.Style := Font.Style + [fsBold, fsUnderline];

        cxSmIcon := GetSystemMetrics(SM_CXSMICON);
        cxSizeFrame := GetSystemMetrics(SM_CXSIZEFRAME);
        cxText := TextWidth(LinkCaption);
      end;

      if (htPoint.X >= ClientWidth - (2*cxSizeFrame + 3*cxSmIcon + cxText)) then
      begin
        SetCursor(Screen.Cursors[crHandPoint]);

        if Msg.MouseMsg = WM_LBUTTONDOWN then
          ShowMessage('Enviando comentario');
      end;
    finally
      ncCanvas.Free;
    end;
  end
  else
    Screen.Cursor := crDefault;
end;

end.

Está muy sucio y hay que refinar muchas cosas pero más o menos funciona. Se basa en un formulario con borde normal y sus tres botones que corresponden al 3 que aparece como factor en las fórmulas de arriba.

Aquí no estamos añadiendo un botón sino literalmente añadiendo una "url" en la parte derecha de la barra de título.

// Saludos

dec 30-01-2006 14:57:20

Hola,

Sigo estando de acuerdo contigo Román. Y, por cierto, el código fuente me parece magistral, incluso si puede limarse un poco. ;)

Jonnathan 30-01-2006 20:43:24

Hola amigos del foro, gracias por sus respuestas. Ciertamente me interesaba poner ese control en la barra de título y no en alguna otra parte del programa porque de ser asi tendría que buscarle espacio en todas las ventanas del sistema (unas 30 mas o menos) y despues de la fase de pruebas tendría que quitarlo de todas. Se me ocurrió que como estoy heredando todas mis ventanas de una clase llamada TFormGenerico, podía poner ese truquito solo en esa ventana y listo!!!! todas mis ventanas con URL de "Enviar comentario" con su respectivo código, y en un lugar que no molestrá a ningun otro componente.

Por motivos de tiempo roman no pude probar tu código, pero me parece que está excelente. Al final termine usando un componente "Button Caption" que encontre por ahí, pero voy a ver si se puede cambiar por una URL por cuestión de gusto (en Windows Xp el boton se ve como un boton cuadrado de Windows 2000/9x)


La franja horaria es GMT +2. Ahora son las 10:42:48.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi