Re: With a Little Help from my Friends



Mike,

On my Win98SE (ATI All-In-Wonder vid card), all four circles look the same.
VB5 and VB6, IDE and compiled. I'm guessing the difference should be
noticeable, although my eyes aren't as good as they used to be <g> When I
get a chance later on, I'll swap in my W2K Pro and give it a go. I have
drive drawers/caddies, so it'll be the same PC/vid card. I'll post back the
results for ya.



"Mike Williams" <Mike@xxxxxxxxxxxxxxxxx> wrote in message
news:damd6m$hin$1@xxxxxxxxxxxxxxxxxxxxxxx
> Hi all
>
> I'd really appreciate if you would help me out with a little problem. I've
> just been doing some work on my Win98 machine and I noticed that the
> StretchBlt API is not working as expected (although it works fine on my
Win
> XP machine). The funny thing is that I'm pretty sure I remember it also
> working properly on the Win98 machine some time ago. I'm not absolutely
sure
> if that is the case though, and I'm also not sure if I've fiddled with the
> video card drivers since that time. The mind plays funny tricks on you at
my
> age :-)
>
> Anyway, the machine on which it does not work properly is Win 98 PIII 450
> Mhz with a Nvidia Geforce I DDR graphics card (I can't remember at the
> moment which driver version I am currently using with that).
>
> As most of you probably already know, the StretchBlt API is capable of
> working in four different stretch modes and the default mode (unless you
> change it) is mode 1. These four modes normally produce different results,
> and each is best suited to a particular purpose. For example, modes 3 and
4
> are good for normal photos, mode 1 is good for line drawings (especially
> those containing rectangular grids which otherwise tend to "disappear" in
a
> reduced size image) and mode 4 is very good for clipart and logos and "3d
> images" because it produces nice anti-alaised edges when you reduce an
> image. Incidentally, the VB PaintPicture method uses only use mode 3.
> (You're beginnin' to "waffle again, Mike. Get to the point will you!) . .
..
>
> . . . anyway, as I was saying, the StretchBlt API on my Win98 machine
> refuses to work in any mode other than mode 3. You can actually set the
mode
> to any value (1 to 4) using the SetStretchBltMode API, and if you ask for
> the mode you have set (using the GetStretchBltMode API or by alternatively
> looking at the SetStretchBltMode returned value) you will be told that
your
> setting was accepted. However, the actual "painted" result will in all
four
> cases look exactly the same as if it was drawn using Mode 3. This doesn't
> happen on my WinXP machine (and I'm almost sure it didn't used to happen
on
> my Win98 machine). On the XP machine all four results are different, as
you
> would expect them to be.
>
> Another slight oddity (but one which doesn't really bother me at the
moment)
> is the fact that the LoadImage API in the User32 library (which is capable
> of both loading a bitmap from file and also stretching it) also seems to
use
> a stretching technique very similar (exactly the same, looking out the
> output) to StretchBlt mode 4, and the LoadImage API works fine on both
> machines. A little odd that, but then again maybe the LoadImage API
doesn't
> actually make use of the StretchBlt API itself. Mind you, most VB
> programmers would never use the LoadImage API because they have the VB
> LoadPicture method. (Bloody hell, he's waffling again . . . get on with
it,
> will you Mike!)
>
> (Talking to myself now eh! That's another sign of old age creeping up!)
>
> Anyway, to get to the point (at last!) I really would appreciate it if as
> many of you as possible would kindly run the following code for me and let
> me know the result. Paste it into a VB Form containing a Picture Box. The
> code first of all draws a number of concentric circles into an invisible
800
> x 800 pixel picture box and then it paints the resulting image at a
smaller
> size four times onto the Form, using all four different stretch modes. On
my
> WinXP machine it produces four different images (as it should do) but on
my
> Win98 machine it produces four images that all look exactly the same (all
> looking as though they were drawn in mode 3). As I've said, I'm almost
sure
> that my Win98 machine used to produce four different images at one time,
but
> it doesn't do so now! I might try using different drivers when I get the
> time.
>
> If you would like to run the code for me and then tell me the result you
get
> (whether the four images are all the same, or all different) and the
details
> of your machine (Windows version and make and type of bgraphics card) I
> would very much appreciate it.
>
> Cheers
>
> Mike
>
> Oops. Almost forgot the code. Here it is . . .
>
> Option Explicit
> Private Declare Function StretchBlt Lib "gdi32" _
> (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, _
> ByVal nWidth As Long, ByVal nHeight As Long, _
> ByVal hSrcDC As Long, ByVal xSrc As Long, _
> ByVal ySrc As Long, ByVal nSrcWidth As Long, _
> ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
> Private Declare Function SetStretchBltMode Lib "gdi32" _
> (ByVal hdc As Long, ByVal nStretchMode As Long) _
> As Long
> Private Declare Function GetStretchBltMode Lib "gdi32" _
> (ByVal hdc As Long) As Long
>
> Private Sub Form_Load()
> Dim picwide As Long, pichigh As Long
> Dim thumbwide As Long, thumbhigh As Long
> Dim x As Long, y As Long
> Dim mode As Long
> Me.Width = 6000 ' twips
> Me.Height = 6500 ' twips
> Me.Show
> Me.ScaleMode = vbPixels
> Me.AutoRedraw = True
> Picture1.Visible = False
> Picture1.ScaleMode = vbPixels
> Picture1.AutoRedraw = True
> Picture1.BorderStyle = 0
> Picture1.Move 0, 0, 800, 800
> For x = 350 To 20 Step -20
> Picture1.Circle (400, 400), x, vbBlue
> Next x
> picwide = Picture1.Width
> pichigh = Picture1.Height
> thumbwide = Me.ScaleWidth \ 2
> thumbhigh = Me.ScaleHeight \ 2
> For x = 0 To 1
> For y = 0 To 1
> mode = mode + 1
> SetStretchBltMode Me.hdc, mode
> StretchBlt Me.hdc, x * thumbwide, y * thumbhigh, _
> thumbwide, thumbhigh, Picture1.hdc, 0, 0, _
> picwide, pichigh, vbSrcCopy
> CurrentX = x * thumbwide
> CurrentY = y * thumbhigh
> Print GetStretchBltMode(Me.hdc);
> Next y
> Next x
> Me.Refresh
> End Sub
>
>
>
>
>
>
>
>
>
>
>
>


.



Relevant Pages

  • With a Little Help from my Friends
    ... StretchBlt API is not working as expected (although it works fine on my Win ... working properly on the Win98 machine some time ago. ... WinXP machine it produces four different images but on my ...
    (comp.lang.basic.visual.misc)
  • Re: With a Little Help from my Friends
    ... > StretchBlt API is not working as expected (although it works fine on my ... > video card drivers since that time. ... > different images but on my Win98 machine it produces ...
    (comp.lang.basic.visual.misc)
  • Re: With a Little Help from my Friends
    ... > StretchBlt API is not working as expected (although it works fine on my Win ... > working properly on the Win98 machine some time ago. ... > WinXP machine it produces four different images but on my ...
    (comp.lang.basic.visual.misc)
  • Re: With a Little Help from my Friends
    ... I haven't used StretchBlt for a long time, ... > StretchBlt API is not working as expected (although it works fine on my ... > working properly on the Win98 machine some time ago. ... > WinXP machine it produces four different images but on ...
    (comp.lang.basic.visual.misc)
  • Re: Compare 2 images
    ... > Mike is very proficient in API graphics. ... > you add an API brush to the device context. ... said, before I do my blitting of the 2 images, using the Raster Ops that you ... > indicates that you have to start with white background. ...
    (microsoft.public.vb.winapi.graphics)