Использование ITaskbarlist3 в приложении MDI, (VC++ - MFC/Win32)

Я пытался включить API панели задач Windows 7 в обычное приложение MFC MDI (интерфейс с несколькими документами). Я использую Visual Studio 2008, где я перенаправил путь SDK для использования Windows 7 SDK.

Идея состоит в том, чтобы предоставить настраиваемые растровые изображения в реальном времени для каждого из окон дочерних структур, которые создаются внутри приложения. Несмотря на то, что я смог добиться прогресса, я испытываю некоторую борьбу с последними частями, которые, кажется, не подходят. Просто хотел знать, что я что-то упускаю.

В порядке,

  1. поэтому нам нужно окно прокси, которое у меня есть, так как 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;
    
  2. Обе функции 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);
       }

Мои вопросы в двух словах:

  1. Есть ли способ получить растровое изображение с тем же качеством, что и у самого окна, чтобы не было никакой разницы?

  2. Является ли расчет смещения правильным. Почему это не работает с прямыми разногласиями RECT?

  3. Правильно ли мое понимание относительно поведения предварительного просмотра в приложении MDI

    В области предварительного просмотра миниатюр: главное окно MDI всегда отображается вместе с другими миниатюрами.
    Миниатюрные изображения являются отдельными представлениями дочерних окон.

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

  4. Я делаю правильные вещи здесь или есть какие-то дополнительные вещи, о которых я не знаю?

Заранее спасибо! Ранджит

0 ответов

Другие вопросы по тегам