Я пытаюсь выяснить, как использовать функцию Windows API PathCompactPath. Требуется дескриптор контекста устройства (hDC) в дополнение к длине пикселя, до которой сокращается строка пути, где контекст устройства содержит информацию о размере шрифта, шрифте и т. Д., Которая используется для вычисления длины.
Если у меня есть дескриптор окна (hWnd) для метки, как я могу правильно получить контекст устройства, который содержит информацию о шрифте, с помощью которого была создана эта метка? GetDC кажется, отбрасывает эту информацию для обычных оконных дескрипторов.
Я пишу C ++ DLL для использования с VB6, поэтому hWnd будет исходить из элемента управления VB6. Тем не менее, я думаю, что мой вопрос относится и к общему случаю (метка в форме C ++).
Я предполагаю, что ваш «ярлык» является статическим элементом управления с текстом в нем. Если это так, вы можете просто добавить SS_PATHELLIPSIS стиль управления и пусть контроль сделает всю работу за вас.
Но чтобы ответить на вопрос, как спросили:
Вы можете получить DC для элемента управления с помощью GetDC, но, скорее всего, на этом DC не будет выбран правильный шрифт. Если это так, то вам просто повезло, но вы не хотите полагаться на удачу. Большинство элементов управления позволяют запрашивать дескриптор шрифта, который он будет использовать, отправляя ему WM_GETFONT сообщение. Используя это, вы можете настроить DC, вызвать PathCompactPath, а затем очистить.
auto hdc = ::GetDC(hwnd);
auto hfont = reinterpret_cast<HFONT>(::SendMessage(hwnd, WM_GETFONT, 0, 0));
auto hfontOld = ::SelectObject(hdc, hfont);
blah blah PathCompactPath blah blah
::SelectObject(hdc, hfontOld);
::ReleaseDC(hwnd, hdc);
Вы захотите сделать некоторую проверку ошибок, особенно для проверки возврата сообщения WM_GETFONT — возможно, запрашиваемый вами элемент управления не поддерживает это сообщение.
Других решений пока нет …