Ошибка canvas does not allow drawing

Ошибка — Canvas does not allow drawing

KonstantinDKM

Отредактировано KonstantinDKM11.01.2015, 16:31

16:30, 11.01.2015 | #1

Нет аватара

Сообщений: 13

Добрый день, установил 10 на свой комп и пакет локализации 0.8 Все бы хорошо да вот только винду дико кроет и за одного бага природу которого я не могу понять. Когда он происходит пропадает кнопка пуск, сбиваются шрифты, вместо названий становятся крякозябрики, все тексты становятся жирными, хотел бы показать скриншот но сообщение об ошибке мешает их сохранить.

ChangeBtnPos, err:Canvas does not allow drawing

И за этого приходится перезаходить каждые 2 часа, если честно уже порядком достало. Но иногда комп просто виснет при повторном логине.
довольно таки мощный fx 8320@ 4.2, 8gb, gtx570. Сейчас набираю опять этот баг начался….

sysprg

Отредактировано sysprg11.01.2015, 18:14

18:17, 11.01.2015 | #2

Аватар sysprg

Почетный

Цитата KonstantinDKM ()

только винду дико кроет

Это не Windows кроет, а одно из установленных Вами приложений, на Delphi или того хуже, VB. Вы даже не сообщили о каком билде идет речь и о том, какие приложения гоняете.

Добавлено (11.01.2015, 18:17)
———————————————
Все жалобы на это сообщение относятся именно к подобным приложениям, причем в среде XP, очень старые. В отдельных случаях помогает запуск приложения от администратора.

bl99panda

Отредактировано bl99panda11.01.2015, 19:03

19:03, 11.01.2015 | #3

Нет аватара

Сообщений: 10

Сидел на всех билдах 10ки проблемы такой не было тебе правильно сказали проблемма с софтом…

KonstantinDKM

Отредактировано KonstantinDKM11.01.2015, 19:45

19:30, 11.01.2015 | #4

Нет аватара

Сообщений: 13

Ну в общем так, играю в Star Trek Online, Star Conflict, Word of Warkraft 5.4.8. biggrin
Установлен Eset Smart Security 8.0, торрент клиент, рк, тим спик, Adobe Photoshop CS3.
Поставил был PerfectDisk но у него не было доступа к жд. Удалил, поставил Smart Defrag последний.
Конвертирую видео в XvidPSP, установлены последние кодеки, DirectX 9 и С++ все версии. Как то раз автоматом на комп поставился анти спай от Iobit комп намертво повис когда оно открылось, удалил. angry2

Фиг его знает как понять по чему меню пуск превращается в кашу и система либо перезапукает рабочий стол, либо самому на выход, и то потом бывает зависание намертво, а вчера вообще было зависание 7 раз подряд при загрузке рабочего стола.. стало последней каплей…

Как то раз был вылет в синий экран, тогда посмотрел логи а там chkdsk.exe+8470
DPC_WATCHDOG_VIOLATION как то так…

Билд 9879

Вот только что ради интереса нажал сменить аватар в меню пуск и сразу

опять пошли эти глюки.

sysprg

Отредактировано sysprg11.01.2015, 19:53

19:50, 11.01.2015 | #5

Аватар sysprg

Почетный

Могу лишь посоветовать сносить приложения по одному в обратной к порядку установки последовательности и проверять не возникают ли описанные ошибки. Другой вариант — сразу снести самые старые по возрасту создания приложения, те, котрые Вы еще под XP гоняли, если таковые имеются. Ни с одним из перечисленных Вами, кроме С++ никогда не имел дел. smile

maxaon09

Отредактировано maxaon0911.01.2015, 19:56

19:55, 11.01.2015 | #6

Аватар maxaon09

Почетный

Сообщений: 561

Цитата KonstantinDKM ()

поставился анти спай от Iobit комп намертво повис когда оно открылось

Вот отсюда и пляши, я бы ещё и Eset Smart Security убрал и все приложения от Мэил-ру (ещё та срань зараза) и т.п. Если есть точка восстановления до проблемы откатись. Как вариант Восстановление компьютера без удаления Файлов: «Если ваш компьютер работает неправильно, вы можете его восстановить без потери фотографий, музыки, видео и других личных файлов.» Программки придется переустановить

KonstantinDKM

20:13, 11.01.2015 | #7

Нет аватара

Автор темы

Сообщений: 13

Без антивируса тож не вариант.. нет никакой антивир защиты у провайдера, часто происходят сканирования портов, мдс и проч гадость. У меня стоит майл ру агент последняя версия. Опера.
На 7 тоже откат не хочу, прирост производительности уже очень ощутимый, загружается очень быстро.
Вопрос еще гаджеты от 8.1 могут быть причиной таких провалов? Из гаджетов стоит ток монитор системы 2, и погодка.

Да вот еще что замечали ли вы проблемы с файлом подкачки? Система поставила на С и размер аж 9 ГБ, убрал в ручную выставил 2 ГБ макс, и переместил на другой диск. Один раз было такое что комп стал дико тормозить при конвертировании, посмотрел на монитор, файл подкачки заполнен 100%, а память свободно 60%. Что это может быть?
Из приложений времен Хр стоит ток XvidPSP 5.3 ибо только им можно нормально делать рипы.

sysprg

Отредактировано sysprg11.01.2015, 20:45

20:44, 11.01.2015 | #8

Аватар sysprg

Почетный

Цитата KonstantinDKM ()

XvidPSP 5.3

А вот этот зверь как раз и упоминался как источник ошибки! Снесите и проверьте, не знаю, кто такие рипы, но можете 10 минут без них прожить? Или проверьте запуск этой проги от администратора

otto600

Отредактировано otto60011.01.2015, 21:03

20:54, 11.01.2015 | #9

Нет аватара

Цитата sysprg ()

А вот этот зверь как раз и упоминался как источник ошибки

Именно, в нем есть или для его работы требуется такая мерзость как к-лайт глюко пак, которая калечит систему и корректно удалить его и искоренить остатки не возможно кроме как переустановка ОС. Также этот зверь, когда то заброшенная разработка, теперь поддерживаемая и обновляемая только энтузиастами рутрекера в «домашних условиях» на «коленке».

KonstantinDKM
Попробуйте MeGui и функционал для работы с HD побольше и ни чего вредного для системы нет. Хотя что тот что эта всего лишь графическая морда для многих консольных прог, которыми можно успешно работать без Гуев, тот же eac3to + x264.exe+avisynth. Да и зачем при современном железе, объемах ОЗУ и емкости носителей-HDD заниматься рипованием — ремукс если надо выкинуть лишнее и перекодировать аудио.

KonstantinDKM

Отредактировано KonstantinDKM11.01.2015, 21:41

21:37, 11.01.2015 | #10

Нет аватара

Автор темы

Сообщений: 13

Ну не у всех еще хороший интернет который позволяет качать от 40гб и выше. Ремуксы легко делаются в мкв мерге, но вот что то и с ним не так. Значит недавно делал рип, видео отдельно, а дорожку с блюрика вынул,концерт, чаптеры сделал, мало того что мерге не корректно выставил мои чаптеры, так еще ближе к концу видео рассинхрон видео и картинки. Сначала все превосходно минута в минуту идет.. а в конце такая хрень. Уж очень он как то быстро создавал файл в 12 гб, я вначале не сильно придал этому значение, ну все таки новая винда и т.д . Хорошо хоть ремуксы не испортил, а то в сеть вылаживаю…
Теперь понятно, этот зверь последний раз показал мне ахинею, резал блюрик, на отдельные части, 4 минуты хотел кодировать 10 часов….
Надо подбирать замену.. жаль. Знаю.. 6 его версия шлак полный.

otto600

21:46, 11.01.2015 | #11

Нет аватара

KonstantinDKM, подготавливайте материал вот этим, учитывает задержки видео/аудио, исправляет ошибки в потоках

eac3to и как им пользоваться

PainteR

22:26, 11.01.2015 | #12

Аватар PainteR

DG Win&Soft

Почетный

KonstantinDKM, а мир тесен happy
Решили наконец разобраться? А не меня грязью поливать? dry
http://nnm-club.me/forum/viewtopic.php?p=7055776#7055776

И на счет антивируса: антивирусы используют часто нестандартные приемы для борьбы с вредоносным ПО и они часто создаются под конкретную версию ОС (тот же драйвер), поэтому ставить антивирусное ПО на тех. релиз без подтверждения работы от производителя не имеет смысла, только «дров наломать».
Но это отдельная тема, для списка совместимых антивирусов и т.п.

MisterMyth

22:27, 11.01.2015 | #13

Аватар MisterMyth

otto600, k lite codec pack калечит систему? Не верю. Много лет пользуюсь только им и без проблем.

otto600

Отредактировано otto60011.01.2015, 23:48

23:14, 11.01.2015 | #14

Нет аватара

MisterMyth,
А зачем им пользоваться много лет, для просмотра/прослушивания любой плеер все играет из коробки своими внутренними декодерами с dxva (mpc hc/be, pot player…). А если нужны фильтры для програм конвертирования, достаточно ffdshow или LAV. А в кодепаке все существующие фильтры и кодеки собраны в кучу и конфликтуют между собой.
К-лайт был актуален версий 1и2, когда кроме WMP ничего не было. А современные версии это нонсенс, там и LAV и ffdshow и core, вот и приходится по настройкам плееров скакать приоритеты кодекам задавать, что бы друг у друга декодирование не перехватывали.
Вот MPC BE и никаких глюко паков

KonstantinDKM

23:59, 11.01.2015 | #15

Нет аватара

Автор темы

Сообщений: 13

Прошу прощения, рассматривал разные варианты проблемы, а учитывая что названия файлов превращаются в кашу, грешил на русификатор. sad
Вообще по идее если это есет то система должна была бы обваливаться при загрузке раб. стола по скольку он все время первым грузится.
И ни один антивирус не даст 100% совместимость, под бета версии ни кто такого не делает.

Насчет глюко пака, тоже с вами не согласен , стоял на старом компе, и на новом тоже. А вот всякие там Win7 паки это баги и т.п.
Установлен еще VLC 32 битный с кучей своих кодеков. AIMP, MKV Chaptlizer. Кстати недавно вторая прога Spyware Terminator так же вызвала зависание при загрузке, удалил сразу же.
Увы меню пуск все так же глючит, перебрал уже все программы.

  • Страница 1 из 2
  • 1
  • 2
  • »
Windows 8.1
  • Вопросы и ответы по Windows 8.1
  • Установка Windows 8.1
  • Оформление Windows 8.1
  • Обои / Wallpapers
  • Курсоры / Cursors
Популярное
  • Где заказать технический аудит сайта
  • Филаменты и нити для 3D принтера — какой пластик выбрать
  • Где пройти обучение по программированию на Python
  • Интеллектуальный цифровой выключатель нагрузки
  • Как найти интересный Телеграмм-канал
  • Автоматизация бизнеса и программно-аппаратные решения кассового учета
  • Кейлогер для ПК — добро или зло
  • Удобный посредник для доставки товара из Китая
  • Где приобрести распределительные кроссы для оптического кабеля
  • Погашение кредитов в мобильном приложении

I want to Draw a Screenshot from the entire screen to a TForm1 Canvas.

This code works well in Delphi XE3

procedure TForm1.Button1Click(Sender: TObject);
var
  c,scr: TCanvas;
  r,r2: TRect;
begin

  c := TCanvas.Create;
  scr := TCanvas.Create;
  c.Handle := GetWindowDC(GetDesktopWindow);
  try

    r := Rect(0, 0, 200, 200);
    form1.Canvas.CopyRect(r, c, r);

  finally
    ReleaseDC(0, c.Handle);
    c.Free;
  end;

Now I want to copy the screenshot to another canvas first.
Is there a way to do this without getting this error?

procedure TForm1.Button1Click(Sender: TObject);
var
  c,scr: TCanvas;
  r,r2: TRect;
begin

  c := TCanvas.Create;
  scr := TCanvas.Create;
  c.Handle := GetWindowDC(GetDesktopWindow);
  try

    r := Rect(0, 0, 200, 200);

    scr.CopyRect(r,c,r); <-- Error, canvas does not allow drawing
    form1.Canvas.CopyRect(r, scr, r); <-- Error, canvas does not allow drawing

  finally
    ReleaseDC(0, c.Handle);
    c.Free;
  end;

В чем вопрос-то? Куда нажать, чтобы увидеть? На свежей альфе? Знаете-ка что…. Этой ошибке ТРИСТА ЛЕТ! Посмотрите на дату исходного сообщения — март 2006 года.

Никуда не нажать. Эта ошибка возникает сама по себе и непредсказуемо. И чем дальше бат деградирует (с увеличением номера версии) — тем чаще.

Я ж сказал — на форумах по дельфи про такую проблему знают, знают про ее причины и знают, что надо делать, чтобы она не возникала. И всяких новичков терпеливо учат, как надо программировать многопоточные приложения.

Также, когда я искал информацию об этой ошибке, я видел много релизов РАЗНЫХ программ, в описании к которым было указано, что в этой версии «исправлена ошибка, приводящая к Canvas does not allow drawing и к Acsess violation at address».

Отрицать очевидное бессмысленно — ошибка в Бате есть, и причина ее — корявое программирование, рассинхронизация процессов, утечки памяти.

Беда в том, что эту ошибку в Бате уже НИКОГДА не исправить!!! Слишком все запущено. Я представляю, сколько кода надо перелопатить. А код уже давно такой, что в одном месте тронешь — в трех других сразу рассыпается.

Solution 1

If you need to work with an additional canvas you will have to assign a HDC e.g.

var
  WindowHandle:HWND;
  ScreenCanvas,BufferCanvas: TCanvas;
  r,r2: TRect;
  ScreenDC,BufferDC :HDC;
  BufferBitmap : HBITMAP;
begin
  WindowHandle := 0;
  ScreenCanvas := TCanvas.Create;
  BufferCanvas := TCanvas.Create;

  ScreenDC:=GetWindowDC(WindowHandle);
  ScreenCanvas.Handle := ScreenDC;

  BufferDC := CreateCompatibleDC(ScreenDC);
  BufferCanvas.Handle := BufferDC;
  BufferBitmap := CreateCompatibleBitmap(ScreenDC,
                     GetDeviceCaps(ScreenDC, HORZRES),
                     GetDeviceCaps(ScreenDC, VERTRES));
  SelectObject(BufferDC, BufferBitmap);

  try
    r := Rect(0, 0, 200, 200);
    BufferCanvas.CopyRect(r,ScreenCanvas,r);
    form1.Canvas.CopyRect(r, BufferCanvas, r);
  finally
    ReleaseDC(WindowHandle, ScreenCanvas.Handle);
    DeleteDC(BufferDC);
    DeleteObject(BufferBitmap);
    BufferCanvas.Free;
    ScreenCanvas.Free;
  end;
end;

Solution 2

It’s a time to toss my solution into the pot!

procedure TForm1.FormClick(Sender: TObject);
var
  ScreenCanvas: TCanvas;
begin
  ScreenCanvas := TCanvas.Create;
  try
    ScreenCanvas.Handle := GetWindowDC(GetDesktopWindow);
    Win32Check(ScreenCanvas.HandleAllocated);
    Canvas.CopyRect(Canvas.ClipRect, ScreenCanvas, ScreenCanvas.ClipRect);
  finally
    ReleaseDC(GetDesktopWindow, ScreenCanvas.Handle);
    ScreenCanvas.Free;
  end;
end;

Comments

  • I want to Draw a Screenshot from the entire screen to a TForm1 Canvas.

    This code works well in Delphi XE3

    procedure TForm1.Button1Click(Sender: TObject);
    var
      c,scr: TCanvas;
      r,r2: TRect;
    begin
    
      c := TCanvas.Create;
      scr := TCanvas.Create;
      c.Handle := GetWindowDC(GetDesktopWindow);
      try
    
        r := Rect(0, 0, 200, 200);
        form1.Canvas.CopyRect(r, c, r);
    
      finally
        ReleaseDC(0, c.Handle);
        c.Free;
      end;
    

    Now I want to copy the screenshot to another canvas first.
    Is there a way to do this without getting this error?

    procedure TForm1.Button1Click(Sender: TObject);
    var
      c,scr: TCanvas;
      r,r2: TRect;
    begin
    
      c := TCanvas.Create;
      scr := TCanvas.Create;
      c.Handle := GetWindowDC(GetDesktopWindow);
      try
    
        r := Rect(0, 0, 200, 200);
    
        scr.CopyRect(r,c,r); <-- Error, canvas does not allow drawing
        form1.Canvas.CopyRect(r, scr, r); <-- Error, canvas does not allow drawing
    
      finally
        ReleaseDC(0, c.Handle);
        c.Free;
      end;
    

  • Once you do that, scr is rather pointless. You may as well just draw directly to bmp.Canvas.

  • @RobKennedy I know it was an example, could have been another DC too.

  • This is very tangled and intricate example: you don’t that excess canvas at all, it is actually a unobvious clone of bmp’s MemDC.

Recents

Related

kessor

4 / 4 / 2

Регистрация: 27.10.2014

Сообщений: 90

1

15.02.2016, 13:09. Показов 9798. Ответов 6

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

после N запусков вот этой функции

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function GetGPixelColor(X, Y: Integer): BYTE;
var
 c: TCanvas;
Col: TColor;
begin
c := TCanvas.Create;
  try
    c.Handle := GetWindowDC(GetDesktopWindow);
    Col   := GetPixel(c.Handle, X, Y);
    Result := GetGValue(Col);
  finally
    c.Free;
  end;
end;

программа вылетает с ошибкой canvas does not allow drawing
как исправить?



0



Пишу на Delphi…иногда

1423 / 1278 / 286

Регистрация: 03.12.2012

Сообщений: 3,914

Записей в блоге: 5

15.02.2016, 13:25

2

Цитата
Сообщение от kessor
Посмотреть сообщение

как исправить?

GetWindowDC

After painting is complete, the ReleaseDC function must be called to release the device context. Not releasing the window device context has serious effects on painting requested by applications.



0



kessor

4 / 4 / 2

Регистрация: 27.10.2014

Сообщений: 90

15.02.2016, 14:06

 [ТС]

3

то есть просто добавить строчку

Pascal
1
ReleaseDC(GetDesktopWindow,GetWindowDC(GetDesktopWindow));

?



0



588 / 455 / 147

Регистрация: 09.12.2013

Сообщений: 2,385

Записей в блоге: 2

15.02.2016, 16:20

4

Зачем вообще TCanvas? Просто HDC возьмите. И да, освобождать надо.

Цитата
Сообщение от kessor
Посмотреть сообщение

canvas does not allow drawing

Это логически не может быть из-за показанного кода. Вы там ничего не рисуете. В другом месте наверное что-то делается.

Добавлено через 22 секунды
Почему все так любят GetDesktopWindow? Ноль там должен быть, ноль.



0



kessor

4 / 4 / 2

Регистрация: 27.10.2014

Сообщений: 90

15.02.2016, 17:27

 [ТС]

5

а так можно цвет пикселя получать?

Pascal
1
2
3
4
5
6
7
function GetGPixelColor(X, Y: Integer): BYTE;
var
Col: TColor;
begin
Col   := GetPixel(GetDC(0), X, Y);
Result := GetGValue(Col);
end;



0



BOGG ART

588 / 455 / 147

Регистрация: 09.12.2013

Сообщений: 2,385

Записей в блоге: 2

15.02.2016, 18:40

6

Лучший ответ Сообщение было отмечено kessor как решение

Решение

Я же говорю — возьмите переменную HDC, освобождайте.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function GetPixelColor(X, Y: Integer): TColor;
var DC: HDC;
begin
DC:=GetDC(0); // !!!
Result:=GetPixel(DC, X, Y);
ReleaseDC(0, DC); // !!!
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var Col: TColor;
begin
with Mouse.CursorPos do
      Col:=GetPixelColor(X, Y);
Color:=GetGValue(Col);
end;



1



4 / 4 / 2

Регистрация: 27.10.2014

Сообщений: 90

18.02.2016, 17:03

 [ТС]

7

после ~100 итераций начинает выдавать всегда одно и то же значение(для G — 255)
помогает перезапуск проги
как исправить?



0



Возможно, вам также будет интересно:

  • Ошибка cants find project or library
  • Ошибка cant open config file
  • Ошибка cant load library engine dll
  • Ошибка cant free space on motion search disk
  • Ошибка cant find world of tanks

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии