Мне нужна ваша помощь для проекта на моей работе.
Основное программное обеспечение, использующее язык 4D, работает как MDI, оно создает много окон, включенных в главное окно. Основная проблема в том, что у нас много окон, и нам нужен простой способ переключения с одного окна на другое.
Мы решили создать небольшой плагин c ++, который является dll для решения этой проблемы.
Этот плагин создаст вкладку на панели задач для каждого окна, открытого как Windows Explorer. Создание и удаление вкладок уже работает.
Но в настоящее время проблема заключается в том, что на вкладке не установлено ни одного эскиза.
Данный параметр является идентификатором окна основного программного обеспечения. Метод с именем PA_GetHWND
- это метод, данный 4D для получения дескриптора окна с использованием windowID
.
Я уже проверил, где проблема. Растровое изображение, созданное из окна, уже существует и является хорошим. Для этого теста я поместил растровое изображение в буфер обмена и вставил его в Paint, и растровое изображение было хорошим.
Вот код, представляющий метод обновления растрового изображения на вкладке.
bool CManageTaskBar::UpdateWindow(long WindowID)
{
HRESULT res;
HDC hdcScreen;
HDC hdcWindow;
HDC hdcMemDC = NULL;
HBITMAP hbmScreen = NULL;
//Get the Handle from 4D
HWND nHandle = (HWND)(PA_GetHWND((PA_WindowRef)(WindowID)));
// Retrieve the handle to a display device context for the client
// area of the window.
hdcScreen = GetDC(NULL);
hdcWindow = GetDC(nHandle);
// Create a compatible DC which is used in a BitBlt from the window DC
hdcMemDC = CreateCompatibleDC(hdcWindow);
// Get the client area for size calculation
RECT rcClient;
GetClientRect(nHandle, &rcClient);
// Create a compatible bitmap from the Window DC
hbmScreen = CreateCompatibleBitmap(hdcWindow,rcClient.right - rcClient.left, rcClient.bottom - rcClient.top);
// Select the compatible bitmap into the compatible memory DC.
SelectObject(hdcMemDC, hbmScreen);
// Bit block transfer into our compatible memory DC.
if (!BitBlt(hdcMemDC,
0, 0,
rcClient.right - rcClient.left, rcClient.bottom - rcClient.top,
hdcWindow,
0, 0,
SRCCOPY))
{
MessageBox(nHandle, L"BitBlt has failed", L"Failed", MB_OK);
//goto done;
}
ITaskbarList3* ptbl = NULL;
HRESULT hr = CoCreateInstance(my_CLSID_TaskbarList, NULL, CLSCTX_ALL, my_IID_ITaskbarList3, (LPVOID*)&ptbl);
BOOL fForceIconic = TRUE;
BOOL fHasIconic = TRUE;
res = DwmSetWindowAttribute(nHandle, DWMWA_FORCE_ICONIC_REPRESENTATION, &fForceIconic, sizeof(fForceIconic));
res = DwmSetWindowAttribute(nHandle, DWMWA_HAS_ICONIC_BITMAP, &fHasIconic, sizeof(fHasIconic));
if (hbmScreen)
{
res = DwmSetIconicThumbnail(nHandle, hbmScreen,0);//DWM_SIT_DISPLAYFRAME);
}
DeleteObject(hbmScreen);
DeleteObject(hdcMemDC);
ReleaseDC(NULL, hdcScreen);
ReleaseDC(nHandle, hdcWindow);
return true;
}
Звонки на DwmSetWindowAttribute
возвращают неверный дескриптор. Этот дескриптор работает для получения растрового изображения, но не для установки атрибута.
И вызов DwmSetIconicThumbnail
возвращает E_INVALIDARG
возможно, потому что данный дескриптор неверен.
Почему я не могу установить атрибут для этого дескриптора и почему вызов для установки миниатюры возвращает E_INVALIDARG?
Спасибо всем, кто позаботится о моей проблеме.
Это мой первый вопрос, будьте дружелюбны, пожалуйста:)