Я не занимаюсь c #, поэтому не думаю, что это может быть полезным. Я пытался изучить ваш код и не вижу ничего, что могло бы решить мою проблему, даже если вы выполняете ту же задачу, что и я.
Чтобы дать больше деталей, мой элемент управления также поддерживает анимацию GIF, и я также использовал ту же нагрузку IImage из потока, что и вы в своем проекте. По моему опыту, загрузка IImage из потока - невероятный ненужный код, он очень медленный. Я понятия не имею, как это может быть так медленно. Загрузка 32x32 GIF с 31 кадром занимает 1,5 секунды, используя этот мусорный материал IImage. Я написал свой собственный загрузчик (используя некоторую gif-библиотеку с открытым исходным кодом) и без какой-либо оптимизации полное декодирование / загрузка gif-кадров занимает менее 100 мс. Я использую TouchPro2 ... Я не могу себе представить, насколько плохо этот код будет работать на младшем устройстве.
В качестве быстрой альтернативы вот возможное решение моего вопроса:
в обработчике WM_PAINT дочернего элемента управления, который рисует изображения (gif или png), я делаю следующее:
сначала я вызываю SetRedraw (false) для себя и для родительского окна.
затем я скрываю дочерний элемент управления и отправляю WM_PAINT в родительское окно с дополнительным HDC (как wParam). В родительском окне все выводится на экранное растровое изображение (передаваемое через hdc в WM_PAINT), и после успешного возврата WM_PAINT я беру соответствующую часть закадрового растрового изображения.
Затем я включаю показ дочернего окна и вызываю SetRedraw (true) как для дочернего, так и для родительского окна. Этот трюк работает, но, очевидно, имеет некоторые недостатки (мне нужно создать огромное закадровое растровое изображение, чтобы захватить всю область экрана, даже если мне нужно 32x32 пикселя от середины родительского окна).
код ниже:
bool pic_control::get_parent_bg(MyBitmap & bg)
{
CWindow parent = GetParent();
CClientDC dc(parent);
bool is_visible = IsWindowVisible() && parent.IsWindowVisible();
if(!is_visible){
return false;
}
parent.SetRedraw(false);
SetRedraw(false);
CRect rect;
parent.GetClientRect(rect);
MyBitmap bmp;
bmp.create(rect.Width(), rect.Height());
ShowWindow(SW_HIDE);
parent.SendMessage(WM_PAINT, (WPARAM)(HDC)bmp.dc());
ShowWindow(SW_SHOW);
GetWindowRect(rect);
parent.ScreenToClient(rect);
bg.create(rect.Width(), rect.Height());
bg.dc().BitBlt(0, 0, rect.Width(), rect.Height(), bmp.dc(), rect.left, rect.top, SRCCOPY);
IF_DEBUG SAL::saveHBITMAPToJpeg(bg.GetBitmap(), "frames/BG.jpg", 100);
SetRedraw(true);
parent.SetRedraw(true);
return true;
}