Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не работает BitBlt при обработке WM_PAINT

5.1K
10 марта 2008 года
12345678
93 / / 16.12.2006
Добрый день. При написании собственного елемента управления столкнулся с таким западлом:

Код:
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


Приведенный выше код смысла не имеет, он просто демонстрирует ситуацию. Прикол в том, что при WM_LBUTTONDOWN функция BitBlt выполняеться правильно и кусок екрана копируеться в указанное место. Но при WM_PAINT тот же код отказиваеться коректно выполняться: BitBlt возвращает 0 и естесно ничего никуда не копируеться :( Етой процедурой (wnd_proc) обрабатываеться стандартный виндовый контрол типа STATIC. Я уже пробывал ставить DefWindowProc и там и сям, также пытался вернуть управление стандартному обработчику... нифига, проблема остаеться. Интересно так же то, что если из обработки WM_PAINT передать управление в другой модуль программы (забыл сказать что я пишу dll и юзаю ее через VisualBasic), то BitBlt работает правильно! Но мне такой вариант не катит. Мне нужно в dll обрабатывать ето сообщение.
87
10 марта 2008 года
Kogrom
2.7K / / 02.02.2008
На ассемблере и на бейсике программы для Windows не писал, но в си при получении сообщения WM_PAINT используют функции BeginPaint, EndPaint вместо GetDC. Наверно, те же функции используются в ассемблере.
5.1K
10 марта 2008 года
12345678
93 / / 16.12.2006
Пробывал и BeginPaint ... EndPaint - непомогает :(
87
10 марта 2008 года
Kogrom
2.7K / / 02.02.2008
На си получается что-то вроде того:
Код:
HDC hDC, hDCDisplay;
PAINTSTRUCT ps;
...
    case WM_PAINT:
        hDC = BeginPaint(hwnd, &ps);
        hDCDisplay = GetDC(NULL); // теперь получили изображение с экрана
        BitBlt(hDC, ...,hDCDisplay,... );
        ...
        EndPaint(hwnd, &ps);
        break;
...

При этом, лучше использовать разные переменные для дискриптора контекста при обработке сообщения WM_PAINT и при обработке других сообщений, где используется GetDC.
5.1K
14 марта 2008 года
12345678
93 / / 16.12.2006
Kogrom
Говорю же BeginPaint...EndPaint тут нипричем. У меня складываеться впечатление что BitBlt не выполняеться исключительно из подгружаемого модуля dll, в то время как в exe она (функция BitBlt с теми же параметрами) выполняеться коректно! Прямо мистика!
341
17 марта 2008 года
Der Meister
874 / / 21.12.2007
Чёт ты тут намутил - атас!
 
Код:
invoke BitBlt,eax,0,0,100,100,200,200,eax,vbSrcCopy
Сравним-ка с MSDN:
Код:
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
);
Мало того, что ты контект-источник не там передаёшь, так он ещё и совпадвет с получателем.
О чём GetLastError() говорит?
5.1K
17 марта 2008 года
12345678
93 / / 16.12.2006
Цитата: Der Meister
Мало того, что ты контект-источник не там передаёшь...



Вот ето я ступил!!!! :) Глюкает меня по-полной :) Der Meister, огромное тебе спасибо! Постараюсь больше так не тормозить.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог