【问题标题】:DrawText doesn't work, but Graphics::DrawString is okDrawText 不起作用,但 Graphics::DrawString 没问题
【发布时间】:2013-11-27 11:37:30
【问题描述】:

我正在内存中创建一个与图像和文本相结合的位图。我的代码是:

HDC hdcWindow = GetDC();
HDC hdcMemDC = CreateCompatibleDC(hdcWindow);
HBITMAP hbmDrag = NULL;

if (!hdcMemDC) {
   ReleaseDC(hdcWindow);
   return NULL;
}

RECT clientRect = {0};
GetClientRect(&clientRect);
hbmDrag = CreateCompatibleBitmap(hdcWindow, 256, 256);
if(hbmDrag) {
   SelectObject(hdcMemDC, hbmDrag);
   FillRect(hdcMemDC, &clientRect, mSelectedBkgndBrush);
   Graphics graphics(hdcMemDC);
   // Draw the icon
   graphics.DrawImage(mImage, 100, 100, 50, 50);
#if 1
   CRect desktopLabelRect(0, y, clientRect.right, y);
   HFONT desktopFont = mNameLabel.GetFont();
   HGDIOBJ oldFont = SelectObject(hdcMemDC, desktopFont);
   SetTextColor(hdcMemDC, RGB(255,0,0));
   DrawText(hdcMemDC, mName, -1, desktopLabelRect, DT_CENTER | DT_END_ELLIPSIS | DT_CALCRECT);
#else
   // Set font
   Font font(hdcMemDC, mNameLabel.GetFont());
   // Set RECT
   int y = DEFAULT_ICON_HEIGHT + mMargin;
   RectF layoutRect(0, y, clientRect.right, y);
   // Set display format
   StringFormat format;
   format.SetAlignment(StringAlignmentCenter);
   // Set brush
   SolidBrush blackBrush(Color(255, 0, 0, 0));
   // Draw the label
   int labelWide = DEFAULT_ICON_WIDTH + mMargin;
   CString labelName = GetLayOutLabelName(hdcMemDC, labelWide, mName);
   graphics.DrawString(labelName, -1, &font, layoutRect, &format, &blackBrush);
#endif
}

DeleteDC(hdcMemDC);
ReleaseDC(hdcWindow);

return hbmDrag;

图像可以输出到位图成功。 对于文本,如果我使用“DrawText”,虽然返回值是正确的,但它不能在位图中显示; 但是Graphics::DrawString可以输出文字成功。

我不知道原因。有人可以告诉我吗? 非常感谢。

【问题讨论】:

    标签: graphics drawstring drawtext


    【解决方案1】:

    您将DT_CALCRECT 标志传递给DrawText()。这个标志被记录为(强调我的):

    确定矩形的宽度和高度。如果有 多行文字,DrawText 使用矩形的宽度 lpRect 参数指向并扩展 矩形来绑定文本的最后一行。如果最大的单词更宽 比矩形,宽度扩大。如果文本小于 矩形的宽度,宽度减小。如果只有一个 文本行,DrawText 修改矩形的右侧,所以 它限制了行中的最后一个字符。在任一情况下, DrawText 返回格式化文本的高度但不绘制 文本

    【讨论】:

    • 感谢您的 cmets。但即使我删除了“DT_CALCRECT”或增加了传递给 DrawText 的 lpRect 的宽度和高度,它仍然不起作用。
    • 令我惊讶的是,DrawText 可以在 WM_SIZE 处理程序中工作。但是在 WM_SIZE 处理程序中,我将一个窗口 DC 传递给了 DrawText,而不是由 CreateCompatibleDC 创建的那个。
    • 啊,我找到了根本原因。如您所说,如果我将 DT_CALCRECT 传递给 DrawText 而没有 enghou 宽度或高度,它将返回 RECT 而不是输出文本。所以我应该调用 DrawText 两次。谢谢你的提醒。
    猜你喜欢
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    相关资源
    最近更新 更多