C ++ GDI +在透明的分层窗口上绘制文本

时间:2011-01-24 15:34:04

标签: c++ windows gdi+ layered

(非托管C ++) 我已经成功地将PNG文件绘制到一个透明的分层窗口,我可以在桌面上拖动,但现在我的问题是在透明的分层窗口上绘制文本

这是我的代码和我在中间绘制文本的尝试,重要的是要注意我使用screenDC而不是使用WM_PAINT消息中的那个

[编辑] 注释后更新代码,现在我只是想在获取HBITMAP版本之前在位图上写文本,我需要使用 这次我使用DrawString因为textout()不是GDI +,我希望DrawString真的是GDI + lol 但是仍然不起作用,不知道我做错了什么

void Draw() // draws a frame on the layered window AND moves it based on x and y
{
    HDC screenDC( NULL ); // grab screen
    HDC sourceDC( CreateCompatibleDC(screenDC) );

    POINT pos = {x,y}; // drawing location
    POINT sourcePos = {0,0}; // top left of image
    SIZE size = {100,100}; // 100x100 image

    BLENDFUNCTION blendFunction = {0};
    HBITMAP bufferBitmap = {0};
    Bitmap* TheBitmap = crnimage; // crnimage was already loaded earlier

    // ------------important part goes here, my attempt at drawing text ------------//

 Gdiplus::Graphics     Gx(TheBitmap);

// Font* myFont =    new Font(sourceDC);
 Font myFont(L"Arial", 16);


 RectF therect;
 therect.Height = 20;
 therect.Width = 180;
 therect.X = 0;
 therect.Y = 0;

 StringFormat format;
 format.SetAlignment(StringAlignmentCenter);
 format.GenericDefault();
 Gdiplus::SolidBrush   GxTextBrush(Gdiplus::Color(255, 255, 0,255));


 WCHAR thetext[] = L"Sample Text";

 int stats = Gx.DrawString(thetext, -1, &myFont, therect, &format, &GxTextBrush);
 if(stats) // DrawString returns nonzero if there is an error
     msgbox(stats); 
 stats = Gx.DrawRectangle(&Pen(Color::Red, 3), therect);
 // the rectangle and text both draw fine now

 // ------------important part goes here, my attempt at drawing text ------------//

    TheBitmap->GetHBITMAP(0, &bufferBitmap);
    HBITMAP oldBmpSelInDC;
    oldBmpSelInDC = (HBITMAP)SelectObject(sourceDC, bufferBitmap);

    // some alpha blending
    blendFunction.BlendOp = AC_SRC_OVER;
    blendFunction.SourceConstantAlpha = wndalpha;
    blendFunction.AlphaFormat = AC_SRC_ALPHA;
    COLORREF colorKey( RGB(255,0,255) );
    DWORD flags( ULW_ALPHA);

    UpdateLayeredWindow(hWnd, screenDC, &pos, & size, sourceDC, &sourcePos,
    colorKey, &blendFunction, flags);

    // release buffered image from memory
    SelectObject(sourceDC, oldBmpSelInDC);
    DeleteDC(sourceDC);
    DeleteObject(bufferBitmap); 

    // finally release the screen
    ReleaseDC(0, screenDC);
}

我一直在尝试在我的分层窗口上写文本两天了,但是从这些尝试中我知道有几种方法我可以这样做 (不幸的是我不知道究竟是怎么回事)

我看到的通常选项是在位图上绘制文本,然后自己渲染位图

  
      
  1. 使用Gdi +加载位图
  2.   
  3. 从位图
  4. 创建Graphics对象   
  5. 使用DrawString将文本写入位图
  6.   
  7. 处理Graphics对象
  8.   
  9. 使用位图保存方法将结果保存到文件
  10.   

显然,人们也可以从DC制作图形对象,然后在DC上绘制文本,但我再也不知道如何做到这一点

1 个答案:

答案 0 :(得分:2)

整体方法看起来正确,但我认为您在DrawString电话中遇到了一些问题。查看MSDN上的文档(尤其是示例)。

Gx.DrawString(thetext, 4, NULL, therect, NULL,  NULL)

可能需要指定第三,第五和第六个参数(字体,格式和画笔)。文档并未说明它们是可选的。为这些传递NULL可能导致GDI +将呼叫视为无操作。

第二个参数不应包括字符串中的终止L'\ 0'。如果你的字符串总是被终止,那么使用-1可能是最安全的。