Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Texto Estatico en el Escritorio de Windows

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Texto Estatico en el Escritorio de Windows Responder citando

Bien, en base a un codigo encontrado en el foro.. tengo un Texto.. dibujado en el escritorio..
de la siguiente maner
el form cuenta con 2 botones y 1 timer..

el codigo es el siguiente..
Código:

//---------------------------------------------------------------------------
#define NO_WIN32_LEAN_AND_MEAN
#include <shlobj.h>
#include <vcl.h>
#include <comctrls.hpp>

#pragma hdrstop
#include "Unit1.h" // form principal
#include "Unit2.h" // form secundario, por si no jala este proceso.

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TForm *pF; // para crear el form2
int H,M,S;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    this->Timer1->Enabled = !this->Timer1->Enabled;
//    pF= new TForm2 (static_cast<void *>(NULL) );
//    pF->Show();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
/*    if(pF){
        delete pF;
        pF=NULL;
    }*/

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
TCanvas *DesktopCanvas;
HDC Desktop;
    S++;
    if(S>59){
        M++;
        S=0;
    }
    if(M>59){
        H++;
        M=0;
    }

    AnsiString Ho= Rellena(AnsiString(H),'0',2)+":"+
                   Rellena(AnsiString(M),'0',2)+":"+
                   Rellena(AnsiString(S),'0',2);
    AnsiString Cadena = "Actividad:"+Ho;
DesktopCanvas = new TCanvas();
Desktop = GetWindowDC (GetDesktopWindow());
DesktopCanvas->Handle = Desktop;
DesktopCanvas->Font->Name ="Arial";
DesktopCanvas->Font->Size = 12;
DesktopCanvas->Font->Style = TFontStyles()<< fsBold << fsUnderline;
DesktopCanvas->Brush->Color = (TColor) 0x0074F8DA ;
DesktopCanvas->TextOut((Screen->Width/2)-Cadena.Length()*DesktopCanvas->Font->Size/2,2,Cadena);
DesktopCanvas->Lock();
}
//---------------------------------------------------------------------------


Bien, el texto aparece, tal y como realmente se desea. el unico detalle, es que cuando minimizo una ventana, cual quiera que sea, y arrastro, esta ventana (la barra de titulo, dejandolo encima del texto), el texto aparece nuevamente.. que es lo que se requiere. bueno el detalle que tengo es que cuando vuelvo arrastrar la ventana, en la barra de titulo, se muestra, el texto, es decir aparecen 2 texto, el normal que quiero, en la parte de arriba, pero tambien se queda colgado, en la barra de la ventana, si realizó, un minimizar y maximizar, el texto se borra, de la ventana,

mis preguntas son
1.-de que manera, puedo hacer, para que el texto no se dibuje, en la barra del titulo.. cuando esta se mueva.., pero que siga pareciendo el texto, en el escritorio.
2.- me es mas facil utilizar un Form, con el texto?, y mostrarlo, que el pequeño inconventiente, es que cuando, me muevo de una ventana a otra, el texto ya no aparece, por mas que el form, le pongo la propiedad, StayOnTop.

Objetivo: poner un texto que identifique al usuario, el tiempo de uso, del equipo, en el escritorio por supuesto.. y tenerlo siempre a la vista..

alguien me puede ayudar a componer el codigo... o a darme alguna idea de como hacerlo diferente..

Saludos..
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Bien al parecer, no pude hacer el refresco de las ventanan que se sobreponen, he cambiado de idea, y ahora vamos con la segunda opcion..

tenemos un segundo Form, donde en un Tlabel, muestro el mesaje
"Uso del Equipo:<el tiempo que lleva el usuario>", bien

la pregunta es:

¿como puede hacerse, para que este form, se encuentre siempre en al frente de todas las ventanas?

he intentado con StayOnTop, pero en algunos casos, queda, bien, pero al iniciar el Messenger, este se sobrepone al Form, con el texto, quedando en la parte trasera del form..

mi idea era crear una ventana, como la del descargador "FlashGet.exe", que cuenta con una zona de arraste, este "cuadrito", se queda, siempre encima de todos, aun encima del Messenger, para ser exactos, y eso es lo que interesa,

El objetivo, es establecer un Relog, para que el usuario, sepa el tiempo que lleva utilizando el equipo...

Gracias.. ahora espero otras respuestas.. saludos..

pd, cuando minimo un gesto.. Wink Laughing
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Saludos!

Bajo mi punto de vista pintar en el canvas del escritorio te va a plantear muchisimos problemas con el repintado.
He conseguido hacerlo de una forma que funciona bastante bien, el unico inconveniente que tiene es que si la aplicacion se minimiza entonces si se pierde el reloj, pero se puede solucionar facilmente evitando el minimizado de la aplicacion y listo.
La tecnica es muy simple y consiste en capturar el evento OnDeactivate de la aplicacion y evitar que la ventana del reloj (ya sea la principal u otra) se oculte. Exisdte una funcion de la api que ademas puede posicionarla justo encima de todas.. o sea.. Perfecto!!
He utilizado un Form2 stylo fsStayOnTop con un label. De transparent color pones el mismo del form para que sea transparente.. y borderstyle a None para que no tenga borde.

Aqui te dejo como lo he resuelto:

Metodo para sobrecargar el AppDeactivate:

void __fastcall TForm1::AppDesactivada(TObject *Sender){
SetWindowPos(Form2->Handle,HWND_TOPMOST,Form2->Left,Form2->Top,Form2->Width,Form2->Height,SWP_NOMOVE );
};

En el constructor del form :
Application->OnDeactivate=AppDesactivada;

De esta forma, cuando la aplicacion pierde el foco (Caso en el que se ocultan los forms aunque esten es stayontop) automaticamente se posiciona la ventana que queremos por encima de todas.. por lo que el efecto es que SIEMPRE esta ventana va a quedar por encima. (Excepto cuanso se minimiza ) -> lo puedes resolver evitando el minimize o buscando algun truco.
Espero haberte ayudado.
Un saludo
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Ok.. me parece perfecto...
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Se me pasaba, me puedes enviar tu ejemplo al correo ccsg259@hotmail.com

gracias.

un saludo.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Por si te sirve de algo te pongo el codigo para hacer refresco de pantalla


Código:

    this->Deactivate();
    LPITEMIDLIST  pIDList; // Pointer to the Item Identifier List
    SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &pIDList);
    SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, pIDList,0);
    this->Activate();


Cuando refrescas se te borra lo q has escrito.

Un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.