/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
[C++] True Type til Bitmap
Fra : Rick


Dato : 08-02-05 20:35

Hej i gruppen,

Jeg har brug for at benytte en true type font fra computeren fx Arial og
angive størrelse osv og så lægge en tekststreng med denne skrift på et
bitmap, så det bliver til et billede.

Nogle foreslår på en eller anden måde at benytte GetGlyphOutline - men jeg
ved ikke helt, hvordan.
Er der nogen, der kan hjælpe? Evt. med programeksempler...

Jeg bruger Microsoft Visual C++ 6.0

- rick -



 
 
Bertel Brander (08-02-2005)
Kommentar
Fra : Bertel Brander


Dato : 08-02-05 20:29

Rick wrote:
> Hej i gruppen,
>
> Jeg har brug for at benytte en true type font fra computeren fx Arial og
> angive størrelse osv og så lægge en tekststreng med denne skrift på et
> bitmap, så det bliver til et billede.
>
> Nogle foreslår på en eller anden måde at benytte GetGlyphOutline - men jeg
> ved ikke helt, hvordan.
> Er der nogen, der kan hjælpe? Evt. med programeksempler...
>

Nu skriver du ikke hvad du skal med dit "billede"; skal det vises,
eller gemmes i en fil, eller begge, eller ...

Jeg lavede et hurtigt eksempel der laver en bitmap, en font, og
skriver Whatever på denne bitmap og viser det på skærmen.

Hvis du vil have det skrevet i en fil, finder vi nok også ud af det.

Det bruger Win32 API'en direkte så det burde kompilere med de fleste
kompilere, inklusive VC++ 6.0

#include <windows.h>

HINSTANCE InstanceHandle;
HWND MainWindow;

void OnDraw(HWND hwnd)
{
PAINTSTRUCT PaintStruct;
BeginPaint(hwnd, &PaintStruct);
HFONT Font = CreateFont(16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
"Arial");
HDC dc = PaintStruct.hdc;
HDC MemDc = CreateCompatibleDC(dc);
SelectObject(MemDc, Font);
HBITMAP Bitmap = CreateCompatibleBitmap(MemDc, 100, 20);
SelectObject(MemDc, Bitmap);
RECT Rect = {0, 0, 100, 20};
HBRUSH Brush = CreateSolidBrush(RGB(255, 255, 255));
FillRect(MemDc, &Rect, Brush);
SetBkMode(MemDc, TRANSPARENT);
TextOut(MemDc, 0, 0, "Whatever", 8);
BitBlt(dc, 10, 10, 100, 20, MemDc, 0, 0, SRCCOPY);
EndPaint(hwnd, &PaintStruct);
DeleteDC(MemDc);
DeleteObject(Font);
DeleteObject(Brush);
DeleteObject(Bitmap);
}

LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
lParam)
{
switch (msg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
OnDraw(hwnd);
break;
default:
return DefWindowProc(hwnd,msg,wParam,lParam);
}
return 0;
}

HWND CreateMainWindow()
{
WNDCLASS wc;
memset(&wc, 0, sizeof(WNDCLASS));
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ;
wc.lpfnWndProc = (WNDPROC )MainWndProc;
wc.hInstance = InstanceHandle;
wc.hbrBackground = (HBRUSH )(COLOR_WINDOW + 1);
wc.lpszClassName = "SimpleWinWndClass";
wc.lpszMenuName = 0;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClass(&wc))
return 0;

return CreateWindow("SimpleWinWndClass",
"Simple-Window",
WS_MINIMIZEBOX | WS_VISIBLE |
WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_MAXIMIZEBOX |
WS_CAPTION | WS_BORDER | WS_SYSMENU | WS_THICKFRAME,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
0,
0,
InstanceHandle,
0);
}

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
INT nCmdShow)
{
InstanceHandle = hInstance;

if((MainWindow = CreateMainWindow()) == (HWND )0)
{
MessageBox(0, "Failed to create MainWindow!", "Warning", MB_OK);
return 0;
}
ShowWindow(MainWindow, SW_SHOW);
MSG Msg;
while(GetMessage(&Msg, 0, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Rick (09-02-2005)
Kommentar
Fra : Rick


Dato : 09-02-05 17:45


> Rick wrote:
>> Hej i gruppen,
>>
>> Jeg har brug for at benytte en true type font fra computeren fx Arial og
>> angive størrelse osv og så lægge en tekststreng med denne skrift på et
>> bitmap, så det bliver til et billede.
>>
>> Nogle foreslår på en eller anden måde at benytte GetGlyphOutline - men
>> jeg ved ikke helt, hvordan.
>> Er der nogen, der kan hjælpe? Evt. med programeksempler...
>>
>
> Nu skriver du ikke hvad du skal med dit "billede"; skal det vises,
> eller gemmes i en fil, eller begge, eller ...
>
> Jeg lavede et hurtigt eksempel der laver en bitmap, en font, og
> skriver Whatever på denne bitmap og viser det på skærmen.
>
> Hvis du vil have det skrevet i en fil, finder vi nok også ud af det.
>
> Det bruger Win32 API'en direkte så det burde kompilere med de fleste
> kompilere, inklusive VC++ 6.0
>
> <Kode>
> Absolutely not the best homepage on the net:
> http://home20.inet.tele.dk/midgaard
> But it's mine - Bertel

Det ser ud til, at det er lige det, som jeg skal bruge
Mange tak skal du have...

- rick -



Rick (10-02-2005)
Kommentar
Fra : Rick


Dato : 10-02-05 10:13

"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:42091304$0$303$edfadb0f@dread11.news.tele.dk...

> PAINTSTRUCT PaintStruct;
> BeginPaint(hwnd, &PaintStruct);
> HFONT Font = CreateFont(16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
> "Arial");
> HDC dc = PaintStruct.hdc;
> HDC MemDc = CreateCompatibleDC(dc);
> SelectObject(MemDc, Font);
> HBITMAP Bitmap = CreateCompatibleBitmap(MemDc, 100, 20);

Jeg har fået det til at virke fint, men i stedet for paintstruct har jeg
skrevet:

HDC dc = GetDC(0);
HDC MemDc = CreateCompatibleDC(dc );

Men udskriver jeg det med BitBlt-funktionen, bliver resultatet kun
monokromt - altså sort eller hvidt.
Hvordan får jeg det i 24bit for eksempel?

Jeg har prøvet med noget PIXELFORMATDESCRIPTOR og ChoosePixelFormat, men det
ser umiddelbart ikke ud til at virke.

- rick -



Rick (10-02-2005)
Kommentar
Fra : Rick


Dato : 10-02-05 15:02

"Rick" <rickcool22@hotmail.com> wrote in message
news:420b258e$0$200$edfadb0f@dread11.news.tele.dk...
> Hvordan får jeg det i 24bit for eksempel?

Jeg har selv fundet ud af det nu

Ved at lave en BITMAPINFO og i stedet oprette bitmappet med
CreateDIBSection.

- rick -



Bertel Brander (10-02-2005)
Kommentar
Fra : Bertel Brander


Dato : 10-02-05 20:07

Rick wrote:
> "Rick" <rickcool22@hotmail.com> wrote in message
> news:420b258e$0$200$edfadb0f@dread11.news.tele.dk...
>
>>Hvordan får jeg det i 24bit for eksempel?
>
>
> Jeg har selv fundet ud af det nu
>
> Ved at lave en BITMAPINFO og i stedet oprette bitmappet med
> CreateDIBSection.
>

Man kan også løse problemet ved at bruge den oprindelige dc
i kaldet til CreateCompatibleBitmap. Hvis man bruger en memorydc,
som i mit eksempel bliver det altid et monokromt bitmap.

Husk at hvis din kode kører ved WM_PAINT skal den kalde BeginPaint
og EndPaint.

Jeg arbejdede lidt videre med koden, nu skriver den billedet
til en fil, første gang den er kaldt:

BITMAPINFOHEADER WriteHeader(FILE *aFile, int aWidth, int aHeight, WORD
aBitPixel)
{
BITMAPFILEHEADER BitmapFileHeader;
BITMAPINFOHEADER BitmapInfoHeader;
unsigned int WordsPerLine = (aWidth*aBitPixel + 31)/32;
BitmapFileHeader.bfType = (('M' << 8) | 'B');
BitmapFileHeader.bfSize = sizeof(BitmapFileHeader) +
sizeof(BitmapInfoHeader) + 4*WordsPerLine*aHeight;
BitmapFileHeader.bfReserved1 = 0;
BitmapFileHeader.bfReserved2 = 0;
BitmapFileHeader.bfOffBits = 0x36 + 8;

BitmapInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
BitmapInfoHeader.biWidth = aWidth;
BitmapInfoHeader.biHeight = aHeight;
BitmapInfoHeader.biPlanes = 1;
BitmapInfoHeader.biBitCount = aBitPixel;
BitmapInfoHeader.biCompression = BI_RGB;
BitmapInfoHeader.biSizeImage = 0;
BitmapInfoHeader.biXPelsPerMeter = 0;
BitmapInfoHeader.biYPelsPerMeter = 0;
BitmapInfoHeader.biClrUsed = 0;
BitmapInfoHeader.biClrImportant = 0;
fwrite(&BitmapFileHeader, sizeof(BitmapFileHeader), 1, aFile);
fwrite(&BitmapInfoHeader, sizeof(BitmapInfoHeader), 1, aFile);
return BitmapInfoHeader;
};

void OnDraw(HWND hwnd)
{
PAINTSTRUCT PaintStruct;
BeginPaint(hwnd, &PaintStruct);
HFONT Font = CreateFont(16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
"Arial");
HDC dc = PaintStruct.hdc;
HDC MemDc = CreateCompatibleDC(dc);
SelectObject(MemDc, Font);
HBITMAP Bitmap = CreateCompatibleBitmap(dc, 100, 20);
HGDIOBJ OldBitmap = SelectObject(MemDc, Bitmap);
RECT Rect = {0, 0, 100, 20};
HBRUSH Brush = CreateSolidBrush(RGB(255, 128, 128));
FillRect(MemDc, &Rect, Brush);
SetBkMode(MemDc, TRANSPARENT);
TextOut(MemDc, 0, 0, "Whatever", 8);
BitBlt(dc, 10, 10, 100, 20, MemDc, 0, 0, SRCCOPY);

SelectObject(MemDc, OldBitmap);

if(First)
{
First = false;
BITMAP Bm;
GetObject(Bitmap, sizeof(Bm), &Bm);
FILE *f = fopen("whatever.bmp", "wb");
if(f)
{
BITMAPINFOHEADER Header = WriteHeader(f, 100, 20, Bm.bmBitsPixel);
char *Buffer = new char [100*20*Bm.bmBitsPixel/8];
GetDIBits(dc, Bitmap, 0, 20, Buffer, (BITMAPINFO *)&Header,
DIB_RGB_COLORS);
fwrite(Buffer, 100*20*Bm.bmBitsPixel/8, 1, f);
fclose(f);
}
}
EndPaint(hwnd, &PaintStruct);
DeleteDC(MemDc);
DeleteObject(Font);
DeleteObject(Brush);
DeleteObject(Bitmap);
}

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste