Создать CWnd в библиотеке - PullRequest
0 голосов
/ 02 ноября 2019

Я переместил следующий код из проекта, основанного на диалоге MFC, в библиотеку MFC dll:

CWnd dummyWnd;
standard = new Gdiplus::Font(dummyWnd.GetDC()->GetSafeHdc(), &logfont); //GetDC() returns null, which did not happen in an MFC dialog-based app

Мне нужен временный DC для создания шрифтов gdiplus, измерения строк и других служебных функций.

Мои вопросы:

  • возможно ли использовать CWnd, как я это делал в диалоговом приложении?
  • или я могу просто получить DC для этой цели в другомкстати?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2019

Для создания временного постоянного тока:

//create memory dc 
CClientDC dc(NULL);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc, width, height);
memdc.SelectObject(bitmap);

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

Чтобы получить рабочий стол постоянного тока, используя Windows API:

HDC hdc = ::GetDC(0);
standard = new Gdiplus::Font(hdc, &logfont);
...
ReleaseDC(0, hdc); //cleaup

В качестве альтернативы используйте MFC

CClientDC dc(NULL);
standard = new Gdiplus::Font(dc.GetSafeHdc(), &logfont);

Как и для временных окон, dummyWnd.GetDC()->GetSafeHdc() не работает в режиме отладкии вызывает ошибку, потому что MFC проверит правильность дескриптора окна.

В режиме выпуска это может фактически работать, потому что это заканчивает тем, что вызывает ::GetDC(NULL), который является действительным. Однако это приведет к утечке ресурсов, потому что ReleaseDC никогда не вызывается.

0 голосов
/ 02 ноября 2019

Поскольку шрифт будет нарисован в определенных окнах, контекст устройства окон будет необходим для правильного рисования. Вы отправляете CWnd * в качестве параметра вашей функции, которая будет экспортироваться вашей динамической библиотекой.

// MyMfcLibrary.cpp
void InitializeFont(CWnd* pWnd)
{
   CClientDC dc(pWnd);
   Gdiplus::Font myfont(dc.GetSafeHdc()->GetSafeHdc(), &logfont);
   /**/
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...