Paint Control in VC++

3 отговора 102 прегледа
#1

Paint Control in VC++

Zdrawejte,
Bih iskal da risuwam vav VC++ (analogowi stojnosti koito idwat po rs232) no taka che da ne se nalaga da prechertawam na wsiako wm_paint koeto system-ata prasta na moia prozoretz. Dali sastestwuwa nesto kato PaintBox na Delphi, koeto bi reshilo problema mi?
Ili e wazmogno drugo reshenie na problema?
Do momenta stojnostite za chertane sa w edin array i na wsiako msg wm_paint te se prechertawat. Taj kato sistemata e time critical i izpalnenieto e wagno towa ne e dostatachno barz i udachen wariant.
Blagodaria Wi,
Winnetou

Отговор
в отговор на Winnetou #2

Re: Paint Control in VC++

Ni znaia kak e v Delfi, no ne vijdam kakwo losho ima wuw WM_PAINT, (koeto i samia Delfi izpolzva w kraina smetka).

Ako sym razbral pravilno zadachata ti:
Moje bi triabva da update-vash ekrana (naprimer s Invalidate()) po-riadko.
Imam v predvid, da ne pravish Invalidate() pr vsiaka **novo-pristignala** stoinost ot RS-232, ami da izchakvash da ti se napulni niakakuv buffer -- da rechem s 256 otcheta -- i togava da pravish Invalidate().

Stupkata 256 ili 64 ili 1024, ... moje da opredelish eksperimentalno, i zawisi ot skorostta s koiato ti idvat danni po RS232.

Ako iskash mnogo burzo, ... ispolzwai neshto kato ScrollWindow(...) ot GDI, ama tolkova burzo, ... choveshko oko edva li moje da reagira adekvatno :)

Drug problem prosto ne vijdam?!

Отговор
в отговор на Winnetou #3

Re: Paint Control in VC++

izrisuvai si gi samo vednaj v edin bitmap, a na WM_PAINT prosto ste prehvarliash bitmap-a na ekrana s BitBlt(). kogato ti pristignat novi danni samo togava ste updatvash bitmapa. poveche ot tova ne vijdam nakade(inache vseki pat da preizcertavash v WM_PAINT surovi danni sux)

Отговор
в отговор на Winnetou #4

Какво общо има PaintBox?

TPaintBox не се преизчертава само. Ако имаш предвид TImage - прегледай сорсовете на VCL да видиш що код е изписан, който се изпълнява при всяко WM_PAINT. В крайна сметка преизчертаването става със StretchBlt():

BOOL StretchBlt(
HDC hdcDest, // handle of destination device context
int nXOriginDest, // x-coordinate of upper-left corner of dest. rect.
int nYOriginDest, // y-coordinate of upper-left corner of dest. rect.
int nWidthDest, // width of destination rectangle
int nHeightDest, // height of destination rectangle
HDC hdcSrc, // handle of source device context
int nXOriginSrc, // x-coordinate of upper-left corner of source rectangle
int nYOriginSrc, // y-coordinate of upper-left corner of source rectangle
int nWidthSrc, // width of source rectangle
int nHeightSrc, // height of source rectangle
DWORD dwRop // raster operation code
);



Taка че вместо да се притесняваш от WM_PAINT:
(*) ползвай BitBlt(), както ти каза xenomeno
(*) чертай си всичко, което е в GetClipBox(hdc_на_прозореца_в_който_чертаеш, ....) - областта, която е била скрита и има нужда от преизчертаване.

Отговор