2017-05-22 16 views
-2

[無条件で動作する最終的な修正:BitBltではなくSetDIBitsToDeviceを使用して、ポストテキスト描画イメージデータをコピーします。この変更により、問題の発生はすべて無くなりました。]CreateDIBitmapビットへの直接アクセス

私は問題は解決しましたが、私の人生ではなぜそれが発生したのかわかりません。

  1. CreateDIBitmapでビットマップを作成します。ビットマップビットへのポインタを取得します。
  2. ビットマップをメモリDCに選択します。
  3. 背景ビットマップメモリ​​に直接書き込むことによってビットマップを埋めます。
  4. TextOut。
  5. テキストは表示されません。

問題を修正しました。アイテム3を直接塗りつぶしからFillRectの呼び出しに変更しました。すべてはうまく、完全に動作します。

これはWindows 10の下にありますが、Webでほとんど見つけられなかったすべてのバージョンのWindowsに適用されます。手作業で書いた後でも、ビットマップに対しては何も操作がなく、FillRectを呼び出すことさえできません。精通していない、Kimosabe。アプリケーションのどこかで、ビットマップメモリ​​に直接書き込むことでグラデーションの塗りつぶしを作成しても問題はありません。しかし、手動塗りつぶしの後にTextOutが呼び出されると、ビットマップはロックされ(効果的に)、それ以上の関数は機能しません。また、エラーを返しません。

私は90度のエスケープメントを持つフォントを使用しています。 "普通の"フォント、0度のエスケープメントで試してみませんか? DT_CALCRECTを使ってDrawTextExを実行すると、0度のエスケープメントフォントでしか機能しないことが明記されているため、この理由でTextOutを使用する必要がありました。

非常に奇妙です。

いいえ、背景色と同じテキストカラーを使用するような愚かなミスはありませんでした。私はこれにあまりにも長い時間を費やしてきました。人々が利用できる1つの選択肢は、通常は質問やそれを尋ねた人を破壊するのに費やされる無限のエネルギーが、数行のコードを書き、自分で試してみることができるということです。

答えて

1

ここにビットマップを作成する関数があります。普通の色を渡さず、グラデーションの塗りつぶしを渡し、白からピンクになるようにします。 正しく表示されますか?もしそうなら、その仕事の上にTextOutコールがありますか?

static HBITMAP MakeBitmap(unsigned char *rgba, int width, int height, VOID **buff) 
{ 
    VOID *pvBits;   // pointer to DIB section 
    HBITMAP answer; 
    BITMAPINFO bmi; 
    HDC hdc; 
    int x, y; 
    int red, green, blue, alpha; 

    // setup bitmap info 
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
    bmi.bmiHeader.biWidth = width; 
    bmi.bmiHeader.biHeight = height; 
    bmi.bmiHeader.biPlanes = 1; 
    bmi.bmiHeader.biBitCount = 32;   // four 8-bit components 
    bmi.bmiHeader.biCompression = BI_RGB; 
    bmi.bmiHeader.biSizeImage = width * height * 4; 

    hdc = CreateCompatibleDC(GetDC(0)); 
    answer = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, &pvBits, NULL, 0x0); 
    for (y = 0; y < height; y++) 
    { 
     for (x = 0; x < width; x++) 
     { 
      red = rgba[(y*width + x) * 4]; 
      green = rgba[(y*width + x) * 4 + 1]; 
      blue = rgba[(y*width + x) * 4 + 2]; 
      alpha = rgba[(y*width + x) * 4 + 3]; 
      red = (red * alpha) >> 8; 
      green = (green * alpha) >> 8; 
      blue = (blue * alpha) >> 8; 
      ((UINT32 *)pvBits)[(height - y - 1) * width + x] = (alpha << 24) | (red << 16) | (green << 8) | blue; 
     } 
    } 
    DeleteDC(hdc); 

    *buff = pvBits; 

    return answer; 
} 
関連する問題