2013-11-27 2 views
0

Я создаю растровое изображение в памяти, которое сочетается с изображением и текстом. Мой код: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 может выводить текст успешно.

Я не знаю причины. Кто-нибудь может рассказать мне? Большое спасибо.

ответ

1

Вы отправляете флаг DT_CALCRECT на номер DrawText(). Этот флаг задокументирован как (основное внимание):

Определяет ширину и высоту прямоугольника. Если есть несколько строк текста, DrawText использует ширину прямоугольника , на который указывает параметр lpRect lpRect и расширяет базу прямоугольника , чтобы связать последнюю строку текста. Если наибольшее слово шире , чем прямоугольник, ширина расширяется. Если текст меньше ширины прямоугольника, ширина уменьшается. Если имеется только одна строка текста , то DrawText изменяет правую часть прямоугольника так, чтобы ограничивал последний символ в строке. В любом случае DrawText возвращает высоту отформатированного текста , но не рисует текст.

+0

Спасибо за ваши комментарии. Но он по-прежнему не работает, даже я удалил «DT_CALCRECT» или увеличил ширину и высоту lpRect, переданного DrawText. – yw5643

+0

К моему удивлению, DrawText может работать в обработчике WM_SIZE. Но в обработчике WM_SIZE я передал окно DC в DrawText вместо файла, созданного CreateCompatibleDC. – yw5643

+0

А, я нашел основную причину. Как вы сказали, если я передаю DT_CALCRECT в DrawText без ширины или высоты enghou, он вернет RECT вместо вывода текста. Поэтому я должен дважды вызвать DrawText. Спасибо, что напомнил. – yw5643

Смежные вопросы