Использование ITaskbarlist3 в приложении MDI, (VC++ - MFC/Win32)
Я пытался включить API панели задач Windows 7 в обычное приложение MFC MDI (интерфейс с несколькими документами). Я использую Visual Studio 2008, где я перенаправил путь SDK для использования Windows 7 SDK.
Идея состоит в том, чтобы предоставить настраиваемые растровые изображения в реальном времени для каждого из окон дочерних структур, которые создаются внутри приложения. Несмотря на то, что я смог добиться прогресса, я испытываю некоторую борьбу с последними частями, которые, кажется, не подходят. Просто хотел знать, что я что-то упускаю.
В порядке,
поэтому нам нужно окно прокси, которое у меня есть, так как API предварительного просмотра в реальном времени работают только на окнах верхнего уровня (это разочарование). В этом окне обрабатываются WM_DWMSENDICONICTHUMBNAIL и WM_DWMSENDICONICLIVEPREVIEWBITMAP, которые предоставляют API-интерфейсам необходимые растровые изображения для предварительного просмотра миниатюр и предварительного просмотра в реальном времени.
case WM_DWMSENDICONICTHUMBNAIL: // get the bitmap of the client window // set it as thumbnail width = HIWORD(lParam); height = LOWORD(lParam); hBitmap = CreateBitmapFromHandleAndResize(hwnd, width, height); if (hBitmap) { SetThumbnail(hBitmap, hwnd); DeleteObject(hBitmap); } break; case WM_DWMSENDICONICLIVEPREVIEWBITMAP: hBitmap = CreateBitmapFromHandle(hwnd); if (hBitmap) { SetThumbnailForPreview(hBitmap, hwnd); DeleteObject(hBitmap); } break;
Обе функции CreateBitmapFromHandleAndResize и CreateBitmapFromHandle создают DIB, также известный как независимое от устройства растровое изображение, которое служит пищей для API DwmSetIconicThumbnail и DwmSetIconicLivePreviewBitmap.
Проблема, с которой я столкнулся: проблема, с которой я сталкиваюсь, находится в области растрового изображения в реальном времени, где работает следующий код. HBitmap - это 32-битный DIB-файл глубины, который при сохранении на диске кажется правильным скриншотом дочернего окна, которое я хотел бы отобразить. Но когда я его предварительно просматриваю, строка заголовка и растровое изображение каким-то образом выглядят не так, как у самого окна. На самом деле это выглядит как не в фокусе представление дочернего окна. Я хотел бы, чтобы изображение отображалось с таким же качеством, потому что пользователь не должен чувствовать разницу.
В настоящее время я беру распечатку всего окна, включая рамку, и размещаю предварительный просмотр точно поверх существующего окна, чтобы при включенном предварительном просмотре пользователь был обманут, увидев растровые изображения вместо реальных дочерних окон.
Я надеюсь, что это ожидаемое поведение здесь предварительного просмотра. Пожалуйста, дайте мне знать, если я не прав здесь.
Еще одной проблемой было смещение. Не уверен, что я делаю что-то не так здесь. Но это просто не работает, когда я просто делаю различие между двумя ритами. Поправочный коэффициент 8 и 14 был сделан методом проб и ошибок!
void SetThumbnailForPreview(HBITMAP hBitmap, HWND hWnd)
{
StateInfo *pState = (StateInfo *)GetWindowLongPtr(hWnd, GWLP_USERDATA);
CWnd* pMainFrame = pState->m_pParentWnd->GetParent();
pState->pTaskBar->SetTabActive(hWnd, pMainFrame->GetSafeHwnd(), 0);
RECT rectClient, rectMainframe;
pState->m_pParentWnd->GetClientRect(&rectClient);
pState->m_pParentWnd->ClientToScreen(&rectClient);
pMainFrame->GetWindowRect(&rectMainframe);
POINT offset;
offset.x = (rectClient.left - rectMainframe.left) - 8;
offset.y = (rectClient.top - rectMainframe.top) + 14;
HRESULT hr = DwmSetIconicLivePreviewBitmap(hWnd, hBitmap, &offset, 0);
}
Мои вопросы в двух словах:
Есть ли способ получить растровое изображение с тем же качеством, что и у самого окна, чтобы не было никакой разницы?
Является ли расчет смещения правильным. Почему это не работает с прямыми разногласиями RECT?
Правильно ли мое понимание относительно поведения предварительного просмотра в приложении MDI
В области предварительного просмотра миниатюр: главное окно MDI всегда отображается вместе с другими миниатюрами.
Миниатюрные изображения являются отдельными представлениями дочерних окон.В области предварительного просмотра: при наведении курсора на отдельные эскизы в режиме предварительного просмотра всегда отображается главный MDI
рамка вместе с дочерними окнами. Разница в том, что пользователь видит
это конкретное дочернее окно (то, которое находится при наведении) получает фокус и выделение.Я делаю правильные вещи здесь или есть какие-то дополнительные вещи, о которых я не знаю?
Заранее спасибо! Ранджит