Оригинальный вопрос
По сути, у меня есть два растровых изображения, и я хочу поместить одно за другим, уменьшенное до половины его размера. Оба расположены по центру и имеют одинаковое разрешение. Суть в том, что я хочу в конечном итоге поместить более одного растрового изображения на этот задний слой и хочу, чтобы масштабирование применялось ко всему слою, а не только к отдельному растровому изображению. Я думаю, что я использовал бы память D C для заднего слоя, захватил бы ее содержимое в собственное растровое изображение и использовал бы StretchBlt, чтобы поместить его в мой основной dc. Код, который я сейчас имею, не работает, и я могу не имеет смысла, не говоря уже о том, чтобы найти кого-то, кто делал это раньше для направления.
Мои переменные на данный момент таковы:
hBitmap - задний битовый массив
hFiller - переднее растровое изображение
hd c - основное D C
ld c - заднее D C (сделано с помощью CreateCompatibleD C (hd c);)
re sh - ширина hd c
resv - высота hd c
обратите внимание, что источник моего окна просмотра установлен в центре - эта часть выше решена, при этом одной из основных проблем является то, что она не сохраняет задние слои ...
Пересмотренный вопрос
Вот мой код. Все работает, как задумано, за исключением того факта, что слои не укладываются должным образом. Кажется, они стирают то, что внизу, или заполняют его черным.
Для записи это прямая копия моего кода. Я объясняю его разделы, но между блоками кода ничего не пропущено.
case WM_TIMER:
{
switch(wParam)
{
case FRAME:
Если какие-либо значения положения или поворота изменились, следующий раздел кода очищает экран и подготавливает его к перезаписи.
if(reload == TRUE){
tdc = CreateCompatibleDC(hdc);
oldFiller = SelectObject(tdc,hFiller);
GetObject(hFiller, sizeof(filler), &filler);
StretchBlt(hdc, 0-(resh/2), 0-(resv/2), resh, resv, tdc, 0, 0, 1, 1, SRCCOPY);
SelectObject(tdc,oldFiller);
DeleteDC(tdc);
if(turn == TRUE){
xForm.eM11 = (FLOAT) cos(r/angleratio);
xForm.eM12 = (FLOAT) sin(r/angleratio);
xForm.eM21 = (FLOAT) -sin(r/angleratio);
xForm.eM22 = (FLOAT) cos(r/angleratio);
xForm.eDx = (FLOAT) 0.0;
xForm.eDy = (FLOAT) 0.0;
SetWorldTransform(hdc, &xForm);
}
Эта часть работает только частично. На расстоянии 80 мое значение масштаба сделает мое растровое изображение 1 пикселем на 1 пиксель, поэтому я считаю это моим «расстоянием рисования»
Оно масштабируется должным образом, но слои не складываются, как я упоминал выше
for(int i=80;i>1;i--){
tdc = CreateCompatibleDC(hdc);
tbm = CreateCompatibleBitmap(hdc, resh, resv);
SelectObject(tdc, tbm);
BitBlt(tdc, 0-(resh/2), 0-(resv/2), resh, resv,hdc,0,0,SRCCOPY);
//drawing code goes in here
ldc = CreateCompatibleDC(hdc);
oldBitmap = SelectObject(ldc,hBitmap);
StretchBlt(tdc,(int)(angleratio*atan((double)128/(double)i)),0,(int)(angleratio*atan((double)128/(double)i)),(int)(angleratio*atan((double)128/(double)i)),ldc,0,0,128,128,SRCCOPY);
SelectObject(ldc,oldBitmap);
DeleteDC(ldc);
BitBlt(hdc, 0, 0, resh, resv, tdc, 0, 0, SRCCOPY);
DeleteObject(tbm);
DeleteDC(tdc);
}
reload = FALSE;
}
В этом разделе ниже просто проверяется ввод с клавиатуры, который изменяет положение или поворот "камеры". Эта часть работает нормально и ее можно игнорировать
if(GetKeyboardState(NULL)==TRUE){
reload = TRUE;
if(GetKeyState(VK_UP)<0){
fb--;
}
if(GetKeyState(VK_DOWN)<0){
fb++;
}
if(GetKeyState(VK_RIGHT)<0){
lr--;
}
if(GetKeyState(VK_LEFT)<0){
lr++;
}
if(GetKeyState(0x57)<0){
p++;
}
if(GetKeyState(0x53)<0){
p--;
}
}
break;
}
}
break;