I guess if all you want to do is rotate, and you were willing to use plgblt, which only works on Windows 2000 and later, then perhaps instead of plgblt you might consider using another GDI call, SetWorldTransform, which was also added to the API at the same time plgblt was added.
SetWorldTransform uses a Matrix to allow the basic things you would need to position and rotate an image.
Basically you set up the matrix to translate the 0,0 point (rotation always occurs around the 0,0 point) to where in the destination you want the center of your image to be.
You put the sine and cosine of the angle in a few places in the matrix. (You don't have to understand why, just follow the pattern).
You then just draw or bitblt, etc.. and the drawing will be transformed by the matrix.
If you use SetWorldTransform then you wouldn't have to worry about monochrome bitmaps, etc. You can just use whatever technique your spritesheet required.
So, for an example, I've taken a small example I wrote recently that doesn't use a mask, per se, but draws the same image on a black background and white background, then uses bitblt with specific raster ops to draw the two images to a destination with "transparent" background.
A common misconception when first seeing the technique is thinking that it won't allow for White or Black in the image because it is using that for the background colors, but there is no "mask" color with this technique, so all colors can be used.
You can look at the vbSrcAnd raster op as transferring all the bits set to 0 to the destination image.
Likewise, you can look at the vbSrcPaint raster op as transferring all the bits set to 1 to the destination image.
So, with vbSrcAnd, the background is white, all 1's, no 0's, so none of the background is transferred to the destination (vbSrcAnd only transfers 0's). The 0's from your image are transferred because it has some 0's in it.
Any color other than white, has to have some 0's in it.
And, likewise with vbSrcPaint, the background is black (no 1's), so none of the background is transferred to the destination (vbSrcPaint only transfers 1's). But again, the 1's from the colors in the image are transferred (any color other than black will have some 1's in it).
So, if you have black (all 0's), you won't see it on the black background, but you will see it on the white background which is the image that 0's are transferred from, so black is drawn on the destination from the copy of the image.
Likewise, you won't see the white on a white background, but you will see it on the black background, which is the image use to transfer all the 1's.
Bottom line, you can use your normal techniques for doing your drawing, but let the matrix handle the tranforming of the points to accomplish the rotation.
You don't have to use the technique used in this example to implement the transparent background capability.
As I said earlier, the example attached is just a simple example based on one earlier. There are two pictureboxes at the top, one with a black background, the other with a white background.
When you click and drag on either one, a random color is chosen and a contiguous line is drawn in that color in both windows so that the image is the same in both windows.
At the same time, a timer is running which increments an angle value continuously from 0 to 360 degrees (in radians), and sets up a matrix, and bitblts the two images with the appropriate raster op into the lower picturebox.
So, the image you are drawing in the upper boxes, is continually rotating in the lower box.
Nothing practical, just another example of a way to do both transparent background and rotation of an image.
In your case, the rotation of the image is the primary thing to take away, as you already had the transparent background bitblting worked out with your spritesheet.
P.S. Once the matrix is set, it will effect all drawing to the hdc, even the drawing done by VB itself.
To see an example of it affecting VB's native drawing, add the following code to draw a grid either before or after the two bitblts, your choice (grid under the image or grid over the image). You will see the grid rotate as well.
Code:
'Draw a grid
Dim i As Single
For i = -hs To hs + 4 Step (hs / 4)
Picture2.Line (-hs, i)-(hs, i)
Picture2.Line (i, -hs)-(i, hs)
Next
P.P.S The dx,dy,px and py variables were left from the previous example, and are unused, so should be deleted.
Note, if you use the API Add-In that comes with VB6 to get your API declarations, it has the XFORM fields declared as doubles, which is incorrect. It didn't work well at all until I found that out.