void __fastcall TForm1::FormPaint(TObject *Sender)
{
Form1->Canvas->Rectangle(TRect(0,0,100,100));
ShowMessage("OnPaint");
}
//------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form1->Refresh();
}
OnMouseDown и Refresh
на канве формы нарисовано несколько точек. каждой точке соответствует параметр, который может быть либо 0, либо 1. в событии OnMouseDown я проверяю, какую кнопку нажал пользователь и где (над точкой или нет), после чего в случае необходимости изменяю параметр. далее нужно перерисовать канву. почему не работает Refresh в конце события OnMouseDown?
если мой склероз мне не изменяет этот метод всего лишь сбрасывает установки Canvas в значения по умолчанию , т.е. цвет кисти , пера и т.д
и что либо рисовать он вообще то не должен
нет, Refresh это который Form->Refresh. и тогда вроде бы канва должна перерисоваться, то есть выполнить опять событие OnPaint.. или я ошибаюсь?
или ты думаешь что он должен автоматом вызываться ?
нацарапал вот
Код:
при нажатии на кнопку все прекрасно работает
этот код и у меня прекрасно работает.. а вот в событии OnMouseDown почему-то канва не рефрешится...
пости код , а то мы тут гадать будем до морковкина заговенья
А вообще не советую прямо на форме рисовать. Лутше на TGraphic (если правильно написал название)
вот пожалуста:
Код:
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
// что хочешь здесь делай, последующий рефреш не срабатывает
Form1->Refresh();
}
TShiftState Shift, int X, int Y)
{
// что хочешь здесь делай, последующий рефреш не срабатывает
Form1->Refresh();
}
повторюсь - всё, что прописано в OnMouseDown работает, не срабатывает только рефреш. если окно программы после нажатия кнопки мыши перекрыть другим приложением? а потом вернуться, то окно будет перерисовано правильно.
С тем что ты привёл всё работает.
Код:
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if (nrez) // если загружены данные
{
w = Form1->Width - 110;
Form = Form1;
chto_nagali_mouse = Button;
X0 = X;
Y0 = Y;
Videlenie_AddMenu(); // функция, которая проверяет, какая кнопка нажалась и где
Form1->Refresh();
}
}
TShiftState Shift, int X, int Y)
{
if (nrez) // если загружены данные
{
w = Form1->Width - 110;
Form = Form1;
chto_nagali_mouse = Button;
X0 = X;
Y0 = Y;
Videlenie_AddMenu(); // функция, которая проверяет, какая кнопка нажалась и где
Form1->Refresh();
}
}
функция выглядит примерно следующим образом:
Код:
for (int k10 = 0; k10 < nrez; k10++) // проверка для всех точек
{
if ((l + int(gorizotr + 10*gorizotr*(wgs84_y[k10]-wgs84_min_y)/(wgs84_max_y-wgs84_min_y)) - razm_to4ki < X0) && (X0 < l + int(gorizotr + 10*gorizotr*(wgs84_y[k10]-wgs84_min_y)/(wgs84_max_y-wgs84_min_y)) + razm_to4ki) && (b - int(vertotr + 10*vertotr*(wgs84_x[k10]-wgs84_min_x)/(wgs84_max_x-wgs84_min_x)) - razm_to4ki < Y0) && (Y0 < b - int(vertotr + 10*vertotr*(wgs84_x[k10]-wgs84_min_x)/(wgs84_max_x-wgs84_min_x)) + razm_to4ki)) // если кнопку нажали над точкой
{
if (chto_nagali_mouse == mbLeft)
{
if (videlenie[k10] == 0) videlenie[k10] = 1;
else videlenie[k10] = 0;
}
}
}
{
if ((l + int(gorizotr + 10*gorizotr*(wgs84_y[k10]-wgs84_min_y)/(wgs84_max_y-wgs84_min_y)) - razm_to4ki < X0) && (X0 < l + int(gorizotr + 10*gorizotr*(wgs84_y[k10]-wgs84_min_y)/(wgs84_max_y-wgs84_min_y)) + razm_to4ki) && (b - int(vertotr + 10*vertotr*(wgs84_x[k10]-wgs84_min_x)/(wgs84_max_x-wgs84_min_x)) - razm_to4ki < Y0) && (Y0 < b - int(vertotr + 10*vertotr*(wgs84_x[k10]-wgs84_min_x)/(wgs84_max_x-wgs84_min_x)) + razm_to4ki)) // если кнопку нажали над точкой
{
if (chto_nagali_mouse == mbLeft)
{
if (videlenie[k10] == 0) videlenie[k10] = 1;
else videlenie[k10] = 0;
}
}
}
ну и OnPaint:
Код:
for (int k5 = 0; k5 < nrez; k5++)
{
Form->Canvas->Pen->Color = clBlack;
if (videlenie[k5] == 1) Form->Canvas->Pen->Color = clRed;
Form->Canvas->Brush->Color = Form->Canvas->Pen->Color;
Form->Canvas->Ellipse(l + gorizotr - razm_to4ki, b - vertotr - 10*vertotr*(wgs84_x[k3]-wgs84_min_x)/(wgs84_max_x-wgs84_min_x) - razm_to4ki, l + gorizotr + razm_to4ki, b - vertotr - 10*vertotr*(wgs84_x[k3]-wgs84_min_x)/(wgs84_max_x-wgs84_min_x) + razm_to4ki);
}
{
Form->Canvas->Pen->Color = clBlack;
if (videlenie[k5] == 1) Form->Canvas->Pen->Color = clRed;
Form->Canvas->Brush->Color = Form->Canvas->Pen->Color;
Form->Canvas->Ellipse(l + gorizotr - razm_to4ki, b - vertotr - 10*vertotr*(wgs84_x[k3]-wgs84_min_x)/(wgs84_max_x-wgs84_min_x) - razm_to4ki, l + gorizotr + razm_to4ki, b - vertotr - 10*vertotr*(wgs84_x[k3]-wgs84_min_x)/(wgs84_max_x-wgs84_min_x) + razm_to4ki);
}
У тебя ошибка гдето в функции Videlenie_AddMenu(); скорее всего в задании цикла трабла, попробуй посмотри состояние nrez перед вызовом функции. У мну эт единственный вариант проблемы.
nrez по-любому имеет какое-то значение. да и функция Videlenie_AddMenu() работает (проблема в том, что не удается поглядеть результат ее работы), её программа выполняет и даже выходит из неё (я создавал файл после неё и до рефреша - файл создавался).
то есть именно не-рефрешится! блин, что за фигня!.. у меня даж никаких соображений нету, почему так..
Приведи полный листинг!
во-первых, мне это не очень можно делать, поскольку программа всё-таки коммерческая..
во-вторых, это очень-очень много!
в-третьих, проблемную ситуацию я обрисовал вроде достаточно (рисуем-нажали-перерисовываем) - код каждой операции я привёл.
повторю, что всё-всё работает - я тыщу раз проверил (картинка рисуется, параметр при нажатии изменяется какой надо), именно не выполняется refresh!
kot_, неужели я у тебя попал в игнор?:(
Тогда переустанавливай драйвер hands.sys, потомучто то, что ты привёл всё работает. Для отладки попробуй поставь функции ShowMessage("Bla"); непосредственно перед Form->Refresh(); и в начало и конец OnPaint и посматри где оно тебе покажет месеж, а где нет.
BCB я недавно переустанавливал, но эффекта никакого..
а hands.sys я вообще не смог найти.. он кто и откуда? и как его переустановить?