proc wnd_proc hwnd, msg, wParam, lParam
cmp [msg],WM_LBUTTONDOWN
je .wm_mousedown
cmp [msg],WM_PAINT
je .wm_paint
jmp .finish
.wm_mousedown:
invoke GetDC,0
invoke BitBlt,eax,0,0,100,100,200,200,eax,vbSrcCopy
jmp .finish
.wm_paint:
invoke GetDC,0
invoke BitBlt,eax,0,0,100,100,200,200,eax,vbSrcCopy
jmp .finish
.finish:
invoke DefWindowProc,[hwnd],[msg],[wParam],[lParam]
ret
endp
Не работает BitBlt при обработке WM_PAINT
Код:
Приведенный выше код смысла не имеет, он просто демонстрирует ситуацию. Прикол в том, что при WM_LBUTTONDOWN функция BitBlt выполняеться правильно и кусок екрана копируеться в указанное место. Но при WM_PAINT тот же код отказиваеться коректно выполняться: BitBlt возвращает 0 и естесно ничего никуда не копируеться :( Етой процедурой (wnd_proc) обрабатываеться стандартный виндовый контрол типа STATIC. Я уже пробывал ставить DefWindowProc и там и сям, также пытался вернуть управление стандартному обработчику... нифига, проблема остаеться. Интересно так же то, что если из обработки WM_PAINT передать управление в другой модуль программы (забыл сказать что я пишу dll и юзаю ее через VisualBasic), то BitBlt работает правильно! Но мне такой вариант не катит. Мне нужно в dll обрабатывать ето сообщение.
На ассемблере и на бейсике программы для Windows не писал, но в си при получении сообщения WM_PAINT используют функции BeginPaint, EndPaint вместо GetDC. Наверно, те же функции используются в ассемблере.
Пробывал и BeginPaint ... EndPaint - непомогает :(
Код:
HDC hDC, hDCDisplay;
PAINTSTRUCT ps;
...
case WM_PAINT:
hDC = BeginPaint(hwnd, &ps);
hDCDisplay = GetDC(NULL); // теперь получили изображение с экрана
BitBlt(hDC, ...,hDCDisplay,... );
...
EndPaint(hwnd, &ps);
break;
...
PAINTSTRUCT ps;
...
case WM_PAINT:
hDC = BeginPaint(hwnd, &ps);
hDCDisplay = GetDC(NULL); // теперь получили изображение с экрана
BitBlt(hDC, ...,hDCDisplay,... );
...
EndPaint(hwnd, &ps);
break;
...
При этом, лучше использовать разные переменные для дискриптора контекста при обработке сообщения WM_PAINT и при обработке других сообщений, где используется GetDC.
Говорю же BeginPaint...EndPaint тут нипричем. У меня складываеться впечатление что BitBlt не выполняеться исключительно из подгружаемого модуля dll, в то время как в exe она (функция BitBlt с теми же параметрами) выполняеться коректно! Прямо мистика!
Код:
invoke BitBlt,eax,0,0,100,100,200,200,eax,vbSrcCopy
Код:
BOOL BitBlt(
HDC hdcDest, // handle to destination DC
int nXDest, // x-coord of destination upper-left corner
int nYDest, // y-coord of destination upper-left corner
int nWidth, // width of destination rectangle
int nHeight, // height of destination rectangle
HDC hdcSrc, // handle to source DC
int nXSrc, // x-coordinate of source upper-left corner
int nYSrc, // y-coordinate of source upper-left corner
DWORD dwRop // raster operation code
);
HDC hdcDest, // handle to destination DC
int nXDest, // x-coord of destination upper-left corner
int nYDest, // y-coord of destination upper-left corner
int nWidth, // width of destination rectangle
int nHeight, // height of destination rectangle
HDC hdcSrc, // handle to source DC
int nXSrc, // x-coordinate of source upper-left corner
int nYSrc, // y-coordinate of source upper-left corner
DWORD dwRop // raster operation code
);
О чём GetLastError() говорит?
Цитата: Der Meister
Мало того, что ты контект-источник не там передаёшь...
Вот ето я ступил!!!! :) Глюкает меня по-полной :) Der Meister, огромное тебе спасибо! Постараюсь больше так не тормозить.