Я создаю растровое изображение в памяти, которое сочетается с изображением и текстом. Мой код:DrawText не работает, но Graphics :: DrawString в порядке
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» или увеличил ширину и высоту lpRect, переданного DrawText. – yw5643
К моему удивлению, DrawText может работать в обработчике WM_SIZE. Но в обработчике WM_SIZE я передал окно DC в DrawText вместо файла, созданного CreateCompatibleDC. – yw5643
А, я нашел основную причину. Как вы сказали, если я передаю DT_CALCRECT в DrawText без ширины или высоты enghou, он вернет RECT вместо вывода текста. Поэтому я должен дважды вызвать DrawText. Спасибо, что напомнил. – yw5643