我在内存中创建了一个与图像和文本结合的位图。我的代码是:
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可以输出文本成功。
我不知道原因。有人可以告诉我吗? 非常感谢。
答案 0 :(得分:1)
您正在将DT_CALCRECT
标记传递给DrawText()。该标志记录为(强调我的):
确定矩形的宽度和高度。如果有 多行文本
DrawText
使用矩形的宽度 由 lpRect 参数指向并扩展了它的基础 用于绑定最后一行文本的矩形。如果最大的单词更广泛 比矩形,宽度扩大。如果文字小于 矩形的宽度,宽度减小。如果只有一个 文本行,DrawText
修改矩形的右侧 它限制了行中的最后一个字符。在任一情况下,DrawText
返回格式化文本的高度,但不会绘制 文字。