Avatar billede spectual Nybegynder
10. januar 2002 - 13:27 Der er 1 løsning

Hvad er der vejen i denne funktion?

Jeg har lavet en funktion, som skriver noget tekst på
et i bitmap og laver en fil ud fra det.

Men af een eller årsag er billedet fyldt med tilfældige pixels omkring teksten.

Er der nogen, der kan løse problemet?

Koden:

#include \"stdafx.h\"
#include<windows.h>
#include \"stdlib.h\"

void DrawText (PSTR pStr, long width)
{
    HDC        hdcMem, hdc;
    BITMAPINFOHEADER bi;
    HBITMAP    bm;
    HGDIOBJ    stkBm;
    TEXTMETRIC    tm;
    int bredde;
    FILE *fil;

    LOGFONT lf;
    LPSIZE pSize = new SIZE;

    int cnty = 0; // tæller linjer

    unsigned char *tmp_mem;

    memset(&bi, 0, sizeof(BITMAPINFOHEADER));
    bi.biSize = sizeof(BITMAPINFOHEADER);
    bi.biWidth = width;
    bi.biHeight = 35;
    bi.biCompression = BI_RGB;
    bi.biPlanes = 1;
    bi.biBitCount = 24;
    bi.biSizeImage = bi.biWidth * bi.biHeight * 3;
    bi.biXPelsPerMeter = bi.biYPelsPerMeter = 0;
    bi.biClrUsed = bi.biClrImportant = 0;

    hdc = GetDC(NULL);
    hdcMem = CreateCompatibleDC(hdc);
    bm = CreateCompatibleBitmap(hdc, (WORD)bi.biWidth, (WORD)bi.biHeight);

    stkBm = SelectObject(hdcMem, bm);

    long allocsize = bi.biWidth * bi.biHeight * 3;
    tmp_mem = (unsigned char*)malloc (allocsize);

    memset (tmp_mem, 0, allocsize);

    memset(&lf, 0, sizeof(lf));

    lf.lfHeight = 34;
    strcpy(lf.lfFaceName, \"SquareSerif\");


    HFONT hFont = CreateFontIndirect(&lf);
    SelectObject(hdcMem, hFont);

    SetTextColor(hdcMem, RGB(209, 209, 209));
    SetBkColor(hdcMem, RGB(0, 0, 0));
    GetTextMetrics(hdcMem, &tm);

    // Skaf bredden af tekststrengen i pixels

    GetTextExtentPoint32(hdcMem, pStr, strlen (pStr), pSize);
   
    bredde = pSize->cx;

    delete (pSize);

    bredde = bredde + 10;
    fil = fopen (\"bredde.txt\", \"w\");
    fprintf (fil, \"bredde: %d\\n\", bredde);
    fclose (fil);

    // skriv tekst

    TextOut(hdcMem, 55, 0, pStr, lstrlen(pStr));

    GetDIBits (hdcMem, bm, 0, bi.biHeight, tmp_mem, (LPBITMAPINFO)&bi, DIB_RGB_COLORS);

    fclose (fil);

    DeleteObject(bm);
    DeleteDC(hdcMem);
    ReleaseDC(NULL, hdc);

    // vi prøver lige at lave et screenshot

    BITMAPFILEHEADER header;

    header.bfType = 19778;
    header.bfSize = sizeof (BITMAPFILEHEADER) + bi.biSizeImage + bi.biSize;
    header.bfReserved1 = 0;
    header.bfReserved2 = 0;
    header.bfOffBits = sizeof (BITMAPFILEHEADER) + bi.biSize;

    fil = fopen (\"tmp_mem.bmp\", \"w\");
    fwrite (&header, sizeof (BITMAPFILEHEADER), 1, fil);
    fwrite (&bi, bi.biSize, 1, fil);
    fwrite (tmp_mem, bi.biSizeImage, 1, fil);
    fclose (fil);

    free (tmp_mem);
}

int main(int argc, char* argv[])
{

    DrawText (\"Tester funktionen\", 720);

    return 0;
}
Avatar billede spectual Nybegynder
10. januar 2002 - 13:55 #1
Problemet skyldes at HBITMAP\'et ikke er blevet slettet. Det kan gøres med følgende kode, som indsættes efter CreateCompatibleBitmap linjen:

    RECT Rect;
   
    Rect.left = 0;
    Rect.right = bi.biWidth;
    Rect.bottom = bi.biHeight;
    Rect.top = 0;

    FillRect(hdcMem,&Rect,(HBRUSH) GetStockObject(BLACK_BRUSH));
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester