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.