Re: With a Little Help from my Friends



Hi Mike,

I see four different pictures.

Windows 2000, SP4
NVIDIA GeForce2 MX 400

Regards,

Stoil

--

"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
    ... On my Win98SE (ATI All-In-Wonder vid card), all four circles look the same. ... > StretchBlt API is not working as expected (although it works fine on my ... > WinXP machine it produces four different images but on ...
    (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
    ... 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)