PDA

View Full Version : [C++]handle to device context?


AngeL)
23-08-2006, 20:10
gironzolando per la libreria msdn ho trovato questo valore come argomento in una funzione e non riesco a capire come passarglielo visto che non so neppure che cos'è :help:

edit: trovato...
potrebbero metterci degli esempi però! :mad:

loris_p
23-08-2006, 21:08
già che hai aperto il topic ora sarebbe carino spiegare per tutti coloro i quali desiderano saperlo, no? ;)

andbin
23-08-2006, 21:22
gironzolando per la libreria msdn ho trovato questo valore come argomento in una funzione e non riesco a capire come passarglielo visto che non so neppure che cos'è :help:Quello che hai visto è un HDC, un handle a un dispositivo di contesto (in italiano suona male ;) ).
Un HDC fa riferimento a una serie di oggetti (ognuno con i propri attributi) utilizzati per disegnare su una finestra.

Un HDC normalmente fa riferimento all'area disegnabile di una finestra ma può anche fare riferimento all'area stampabile di una stampante.

Un HDC si può crearlo ma tipicamente lo si ottiene da un handle di finestra (HWND).

Guarda in <questo> (http://www.hwupgrade.it/forum/showthread.php?t=1167173) thread, c'è un mio sorgente completo per una applicazione Win32 con una semplice finestra vuota.
Noterai che in risposta al messaggio WM_PAINT, fa una serie di cose (anche se non disegna nulla sulla finestra). Normalmente, si possono eseguire delle operazioni di disegno dopo la chiamata a BeginPaint e prima di EndPaint.

71104
23-08-2006, 23:05
Quello che hai visto è un HDC, un handle a un dispositivo di contesto (in italiano suona male ;) ). "dispositivo di contesto" non ha senso; "contesto del dispositivo" semmai :P

AngeL)
24-08-2006, 08:35
già che hai aperto il topic ora sarebbe carino spiegare per tutti coloro i quali desiderano saperlo, no? ;)
beh a dire la verità non ci ho capito niente neanche io, ho capito solo che per ottenerlo bisogna scrivere
HDC var;
var=GetHD(NULL);
preò provando a usare delle funzioni in cui ci vuole l'hdc non funziona niente e si impalla il computer :eek:

andbin
24-08-2006, 09:01
"dispositivo di contesto" non ha senso; "contesto del dispositivo" semmai :PCome al solito, grazie che mi correggi le stupidate che (fortunatamente solo ogni tanto) scrivo.
Mi sono confuso a scrivere .... e in effetti mi "suonava" male la traduzione ma non ci ho fatto caso subito. :p

AngeL)
24-08-2006, 09:24
devi creare una applicazione Win32 di tipo GUI
come si fa? :D

andbin
24-08-2006, 10:11
beh a dire la verità non ci ho capito niente neanche io, ho capito solo che per ottenerlo bisogna scrivere
HDC var;
var=GetHD(NULL);
preò provando a usare delle funzioni in cui ci vuole l'hdc non funziona niente e si impalla il computer :eek:Bene, prendi quel sorgente completo presente nel thread che ho indicato e poi nel punto in cui c'è la gestione del messaggio WM_PAINT, sostituisci il blocco con questo codice:
case WM_PAINT:
{
HDC hdc;
HPEN hpen, hpenOld;
PAINTSTRUCT ps;
RECT rcClient;

GetClientRect (hWnd, &rcClient);

hdc = BeginPaint (hWnd, &ps);

hpen = CreatePen (PS_SOLID, 10, RGB(0, 0, 255));

hpenOld = SelectObject (hdc, hpen);

Arc (hdc, 30, 30, rcClient.right-30, rcClient.bottom-30,
rcClient.right-30, rcClient.bottom-30,
rcClient.right-30, rcClient.bottom-30);

SelectObject (hdc, hpenOld);
DeleteObject (hpen);

EndPaint (hWnd, &ps);
return 0;
}

Compila il sorgente in modo da ottenere una applicazione Win32 GUI (non di tipo console, per intenderci).
Poi lancia il programma e prova a ridimensionare la finestra. ;)

AngeL)
24-08-2006, 11:06
Compila il sorgente in modo da ottenere una applicazione Win32 GUI (non di tipo console, per intenderci).
Poi lancia il programma e prova a ridimensionare la finestra. ;)
ma il vsec++ non mi funziona... come faccio col borland a fare un'app gui?

andbin
24-08-2006, 11:11
ma il vsec++ non mi funziona... come faccio col borland a fare un'app gui?Quale tool Borland hai??? Io l'unico che conosco (e uso) al momento è il Borland C++ 5.5 a linea di comando.

AngeL)
24-08-2006, 11:14
anch'io ho quello a riga di comando (me l'hai fatto scaricare tu, ricordi?)


sono senior member!! :D mi vengono le lacrime :cry:

andbin
24-08-2006, 11:42
anch'io ho quello a riga di comando (me l'hai fatto scaricare tu, ricordi?)Dici davvero??? :stordita: ... non mi ricordavo.

Comunque metti il sorgente in un file chiamato winapp.c poi scrivi un file Makefile con dentro:
CFLAGS=-c -d -q -w -w-par -f- -O2 -tW
LFLAGS=-x -C -c -Gn -q -aa -Tpe

LIBS=cw32.lib kernel32.lib user32.lib gdi32.lib shell32.lib advapi32.lib

winapp.exe: winapp.obj
ilink32 $(LFLAGS) c0w32.obj winapp.obj,winapp.exe,,$(LIBS),,

winapp.obj: winapp.c
bcc32 $(CFLAGS) -owinapp.obj winapp.c
Poi lancia make dal prompt.

AngeL)
24-08-2006, 12:32
che cos'è un makefile? ha un'estensione particolare?

Dici davvero??? :stordita: ... non mi ricordavo.
link (http://www.hwupgrade.it/forum/showthread.php?t=1220551)

andbin
24-08-2006, 12:41
che cos'è un makefile? ha un'estensione particolare?No, si chiama proprio m a k e f i l e.
Comunque è il file letto dal tool 'make' e definisce le dipendenze e le regole per eseguire una certa sequenza di comandi.

link (http://www.hwupgrade.it/forum/showthread.php?t=1220551)La mia memoria ringrazia. :p

AngeL)
24-08-2006, 12:51
"Fatal: Unable to open kernel32.lib"
mi manca questo file? dove lo trovo?

andbin
24-08-2006, 12:56
"Fatal: Unable to open kernel32.lib"
mi manca questo file? dove lo trovo?Beh, ovviamente il BCC 5.5 deve essere stato configurato come si deve. Nella directory del BCC ci dovrebbe essere un file readme.txt che spiega come configurarlo.

AngeL)
24-08-2006, 13:04
le cose scritte nel readme le ho fatte appena ho installato il tutto...

andbin
24-08-2006, 13:09
le cose scritte nel readme le ho fatte appena ho installato il tutto...Quindi hai messo nella \bin del BCC i file bcc32.cfg e ilink32.cfg con dentro i path corretti??

AngeL)
24-08-2006, 13:18
si

andbin
24-08-2006, 13:21
Nella Lib\PSDK del BCC hai tutte le librerie .lib (compresa quella kernel32)??

AngeL)
24-08-2006, 13:24
si, c'è

andbin
24-08-2006, 13:31
si, c'èNon so cosa dire ... io mai avuto simili problemi, a me funziona tutto benissimo. :boh:

AngeL)
24-08-2006, 13:50
fa niente... rimandiamo il GUI a un'altra volta.
intanto mi spieghi come funziona SetPixel?
io ho fatto cosi:
HDC hdc = GetDC(NULL);
SetPixel(hdc,500,500,0x00255000000);
e non si è colorato nessun pixel.
pensavo che ero io che non vedevo il pixel che si colorava, allora ho usato due for concatenati (uno da 1 a 1024 e l'altro da 1 a 768) che coloravano di nero tutti i pixel e neanche questa volta ha funzionato.
dove sbaglio?

edit: ho ripovato e funziona... forse prima avevo dimenticato di mettere il setpixel nella funzione BOOL separata da main..
però i colori non vanno... si colora tutto di nero :\

andbin
24-08-2006, 14:20
intanto mi spieghi come funziona SetPixel?
io ho fatto cosi:
HDC hdc = GetDC(NULL);
SetPixel(hdc,500,500,0x00255000000);
e non si è colorato nessun pixel.
pensavo che ero io che non vedevo il pixel che si colorava, allora ho usato due for concatenati (uno da 1 a 1024 e l'altro da 1 a 768) che coloravano di nero tutti i pixel e neanche questa volta ha funzionato.
dove sbaglio?Sappi che questo non è il modo giusto per disegnare sullo schermo. Ottieni il DC dello schermo (e fin qui non ci sono problemi) ma lo schermo non "appartiene" alla tua applicazione.

Ammesso comunque di voler provare per puro "sfizio", si può fare:
#define STRICT
#include <windows.h>

int main (void)
{
HDC hDc;
INT x, y;

hDc = GetDC (NULL);

for (y = 100; y < 200; y++)
for (x = 100; x < 200; x++)
SetPixel (hDc, x, y, RGB(255, 0, 0));

ReleaseDC (NULL, hDc);

return 0;
}che disegna un quadrato rosso.

sirbone72
24-08-2006, 15:04
fa niente... rimandiamo il GUI a un'altra volta.
intanto mi spieghi come funziona SetPixel?
io ho fatto cosi:
HDC hdc = GetDC(NULL);
SetPixel(hdc,500,500,0x00255000000);
e non si è colorato nessun pixel.
:\
Il problema è che il quarto parametro che passi a SetPixel è sbagliato: si tratta di un DWORD del tipo 0x00rrggbb, dove ciascuna componete di valore può variare, in esadecimale, da 0x00 a 0xFF.

AngeL)
25-08-2006, 13:11
Il problema è che il quarto parametro che passi a SetPixel è sbagliato: si tratta di un DWORD del tipo 0x00rrggbb, dove ciascuna componete di valore può variare, in esadecimale, da 0x00 a 0xFF.
avevo dimenticato che era esadecimale :muro:

andbin
25-08-2006, 13:33
avevo dimenticato che era esadecimale :muro:E ricordati che c'è la comoda macro RGB. ;)

AngeL)
25-08-2006, 14:25
E ricordati che c'è la comoda macro RGB. ;)
si, infatti la ho usata negli ultimi programmini che ho scritto.
a proposito, è possibile creare variabili di tipo RGB?

andbin
25-08-2006, 14:36
si, infatti la ho usata negli ultimi programmini che ho scritto.
a proposito, è possibile creare variabili di tipo RGB?Il tipo di dato per contenere un colore è COLORREF, che è il tipo restituito dalla macro RGB.

Quindi è corretto fare:
COLORREF rosso = RGB(255, 0, 0);