<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- /home/espenr/tmp/qt - 3.3.8 - espenr - 2499/qt - x11 - free - 3.3.8/examples/desktop/desktop.doc:5 -->
< html >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=ISO-8859-1" >
< title > Painting on the Desktop< / title >
< style type = "text/css" > < ! - -
fn { margin-left: 1cm; text-indent: -1cm; }
a:link { color: #004faf; text-decoration: none }
a:visited { color: #672967; text-decoration: none }
body { background: #ffffff; color: black; }
-->< / style >
< / head >
< body >
< table border = "0" cellpadding = "0" cellspacing = "0" width = "100%" >
< tr bgcolor = "#E5E5E5" >
< td valign = center >
< a href = "index.html" >
< font color = "#004faf" > Home< / font > < / a >
| < a href = "classes.html" >
< font color = "#004faf" > All Classes< / font > < / a >
| < a href = "mainclasses.html" >
< font color = "#004faf" > Main Classes< / font > < / a >
| < a href = "annotated.html" >
< font color = "#004faf" > Annotated< / font > < / a >
| < a href = "groups.html" >
< font color = "#004faf" > Grouped Classes< / font > < / a >
| < a href = "functions.html" >
< font color = "#004faf" > Functions< / font > < / a >
< / td >
< td align = "right" valign = "center" > < img src = "logo32.png" align = "right" width = "64" height = "32" border = "0" > < / td > < / tr > < / table > < h1 align = center > Painting on the Desktop< / h1 >
< p >
The desktop demo contains three routines, each of which draws
something on the desktop. It does some nice stuff with < a href = "qpainter.html" > QPainter< / a > ,
and also demonstrates how one can treat the desktop as a widget like
any other.
< p > < hr >
< p > Implementation:
< p > < pre > /****************************************************************************
** $Id: qt/desktop.cpp 3.3.8 edited Jan 11 14:37 $
**
** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.
**
** This file is part of an example program for Qt. This example
** program may be used, distributed and modified without limitation.
**
*****************************************************************************/
#include < < a href = "qimage-h.html" > qimage.h< / a > >
#include < < a href = "qbitmap-h.html" > qbitmap.h< / a > >
#include < < a href = "qpainter-h.html" > qpainter.h< / a > >
#include < < a href = "qapplication-h.html" > qapplication.h< / a > >
#include < < a href = "qdropsite-h.html" > qdropsite.h< / a > >
#include < < a href = "qdragobject-h.html" > qdragobject.h< / a > >
#include < stdio.h>
static double seed = 0.353535353535;
static const int KINDA_RAND_MAX = 32767;
static int kindaRand()
{
seed = seed*147;
seed = seed - (double) ((int) seed);
return (int) ( seed*(KINDA_RAND_MAX + 1) );
}
static int velocity( int i ) // change velocity
{
const int velmax = 15;
const int velmin = 4;
if ( i == 1 || i == 2 )
i = (kindaRand()& 0x7fff % velmax)/3 + velmin;
else
i = (kindaRand()& 0x7fff % velmax) + velmin;
return i;
}
//
// Draw polygon on desktop.
//
void poly()
{
< a name = "x1721" > < / a > < a href = "qwidget.html" > QWidget< / a > *d = QApplication::< a href = "qapplication.html#desktop" > desktop< / a > ();
< a name = "x1761" > < / a > d-> < a href = "qwidget.html#setBackgroundColor" > setBackgroundColor< / a > ( Qt::white ); // white desktop
const int maxpoints = 5;
const int maxcurves = 8;
static int xvel[maxpoints];
static int yvel[maxpoints];
int head = 0;
int tail = -maxcurves + 2;
< a href = "qpointarray.html" > QPointArray< / a > *a = new < a href = "qpointarray.html" > QPointArray< / a > [ maxcurves ];
QPointArray *p;
< a name = "x1760" > < / a > < a href = "qrect.html" > QRect< / a > r = d-> < a href = "qwidget.html#rect" > rect< / a > (); // desktop rectangle
int i;
for ( i=0; i< maxcurves; i++ )
a[i].resize( maxpoints );
p = & a[0];
for ( i=0; i< maxpoints; i++ ) { // setup first polygon points
< a name = "x1756" > < / a > p-> setPoint( i, (kindaRand()& 0x7fff) % r.< a href = "qrect.html#width" > width< / a > (),
< a name = "x1749" > < / a > (kindaRand()& 0x7fff) % r.< a href = "qrect.html#height" > height< / a > () );
xvel[i] = velocity(i);
yvel[i] = velocity(i);
}
< a href = "qpainter.html" > QPainter< / a > paint;
< a name = "x1733" > < / a > paint.< a href = "qpainter.html#begin" > begin< / a > ( d ); // start painting desktop
for ( int ntimes=0; ntimes< 2000; ntimes++ ) {
paint.< a href = "qpainter.html#setBrush" > setBrush< / a > ( QColor(kindaRand()%360, 180, 255, QColor::Hsv) );
< a name = "x1735" > < / a > paint.< a href = "qpainter.html#drawPolygon" > drawPolygon< / a > ( a[head] );
if ( ++tail > = maxcurves )
tail = 0;
< a name = "x1751" > < / a > < a name = "x1750" > < / a > int minx=r.< a href = "qrect.html#left" > left< / a > (), maxx=r.< a href = "qrect.html#right" > right< / a > ();
< a name = "x1755" > < / a > < a name = "x1748" > < / a > int miny=r.< a href = "qrect.html#top" > top< / a > (), maxy=r.< a href = "qrect.html#bottom" > bottom< / a > ();
int x, y;
p = & a[head];
if ( ++head > = maxcurves )
head = 0;
for ( i=0; i< maxpoints; i++ ) { // calc new curve
p-> point( i, & x, & y );
x += xvel[i];
y += yvel[i];
if ( x > = maxx ) {
x = maxx - (x - maxx + 1);
xvel[i] = -velocity(i);
}
if ( x < = minx ) {
x = minx + (minx - x + 1);
xvel[i] = velocity(i);
}
if ( y > = maxy ) {
y = maxy - (y - maxy + 1);
yvel[i] = -velocity(i);
}
if ( y < = miny ) {
y = miny + (miny - y + 1);
yvel[i] = velocity(i);
}
a[head].setPoint( i, x, y );
}
}
< a name = "x1737" > < / a > paint.< a href = "qpainter.html#end" > end< / a > (); // painting done
delete[] a;
}
//
// Rotate pattern on desktop.
//
void rotate()
{
int i;
const int w = 64;
const int h = 64;
< a href = "qimage.html" > QImage< / a > image( w, h, 8, 128 ); // create image
for ( i=0; i< 128; i++ ) // build color table
< a name = "x1730" > < / a > image.< a href = "qimage.html#setColor" > setColor< / a > ( i, qRgb(i,0,0) );
for ( int y=0; y< h; y++ ) { // set image pixels
< a name = "x1729" > < / a > uchar *p = image.< a href = "qimage.html#scanLine" > scanLine< / a > (y);
for ( int x=0; x< w; x++ )
*p++ = (x+y)%128;
}
< a href = "qpixmap.html" > QPixmap< / a > pm;
pm = image; // convert image to pixmap
< a name = "x1745" > < / a > pm.< a href = "qpixmap.html#setOptimization" > setOptimization< / a > ( QPixmap::BestOptim ); // rotation will be faster
< a href = "qwidget.html" > QWidget< / a > *d = QApplication::< a href = "qapplication.html#desktop" > desktop< / a > (); // w = desktop widget
for ( i=0; i< =360; i += 2 ) {
< a href = "qwmatrix.html" > QWMatrix< / a > m;
< a name = "x1764" > < / a > m.< a href = "qwmatrix.html#rotate" > rotate< / a > ( i ); // rotate coordinate system
< a name = "x1747" > < / a > < a href = "qpixmap.html" > QPixmap< / a > rpm = pm.< a href = "qpixmap.html#xForm" > xForm< / a > ( m ); // rpm = rotated pixmap
< a name = "x1762" > < / a > d-> < a href = "qwidget.html#setBackgroundPixmap" > setBackgroundPixmap< / a > ( rpm ); // set desktop pixmap
< a name = "x1763" > < / a > d-> < a href = "qwidget.html#update" > update< / a > (); // repaint desktop
}
}
//
// Generates a marble-like pattern in pm.
//
void generateStone( < a href = "qpixmap.html" > QPixmap< / a > *pm,
const < a href = "qcolor.html" > QColor< / a > & c1, const < a href = "qcolor.html" > QColor< / a > & c2, const < a href = "qcolor.html" > QColor< / a > & c3 )
{
< a href = "qpainter.html" > QPainter< / a > p;
< a href = "qpen.html" > QPen< / a > p1 ( c1, 0 );
< a href = "qpen.html" > QPen< / a > p2 ( c2, 0 );
< a href = "qpen.html" > QPen< / a > p3 ( c3, 0 );
p.< a href = "qpainter.html#begin" > begin< / a > ( pm );
< a name = "x1746" > < / a > for( int i = 0 ; i < pm-> < a href = "qpixmap.html#width" > width< / a > () ; i++ )
< a name = "x1743" > < / a > for( int j = 0 ; j < pm-> < a href = "qpixmap.html#height" > height< / a > () ; j++ ) {
int r = kindaRand();
if ( r < KINDA_RAND_MAX / 3 )
< a name = "x1741" > < / a > p.< a href = "qpainter.html#setPen" > setPen< / a > ( p1 );
else if ( r < KINDA_RAND_MAX / 3 * 2 )
p.< a href = "qpainter.html#setPen" > setPen< / a > ( p2 );
else
p.< a href = "qpainter.html#setPen" > setPen< / a > ( p3 );
< a name = "x1734" > < / a > p.< a href = "qpainter.html#drawPoint" > drawPoint< / a > ( i,j );
}
p.< a href = "qpainter.html#end" > end< / a > ();
}
void drawShadeText( < a href = "qpainter.html" > QPainter< / a > *p, int x, int y, const char *text,
const < a href = "qcolor.html" > QColor< / a > & topColor, const < a href = "qcolor.html" > QColor< / a > & bottomColor,
int sw = 2 )
{
< a name = "x1739" > < / a > if ( !p-> < a href = "qpainter.html#isActive" > isActive< / a > () )
return;
p-> < a href = "qpainter.html#setPen" > setPen< / a > ( bottomColor );
< a name = "x1736" > < / a > p-> < a href = "qpainter.html#drawText" > drawText< / a > ( x+sw, y+sw, text );
p-> < a href = "qpainter.html#setPen" > setPen< / a > ( topColor );
p-> < a href = "qpainter.html#drawText" > drawText< / a > ( x, y, text );
}
// NOTE: desktop drag/drop is experimental
class DesktopWidget : public < a href = "qwidget.html" > QWidget< / a > , private QDropSite
{
public:
DesktopWidget( const char *s, QWidget *parent=0, const char *name=0 );
~DesktopWidget();
void paintEvent( < a href = "qpaintevent.html" > QPaintEvent< / a > * );
void dragEnterEvent( < a href = "qdragenterevent.html" > QDragEnterEvent< / a > *e )
{
< a name = "x1731" > < / a > if ( QImageDrag::< a href = "qimagedrag.html#canDecode" > canDecode< / a > (e) )
< a name = "x1727" > < / a > e-> < a href = "qdragmoveevent.html#accept" > accept< / a > ();
}
void dragLeaveEvent( < a href = "qdragleaveevent.html" > QDragLeaveEvent< / a > * )
{
}
void dragMoveEvent( < a href = "qdragmoveevent.html" > QDragMoveEvent< / a > *e )
{
e-> < a href = "qdragmoveevent.html#accept" > accept< / a > ();
}
void dropEvent( < a href = "qdropevent.html" > QDropEvent< / a > * e )
{
< a href = "qpixmap.html" > QPixmap< / a > pmp;
< a name = "x1732" > < / a > if ( QImageDrag::< a href = "qimagedrag.html#decode" > decode< / a > ( e, pmp ) ) {
< a href = "qwidget.html#setBackgroundPixmap" > setBackgroundPixmap< / a > ( pmp );
< a href = "qwidget.html#update" > update< / a > ();
}
}
private:
< a href = "qpixmap.html" > QPixmap< / a > *pm;
< a href = "qstring.html" > QString< / a > text;
};
< a name = "f483" > < / a > DesktopWidget::DesktopWidget( const char *s, QWidget *parent, const char *name )
: < a href = "qwidget.html" > QWidget< / a > ( parent, name, WType_Desktop | WPaintDesktop),
QDropSite(this)
{
text = s;
pm = 0;
}
DesktopWidget::~DesktopWidget()
{
delete pm;
}
void DesktopWidget::< a href = "qwidget.html#paintEvent" > paintEvent< / a > ( < a href = "qpaintevent.html" > QPaintEvent< / a > * )
{
< a href = "qcolor.html" > QColor< / a > c1 = < a href = "qwidget.html#backgroundColor" > backgroundColor< / a > ();
< a name = "x1726" > < / a > < a href = "qcolor.html" > QColor< / a > c2 = c1.< a href = "qcolor.html#light" > light< / a > (104);
< a name = "x1725" > < / a > < a href = "qcolor.html" > QColor< / a > c3 = c1.< a href = "qcolor.html#dark" > dark< / a > (106);
if ( !pm ) {
pm = new < a href = "qpixmap.html" > QPixmap< / a > ( 64, 64 );
generateStone( pm, c1, c2, c3 );
< a href = "qwidget.html#setBackgroundPixmap" > setBackgroundPixmap< / a > ( *pm );
< a href = "qwidget.html#update" > update< / a > ();
}
< a href = "qrect.html" > QRect< / a > br = < a href = "qwidget.html#fontMetrics" > fontMetrics< / a > ().boundingRect( text );
< a href = "qpixmap.html" > QPixmap< / a > offscreen( br.< a href = "qrect.html#width" > width< / a > (), br.< a href = "qrect.html#height" > height< / a > () );
int x = < a href = "qwidget.html#width" > width< / a > ()/2 - br.< a href = "qrect.html#width" > width< / a > ()/2;
int y = < a href = "qwidget.html#height" > height< / a > ()/2 - br.< a href = "qrect.html#height" > height< / a > ()/2;
< a name = "x1742" > < / a > offscreen.< a href = "qpixmap.html#fill" > fill< / a > ( this, x, y );
< a href = "qpainter.html" > QPainter< / a > p;
p.< a href = "qpainter.html#begin" > begin< / a > ( & offscreen );
< a name = "x1758" > < / a > < a name = "x1757" > < / a > drawShadeText( & p, -br.< a href = "qrect.html#x" > x< / a > (), -br.< a href = "qrect.html#y" > y< / a > (), text, c2, c3, 3 );
p.< a href = "qpainter.html#end" > end< / a > ();
< a href = "qimage.html#bitBlt" > bitBlt< / a > ( this, x, y, & offscreen );
}
void desktopWidget( const char *s = "Trolltech" )
{
DesktopWidget *t = new DesktopWidget(s);
t-> < a href = "qwidget.html#update" > update< / a > ();
qApp-> < a href = "qapplication.html#exec" > exec< / a > ();
delete t;
}
void desktopText( const char *s = "Trolltech" )
{
const int border = 20;
< a name = "x1723" > < / a > < a href = "qcolor.html" > QColor< / a > c1 = qApp-> < a href = "qapplication.html#palette" > palette< / a > ().inactive().background();
< a href = "qcolor.html" > QColor< / a > c2 = c1.< a href = "qcolor.html#light" > light< / a > (104);
< a href = "qcolor.html" > QColor< / a > c3 = c1.< a href = "qcolor.html#dark" > dark< / a > (106);
< a href = "qpixmap.html" > QPixmap< / a > pm(10,10);
< a href = "qpainter.html" > QPainter< / a > p;
p.< a href = "qpainter.html#begin" > begin< / a > ( & pm );
< a name = "x1738" > < / a > < a href = "qrect.html" > QRect< / a > r = p.< a href = "qpainter.html#fontMetrics" > fontMetrics< / a > ().boundingRect( s );
p.< a href = "qpainter.html#end" > end< / a > ();
int appWidth = qApp-> < a href = "qapplication.html#desktop" > desktop< / a > ()-> width();
int appHeight = qApp-> < a href = "qapplication.html#desktop" > desktop< / a > ()-> height();
if ( r.< a href = "qrect.html#width" > width< / a > () > appWidth - border*2 )
< a name = "x1753" > < / a > r.< a href = "qrect.html#setWidth" > setWidth< / a > ( appWidth - border*2 );
if ( r.< a href = "qrect.html#height" > height< / a > () > appHeight - border*2 )
< a name = "x1752" > < / a > r.< a href = "qrect.html#setHeight" > setHeight< / a > ( appHeight - border*2 );
< a name = "x1754" > < / a > < a name = "x1744" > < / a > pm.< a href = "qpixmap.html#resize" > resize< / a > ( r.< a href = "qrect.html#size" > size< / a > () + QSize( border*2, border*2 ) );
generateStone( & pm, c1, c2, c3 );
p.< a href = "qpainter.html#begin" > begin< / a > ( & pm );
drawShadeText( & p, -r.< a href = "qrect.html#x" > x< / a > () + border, -r.< a href = "qrect.html#y" > y< / a > () + border, s, c2, c3 );
p.< a href = "qpainter.html#end" > end< / a > ();
qApp-> < a href = "qapplication.html#desktop" > desktop< / a > ()-> setBackgroundPixmap( pm );
}
//
// The program starts here.
//
int main( int argc, char **argv )
{
< a href = "qapplication.html" > QApplication< / a > app( argc, argv );
if ( argc > 1 ) {
< a href = "qfont.html" > QFont< / a > f( "charter", 96, QFont::Black );
< a name = "x1728" > < / a > f.< a href = "qfont.html#setStyleHint" > setStyleHint< / a > ( QFont::Times );
< a name = "x1724" > < / a > app.< a href = "qapplication.html#setFont" > setFont< / a > ( f );
}
bool validOptions = FALSE;
if ( argc == 2 ) {
validOptions = TRUE;
if ( strcmp(argv[1],"-poly") == 0 )
poly();
else if ( strcmp(argv[1],"-rotate") == 0 )
rotate();
else if ( strcmp(argv[1],"-troll") == 0 )
desktopText();
else if ( strcmp(argv[1],"-trollwidget") == 0 )
desktopWidget();
else
validOptions = FALSE;
}
if ( argc == 3 ) {
validOptions = TRUE;
if ( strcmp(argv[1],"-shadetext") == 0 )
desktopText( argv[2] );
else if ( strcmp(argv[1],"-shadewidget") == 0 )
desktopWidget( argv[2] );
else
validOptions = FALSE;
}
if ( !validOptions ) {
fprintf( stderr, "Usage:\n\tdesktop -poly"
"\n\tdesktop -rotate"
"\n\tdesktop -troll"
"\n\tdesktop -trollwidget"
"\n\tdesktop -shadetext < text> "
"\n\tdesktop -shadewidget < text> \n" );
rotate();
}
return 0;
}
< / pre >
< p > See also < a href = "examples.html" > Examples< / a > .
<!-- eof -->
< p > < address > < hr > < div align = center >
< table width = 100% cellspacing = 0 border = 0 > < tr >
< td > Copyright © 2007
< a href = "troll.html" > Trolltech< / a > < td align = center > < a href = "trademarks.html" > Trademarks< / a >
< td align = right > < div align = right > Qt 3.3.8< / div >
< / table > < / div > < / address > < / body >
< / html >