Форум: "WinAPI";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];
ВнизКорректное пересоздание Pen Найти похожие ветки
← →
Comp © (2007-02-25 11:19) [0]Всем привет!
Вот собственно проблема. Создаю Pen - все нормально.
Но мне нужно его изменить при необходимости. Как я понял-это делается удалением старого и установкой нового.
Делаю так:
procedure TDrawBox.SetPen(PH: HPEN);
begin
if PH<>0 then DeleteObject(PH);
PH:=CreatePen(FPenStyle,FPenWidth,FPenColor);
SelectObject(FBitMapDC,PH);
end;
этот метод вызываю каждый раз, когда необходимо.
Все хорошо, но до поры до времени. Потом приложение начинает глючить - цвет карандаша меняется сам, окно не прорисовывается, особенно NC область.
Что не так?
Зараннее спасибо!
← →
Comp © (2007-02-25 11:30) [1]Еще...
FPenStyle, FPenWidth, FPenColor - всегда не пустые - по любому имеют значения в любое время.
FBitMapDC - контекст буфера прорисовки.
Все перекопал, методом исключения пришел к такому выводу, что что-то с этим методом не так.
Я не думаю (точнее надеюсь), что нужно еще каждый раз освобождать контекст буфера.
← →
Comp © (2007-02-28 20:32) [2]Мастеров нету.
Чтож, пока дождешься ответа - и сам найдешь причину.
Испортился сайт. раньше года 3 назад - тут настоящая школа была. А сейчас... Или Делфи всем надоела или просто сайт пора закрывать...
← →
TRUNK © (2007-02-28 20:42) [3]
> procedure TDrawBox.SetPen(PH: HPEN);
А хэндл какого пэна передаётся в параметре?
← →
Ricks © (2007-03-01 16:51) [4]Попробуй так:
procedure TDrawBox.SetPen(var PH: HPEN);
begin
if PH<>0 then DeleteObject(PH);
PH:=CreatePen(FPenStyle,FPenWidth,FPenColor);
SelectObject(FBitMapDC,PH);
end;
← →
clickmaker © (2007-03-02 10:13) [5]
> Или Делфи всем надоела
а какая связь между дельфи и windows API?
← →
Rouse_ © (2007-03-02 14:18) [6]> Что не так?
Не так то, что SelectObject суть является функцией и возвращает тебе хэнл объекта, который был ассоциирован с DC ранее, до загрузки нового объекта (в твоем случае Pen). Перед удалением этого нового объекта (Реn) ты должен вернуть обратно старый через тот-же SelectObject()
т.е. примерно так..PH := CreatePen(FPenStyle,FPenWidth,FPenColor);
OldDC := SelectObject(BitmapDC, Bitmap);
///... тут работаем
SelectObject(OldDC, Bitmap);
DeleteObject(PH);
← →
Rouse_ © (2007-03-02 14:21) [7]Bitmap = PH в твоем случае :) Выдрал из своего кода просто и не поправил...
← →
Comp © (2007-03-10 21:29) [8]Rouse_ ©
Спасибо.
Действительно, старый Pen нужно вернуть на место.
Или пусть всегда будет текущий, который устанавливаем SetPen, а при следующем вызове-сначала удаляем старый, а затем ставим новый.
← →
Comp © (2007-03-10 21:30) [9]clickmaker © (02.03.07 10:13) [5]
> Или Делфи всем надоела
а какая связь между дельфи и windows API?
если бы не было связи, этого форума не существовало бы, правда?
Я тебя понимаю-на API можно программировать и другими средствами, как говорят в математике, отличными от Delphi. Я хотнл сказать, что уже меньше народу заходит на сайт. Раньше можно было уходить с сайта уже довольным, что понял...получил ответ., совет хороший и все такое. Сейчас надо зайти только через день, или в течении недели-может что-то и скажут.
Просто сейчас уже меньше народу хочет изучать Delphi-вследствие заполнения рынка всякими навязанными 1С. Обленились люди. Не хотят ломать голову над программированием, хотят чтоб все было легко.
Но эти люди не понимают, что Паскаль (-> Delphi) всегда был и остается языком высокого уровня, т.е. профессиональным языком.
← →
Comp © (2007-03-10 21:50) [10]Даи С++ многим по душе.
На вкус и цвет товарищей нет.
А нам Pascal по душе. и хоть убей, не оторвешь.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.042 c