 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Lun 26 Jul, 2004 5:17 am Asunto: Texto Estatico en el Escritorio de Windows |
|
|
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.. _________________
 |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 27 Jul, 2004 6:34 am Asunto: |
|
|
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..  _________________
 |
|
| Volver arriba |
|
 |
mopa Cmdr

Registrado: 29 Jun 2004Mensajes: 145
|
Publicado: Mie 28 Jul, 2004 9:22 am Asunto: |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mie 28 Jul, 2004 11:42 am Asunto: |
|
|
Ok.. me parece perfecto... _________________
 |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mie 28 Jul, 2004 2:31 pm Asunto: |
|
|
Se me pasaba, me puedes enviar tu ejemplo al correo ccsg259@hotmail.com
gracias.
un saludo. _________________
 |
|
| Volver arriba |
|
 |
Roid Cmdr

Registrado: 18 Ene 2004Mensajes: 135
|
Publicado: Mie 28 Jul, 2004 2:45 pm Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|