Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: BMP-kuva kursoriksi (WinAPI)

erkkipetteri [03.10.2008 20:04:01]

#

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;
}

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta