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