Hyvän ja ilmaisen kursorinteko-ohjelman puutteessa ajattelin väsätä ohjelman, joka muuttaa .bmp-kuvat kursoreiksi.
Käytän SDL_LoadBMP:tä, koska feilasin LoadImage/GetDIBits-yhdistelmällä.
Nyt vain kursorin läpinäkyvyys kusee, eli vaikka pistänkin läpinäkyvät pikselit AND- ja XOR-maskeihin ainoan löytämäni tuton tapaan, jää tausta silti mustaksi(vaikka onkin kuvassa valkoinen).
Niin ja itelläni ainakin kaappaa edelliseksi kursoksi Wintoosan tiimalasi-kursorin nuolen sijaan, mikä avuksi?
#include <SDL/SDL.h>
#include <conio.h>
#include <windows.h>
#include <stdio.h>
#define BUFFER 512
Uint32 getpixel(SDL_Surface *surface, int x, int y) //Joo, pöllitty
{
int bpp = surface->format->BytesPerPixel;
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
switch (bpp)
{
case 1:
return *p;
case 2:
return *(Uint16 *)p;
case 3:
if (SDL_BYTEORDER == SDL_BIG_ENDIAN)
return p[0] << 16 | p[1] << 8 | p[2];
else
return p[0] | p[1] << 8 | p[2] << 16;
case 4:
return *(Uint32 *)p;
}
return 0;
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
char Path[BUFFER];
char FilePath[BUFFER];
long TransparentColor;
int HotSpotX, HotSpotY;
GetCurrentDirectory(BUFFER, Path);
printf("What file shall be converted?\n");
scanf("%s", FilePath);
strcat(Path, "\\");
strcat(Path, FilePath);
SDL_Surface *Picture;
Picture = SDL_LoadBMP(Path);
if (!Picture)
{
printf("SDL_LoadBMP failed: %s\n", SDL_GetError());
getch();
return 0;
}
printf("What color shall be transparent?\n");
scanf("%ld", &TransparentColor);
printf("Which pixel shall be the hotspot on x-axis?\n");
scanf("%d", &HotSpotX);
printf("Which pixel shall be the hotspot on y-axis?\n");
scanf("%d", &HotSpotY);
HDC NullDC = GetDC(NULL);
HDC AndBitmapDC = CreateCompatibleDC(NullDC);
HDC XorBitmapDC = CreateCompatibleDC(NullDC);
HBITMAP AndBitmap = CreateCompatibleBitmap(NullDC, Picture->w, Picture->h);
HBITMAP XorBitmap = CreateCompatibleBitmap(NullDC, Picture->w, Picture->h);
SelectObject (AndBitmapDC, AndBitmap);
SelectObject (XorBitmapDC, XorBitmap);
long Pixel;
for (int X = 0; X < Picture->w; ++X)
{
for (int Y = 0; Y < Picture->h; ++Y)
{
Pixel = getpixel(Picture, X, Y);
if (Pixel == TransparentColor)
{
SetPixel(AndBitmapDC, X, Y, 16777215); //Tässä kohtia asetetaan
SetPixel(XorBitmapDC, X, Y, 0); //läpinäkyvä pikseli
}
else
{
SetPixel(AndBitmapDC, X, Y, 0);
SetPixel(XorBitmapDC, X, Y, Pixel);
}
}
}
ICONINFO IconInfo;
IconInfo.fIcon = FALSE;
IconInfo.xHotspot = HotSpotX;
IconInfo.yHotspot = HotSpotY;
IconInfo.hbmMask = AndBitmap;
IconInfo.hbmColor = XorBitmap;
HCURSOR Cursor = CreateIconIndirect(&IconInfo);
HCURSOR OldCursor = GetCursor();
SetSystemCursor(Cursor, OCR_NORMAL); //Previkka kursorista
getch();
SetSystemCursor(OldCursor, OCR_NORMAL); //Edellinen takas
SDL_Quit();
return 0;
}Aihe on jo aika vanha, joten et voi enää vastata siihen.