Почему края моего шрифта не гладкие при рисовании с помощью DrawText API?

Когда я рисую текст на DC, текст выходит с неровными краями, а в нескольких окнах, которые обрабатывает этот WindowProc, текст между каждым из них выглядит по-разному, что выглядит непрофессионально. Есть ли способ нарисовать его так, чтобы он получился с четкими ровными краями?

    case WM_PAINT:
    {
    GetClientRect(hwnd, &rect);
    hdc = BeginPaint(hwnd, &ps);
    hdcmem = CreateCompatibleDC(hdc);
    BITMAP bm;      
    HBITMAP hbmold =  (HBITMAP)SelectObject(hdcmem, gbutton);
    GetObject(gbutton, sizeof(bm), &bm);
    SetBkMode(hdcmem, TRANSPARENT);
    SetTextColor(hdcmem, RGB(74,88,91));
    HFONT hf = CreateFont(30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, L"Myriad Pro");
    HFONT hfold = (HFONT)SelectObject(hdcmem, hf);
    //the next line works fine, but with rough text edges.
    DrawText(hdcmem, L"Drag a\r\nFile\r\nHere", -1, &rect, DT_CENTER | DT_VCENTER  );
    SelectObject(hdcmem, hfold);

    BitBlt(hdc, 0,0,bm.bmWidth,bm.bmHeight,hdcmem,0,0,SRCCOPY);
    SelectObject(hdcmem, hbmold);
    DeleteDC(hdcmem);
    EndPaint(hwnd, &ps);
    break;
    }

person Geore Shg    schedule 21.06.2011    source источник


Ответы (4)


Myriad Pro — это шрифт OpenType, не поддерживаемый GDI. Вместо этого выберите шрифт TrueType.

person Hans Passant    schedule 21.06.2011
comment
+1 - не рассматривал это. @Geore: вам придется использовать Uniscribe, если вы хотите поддерживать такой шрифт OpenType. - person Billy ONeal; 21.06.2011

  1. Укажите ненулевое значение для вашего шрифта.
  2. Убедитесь, что ваш вызов CreateFont выполнен успешно — в случае неудачи вы вернетесь к (зубчатому) шрифту SYSTEM.

Общие примечания к вашему примеру кода:

  1. Вы пропускаете HFONT.
  2. Вам, вероятно, следует использовать static_cast HFONT, а не приведение в стиле C.
person Billy ONeal    schedule 21.06.2011

Вероятно, вы захотите передать ANTIALIASED_QUALITY или CLEARTYPE_QUALITY для параметра fdwQuality (параметр от третьего до последнего).

person Jerry Coffin    schedule 21.06.2011

Убедитесь, что ClearType включен в настройках дисплея.

person Ajay    schedule 21.06.2011
comment
Это повлияет на все приложения, а не только на OP. - person Billy ONeal; 21.06.2011
comment
Да, но если он отключен, это повлияет на все приложения и, в конечном итоге, не позволит данному приложению использовать эту функцию. - person Ajay; 21.06.2011
comment
@Ajay: ОП жалуется на свое приложение, а не на весь свой рабочий стол. - person Billy ONeal; 21.06.2011
comment
@ Билли, я это понимаю. Посмотрите на это с другой стороны - если вы отключили тему Windows (на уровне службы!), Какое приложение МОЖЕТ этим воспользоваться? Никто. Одному приложению НЕ МОЖЕТ быть предоставлена ​​поддержка тем, если другие приложения могут ее использовать. - person Ajay; 21.06.2011
comment
@Ajay: Нет, если вы отключили эту функцию, она будет отключена. Никакие приложения не могут его использовать. - person Billy ONeal; 21.06.2011
comment
Точно. Если ClearType отключен, он отключен. ОП не ответил на это. Возможно, GDI+, OpenGL или DirectX смогут рисовать плавный текст, даже если они отключены. - person Ajay; 21.06.2011
comment
@Ajay: система этого не делает. Возможно, какое-то приложение реализует собственное сглаживание и рендеринг шрифтов, но если это отключить, то сама Windows будет иметь неровные шрифты. - person Billy ONeal; 21.06.2011
comment
Я бы не принял или не отказался бы от вашего комментария, так как я не уверен. Но мои инстинкты говорят, что OpenGL/DirectX может это сделать. Причина проста — даже если ClearType отключен, игры отображают фантастический текст. - person Ajay; 21.06.2011
comment
@Ajay: 1. Хорошо, я думаю, мы проигнорируем факты о том, как работает система, и будем следовать вашим инстинктам. 2. В играх уже реализовано собственное сглаживание. Конечно, можно самостоятельно реализовать что-то вроде ClearType. Но операционная система этого не делает. Если его отключить, все будет неровным, независимо от того, на что настроена игра. - person Billy ONeal; 21.06.2011