Почему DIB глючит

Тема в разделе "WASM.BEGINNERS", создана пользователем NaZGuL, 5 сен 2005.

  1. NaZGuL

    NaZGuL New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2004
    Сообщения:
    41
    Адрес:
    Russia
    Я пытаюсь нарисовать в памяти картинку (несколько строк с текстом), но почему-то выводится только последняя строчка!... Может кто чего предложит...?
    Код (Text):
    1.  
    2. void RenderFont(int x, int y, int size, char *str, char *fontname,
    3.                         void *buf, int w, int h)
    4.    {
    5.  
    6.         HDC hdc=GetDC(NULL);
    7.         HDC mdc = CreateCompatibleDC(hdc);
    8.         HBITMAP bm = CreateCompatibleBitmap(hdc,w,h);    
    9.  
    10.         HFONT hf=CreateFont(size, 0, 0, 0, 400, FALSE, FALSE, FALSE,
    11.         0, 0, 0,
    12.         ANTIALIASED_QUALITY, 0, fontname);        
    13.  
    14.         //RECT r;
    15.         //r.top=0;
    16.         //r.left=0;
    17.         //r.right=w;
    18.         //r.bottom=h;
    19.  
    20.         SelectObject(mdc, bm);
    21.         //FillRect(mdc, &r, (HBRUSH)GetStockObject(BLACK_BRUSH));
    22.  
    23.         SelectObject(mdc, hf);      
    24.         SetBkMode(mdc, TRANSPARENT);
    25.         SetTextColor(mdc, 0xFFFFFF);
    26.         TextOut(mdc, x, y, str, strlen(str));
    27.        
    28.        
    29.         BITMAPINFOHEADER bmi;
    30.         bmi.biSize=sizeof(BITMAPINFOHEADER);
    31.         bmi.biWidth=256;
    32.         bmi.biHeight=256;
    33.         bmi.biPlanes=1;
    34.         bmi.biBitCount=32;
    35.         bmi.biCompression=BI_RGB;
    36.  
    37.         GetDIBits(mdc,bm,0,256,buf,(BITMAPINFO *) &bmi,DIB_RGB_COLORS);
    38.  
    39.         DeleteObject(hf);
    40.         DeleteObject(bm);    
    41. }
    42.  
    43. int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    44.                                    LPTSTR lpCmdLine, int nCmdShow)
    45. {
    46.         int buf[256*256];
    47.  
    48.         RenderFont(0,20,40,".the .test","Courier New", buf,256,120);
    49.         RenderFont(2,60,40,".the .test","Courier New", buf,256,120);
    50.  
    51.         MessageBox(NULL,"See texture.tga","System message",MB_OK);
    52.  
    53.         SaveTexture("texture.tga",buf);
    54.  
    55.         return 0;
    56. }
    57.  
    58.  
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    NaZGuL

    Буфер для изображения - buf. Каждый раз в RenderFont он заполняется _новым_ изображением.

    Например, в RenderFont можно выполнять SetDIBits из переданного buf.
     
  3. NaZGuL

    NaZGuL New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2004
    Сообщения:
    41
    Адрес:
    Russia
    q_q

    А по конкретнее можно.(ну, для особо тупых:derisive:)

    Что где нужно поменять?
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    NaZGuL
    Код (Text):
    1. void RenderFont(
    2.   DWORD  x, DWORD  y,
    3.   DWORD  size,
    4.   char  *str,
    5.   char  *fontname,
    6.   void  *buf,
    7.   DWORD w,
    8.   DWORD h)
    9. {
    10.   HDC     hdc = GetDC(NULL);
    11.   HDC     mdc = CreateCompatibleDC(hdc);
    12.   HBITMAP bm  = CreateCompatibleBitmap(hdc, w, h);    
    13.   HFONT   hf  = CreateFont(size, 0, 0, 0, FW_NORMAL, FALSE, FALSE,
    14.                            FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
    15.                            CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY,
    16.                            DEFAULT_PITCH, fontname);        
    17.  
    18.   SelectObject(mdc, bm);
    19.  
    20.   BITMAPINFO bmi;    
    21.  
    22.   bmi.bmiHeader.biSize        = sizeof(bmi.bmiHeader);
    23.   bmi.bmiHeader.biWidth       = w;
    24.   bmi.bmiHeader.biHeight      = h;
    25.   bmi.bmiHeader.biPlanes      = 1;
    26.   bmi.bmiHeader.biBitCount    = 32;
    27.   bmi.bmiHeader.biCompression = BI_RGB;
    28.  
    29.   SetDIBits(mdc, bm, 0, w, buf, &bmi, DIB_RGB_COLORS);
    30.  
    31.   SelectObject(mdc, hf);      
    32.   SetBkMode(mdc, TRANSPARENT);
    33.   SetTextColor(mdc, 0xFFFFFF);
    34.   TextOut(mdc, x, y, str, lstrlen(str));
    35.        
    36.   GetDIBits(mdc,bm,0,256,buf,&bmi,DIB_RGB_COLORS);
    37.  
    38.   DeleteObject(hf);
    39.   DeleteObject(bm);    
    40. }
    41.  
    42. int PASCAL WinMain(
    43.   HINSTANCE hInstance,
    44.   HINSTANCE hPrevInstance,
    45.   LPTSTR    lpCmdLine,
    46.   int       nCmdShow
    47. )
    48. {
    49.   int buf[256*256];
    50.   RtlZeroMemory(buf, sizeof(buf));
    51. ...