Используйте DrawText для обновления метки - PullRequest
0 голосов
/ 22 февраля 2010

В настоящее время я пишу программу на c ++ (без MFC) и хочу обновить метку (статический элемент управления win32), используя функцию win32 DrawText. Однако, когда я вызываю функцию, на этикетке ничего не пишется. Я использую следующий код:

    HDC devCon = ::GetDC(GetDlgItem(IDC_TITLE).m_hWnd);
    RECT rect = {10, 10, 100, 15};
    ::DrawText(devCon, _T("TEST DC TEXT!!!"), -1, &rect, DT_NOCLIP);
    ::ReleaseDC(GetDlgItem(IDC_TITLE).m_hWnd, devCon);

Как вы видите с GetDlgItem (...) я использую ATL, но это не должно быть проблемой, по моему мнению. Когда я указываю NULL в методе GetDC, текст рисуется в левом верхнем углу экрана, как и положено, так как метод возвращает DC на весь экран. Почему это не работает с DC лейбла?

Надеюсь, вы, ребята, можете мне помочь.

Ответы [ 3 ]

0 голосов
/ 03 марта 2010

Используйте SetDlgItemText (), чтобы установить текст для элемента управления.

Вы пытаетесь рисовать непосредственно в контексте устройства статического элемента управления. Это не будет так просто, потому что:

  • элемент управления будет перекрашиваться каждый раз, когда его область обновления становится недействительной

  • обычно элементы управления совместно используют контекст устройства с родительским окном, поэтому то, что вы получаете в GetDC (...), фактически является контекстом устройства вашего диалога.

Итак, используйте SetDlgItemText или SetWindowText, чтобы установить текст окна.

Чтобы использовать собственный шрифт (или установить цвет текста / фона), обработайте сообщение WM_CTLCOLORSTATIC в WindowProc.

0 голосов
/ 09 сентября 2010

Если вы хотите нарисовать текст вручную, потому что настройка управляющего текста не делает то, что вы хотите, то вам нужно сказать Windows, что вы делаете это. В противном случае элемент управления будет отображать все, что вы делаете, всякий раз, когда его нужно перерисовать.

Чтобы нарисовать его самостоятельно, пометьте свой элемент управления как владельца, установив стиль SS_OWNERDRAW, а затем обработайте сообщение WM_DRAWITEM, чтобы нарисовать его в процедуре окна родительского окна или подкласса. окно и обработайте сообщение WM_PAINT в новой процедуре окна.

0 голосов
/ 22 февраля 2010

Полагаю, что текст прорисован, но в следующем окне сообщения установлен текст по умолчанию.

Попробуйте установить текст с помощью SendMessage (.., WM_SETTEXT, ...);

...