|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2516
|
[C++] Accendere pixel su linux
Ciao ragazzi
vorrei fare un programmino che una volta avviato accenda dei pixel che scelgo io fin quando non viene terminato... questo su linux solo che non ho la piu pallida idea di che libreria e che funzioni utilizzare ![]() qualcuno saprebbe indicarmi la strada? |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
io lo so fare su Windows
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
|
Quote:
senza far partire x potresti usare il frame buffer.
__________________
ho concluso con: kvegeta, doctordb, Leland Gaunt.
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Aug 2007
Messaggi: 1270
|
oppure con X avviato puoi usare le xlib:
http://en.wikipedia.org/wiki/Xlib |
|
|
|
|
|
#5 | ||
|
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2516
|
beh se me lo dici sapere una cosa in piu non mi fa male
Quote:
Quote:
|
||
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Aug 2007
Messaggi: 1270
|
Quote:
http://tronche.com/gui/x/xlib/graphi...DrawPoint.html |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2516
|
Quote:
guardandone pero una simile forse mi semplifica ancora piu le cose perchè dovrei in realtà fare un paio di linee rosse sullo schermo... http://www.tronche.com/gui/x/xlib/gr...XDrawLine.html Codice:
XDrawLine(display, d, gc, x1, y1, x2, y2) cioe a display, d, gc cosa devo passare? io devo semplicemente dare le coordinate ed il colore rosso oppure a scelta dell'utente... penso che a display debba passare il numero del display, poi gc è di tipo struct ma ha tantissimi parametri a sua volta |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Aug 2007
Messaggi: 1270
|
Guardando gli esempi dovrebbe venire cosi:
Display *display = XOpenDisplay(NULL); int screen = DefaultScreen(display); Window window = XCreateSimpleWindow(display, RootWindow(display, screen), 1, 1, 640, 480, 1, BlackPixel(display, screen), WhitePixel(display, screen)); XDrawLine(display, window, DefaultGC(display, screen), 50, 50, 100,100); prova a guardare questo tutorial: http://tronche.com/gui/x/xlib-tutorial/ |
|
|
|
|
|
#9 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
banalisssssimo: http://msdn2.microsoft.com/en-us/library/ms532304.aspx
come DC (primo parametro) basta che usi quello che ottieni dalla chiamata GetDC(NULL), che sarebbe quello associato allo schermo: http://msdn2.microsoft.com/en-us/library/ms533241.aspx |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2516
|
ok grazie ad entrambi...
su linux devo vedere con calma il nome del pacchetto da installare su ubuntu su windows invece ho fatto cosi Codice:
#include <windows.h> [...] SetPixel( GetDC(NULL), i, j, RGB(255,0,0) ); penso cio sia dovuto ad una mancata lettura corretta da parte del linker di windows.h o qualcosa del genere, e presuppongo che debba passare qualche cosa al linker ma non saprei neanche come fare ![]() lo stesso errore lo da anche code::blocks... come risolvo |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2516
|
doppio, scusate
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2516
|
su windows sono riuscito a compilarlo con code::blocks creando un nuovo progetto: applicazione grafica win32... su eclipse non ho ancora capito come fare e sono in attesa di delucidazioni.
con code::blocks sono riuscito a compilarlo, ma innanzi tutto mi crea un eseguibile di 1.3 mb che mi sembra un pochino tanto per il codice che ho scritto Codice:
#include <iostream>
#include <cstdlib>
#include <windows.h>
using namespace std;
int main(int argc, char* argv[]) {
int width = 1280,
height = 800,
size = 10;
if( argc == 3) {
width = atol(argv[1]);
height = atol(argv[2]);
size = atol(argv[3]);
}
while(1) {
for(int i = width/2 - size; i <= width/2 + size; i++ )
SetPixel( GetDC(NULL), i, height/2, RGB(255,0,0) );
for(int j = height/2 - size; j <= height/2 + size; j++ )
SetPixel( GetDC(NULL), width/2, j, RGB(255,0,0) );
}
system("PAUSE");
return 0;
}
Ultima modifica di -Slash : 07-04-2008 alle 16:04. |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
|
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2516
|
Quote:
ma mi sembra ancora troppo, e credo ci sia un modo migliore, perchè ho scaricato un altro programma che fa la stessa cosa e prende lo 0% di cpu |
|
|
|
|
|
|
#15 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Slash, potevi dirlo prima che volevi colorare una linea e non solo un pixel
colorare un pixel alla volta a suon di SetPixel è estremamente inefficiente perché ciascuna SetPixel richiede uno switch in kernel mode e un bel po' di altre operazioni (tipo la mappatura dei colori di sistema se per caso il colore che gli hai dato è un colore di sistema) per poi alla fine... settare pochi bytes tutto quel popo' di operazioni puoi farlo solo O(1) volte anziché O(N) volte (N lunghezza della linea in pixels) usando le funzioni MoveToEx e LineTo: http://msdn2.microsoft.com/en-us/lib...47(VS.85).aspx http://msdn2.microsoft.com/en-us/lib...56(VS.85).aspx inoltre non serve che cerchi il DC ogni volta: chiama GetDC una volta sola, salvati l'HDC e usalo per le chiamate seguenti. per quanto riguarda le dimensioni dell'eseguibile, ad ingigantirle oltremodo è il codice di inizializzazione del runtime del C++ che la maggior parte dei compilatori del mondo includono automaticamente (pensa ad esempio al costruttore dell'oggetto cout, oggetto che è sempre presente in un programma C++; questo è solo un esempio). per rimuovere tale codice (una volta che sei sicuro che non lo userai mai, ma ti consiglierei di lasciarlo) devi cercare tra le opzioni della linea di comando del MinGW. |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2516
|
ok grazie, ho modificato usando le due funzioni e seguendo l'esempio sul sito msdn...
ma non esce niente Codice:
#define WINVER 0x0501
#include <iostream>
#include <cstdlib>
#include <windows.h>
using namespace std;
int main(int argc, char* argv[]) {
int width = 1280,
height = 800,
size = 10;
if( argc == 3) {
width = atol(argv[1]);
height = atol(argv[2]);
size = atol(argv[3]);
}
HDC hdc;
HWND hwnd;
hdc = GetDC(hwnd);
while(1) {
MoveToEx(hdc, (width/2) - 10, height/2, NULL);
LineTo(hdc, (width/2) + 10, height/2);
MoveToEx(hdc, width/2, (height/2) - 10, NULL);
LineTo(hdc, width/2, (height/2) + 10);
}
ReleaseDC(hwnd, hdc);
system("PAUSE");
return 0;
}
e poi non ho capito come passo il colore Ultima modifica di -Slash : 08-04-2008 alle 00:51. |
|
|
|
|
|
#17 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
sostituendo hwnd con NULL a me funziona perfettamente...
per passare il colore a questo punto devi usare un oggetto Pen; lo crei con CreatePen e lo imposti del DC con SelectObject: http://msdn2.microsoft.com/en-us/library/ms535467.aspx http://msdn2.microsoft.com/en-us/lib...72(VS.85).aspx alla fine ricordati di deselezionarlo (sempre con SelectObject) e di distruggerlo con DeleteObject: http://msdn2.microsoft.com/en-us/library/ms533225.aspx Ultima modifica di 71104 : 08-04-2008 alle 14:30. |
|
|
|
|
|
#18 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
rettifico il mio post precedente: ho scoperto questa utile funzione:
http://msdn2.microsoft.com/en-us/lib...37(VS.85).aspx grazie ad essa non ti serve di creare un nuovo oggetto Pen; inoltre chiarisco meglio un punto: SelectObject non offre un modo per deselezionare un oggetto, ma semplicemente per selezionarne un altro al posto suo (cosa che provoca la "deselezione" del primo). |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2516
|
in effetti funziona, evidentemente si era incantato prima, perchè non funzionava
l'unica cosa che non va è il colore, il codice è il seguente ma è sempre nero... perdonami per la mia stoltezza ![]() Codice:
#define WINVER 0x0501
#include <iostream>
#include <cstdlib>
#include <windows.h>
using namespace std;
int main(int argc, char* argv[]) {
int width = 1280,
height = 800,
size = 10;
if( argc == 3) {
width = atol(argv[1]);
height = atol(argv[2]);
size = atol(argv[3]);
}
HDC hdc;
hdc = GetDC(NULL);
SetDCPenColor(hdc,RGB(255, 0, 0));
while(1) {
Sleep(1);
MoveToEx(hdc, (width/2) - (size/2), height/2, NULL);
LineTo(hdc, (width/2) + 1 + (size/2), height/2);
MoveToEx(hdc, width/2, (height/2) - (size/2), NULL);
LineTo(hdc, width/2, (height/2) + 1 + (size/2));
}
ReleaseDC(NULL, hdc);
system("PAUSE");
return 0;
}
grazie per la pazienza, poi dopo spero di riuscirlo a fare su linux
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
|
Codice:
SetDCPenColor(hdc,RGB(255, 0, 0));
__________________
ho concluso con: kvegeta, doctordb, Leland Gaunt.
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:15.













ho concluso con: kvegeta, doctordb, Leland Gaunt.








