У меня есть этот код, где я нажимаю управление + м:Как создать экземпляр для нового из рабочего процесса фонового рабочего?
void gkh_KeyDown(object sender, KeyEventArgs e)
{
if ((e.KeyCode == System.Windows.Forms.Keys.LControlKey) || (e.KeyCode == System.Windows.Forms.Keys.RControlKey))
{
controlDown = true;
}
if (e.KeyCode == System.Windows.Forms.Keys.M && controlDown)
{
backgroundWorker1.RunWorkerAsync();
Тогда BackgroundWorker работают событие:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
if (mf1 == null)
{
mf1 = new MagnifierForm(mConfiguration, System.Windows.Forms.Cursor.Position);
mf1.Show();
}
}
Я использовал контрольную точку и ее получение в конструктор MagnifierForm и делать все, но когда я нажимаю кнопку «Продолжить», я никогда не вижу эту форму MagnifierForm. Зачем ?
EDIT **
Причина я хотел использовать BackgroundWorker, чтобы показать новую форму, что в основной форме, где я показать новую форму У меня есть событие тиков таймера и по какой-то причине этот таймер, когда его ход только когда его запуск заставляет новую форму отображаться в другом месте от курсора мыши, и форма перемещается/сдвигается туда, где находится курсор мыши. Когда таймер не работает, проблем нет. Я показываю новую форму и показываю ее точно там, где находится указатель мыши.
Я не знаю, почему это событие таймера создает проблему, и таймер не связан ни с чем новой формой, которую я хочу показать.
Это событие таймера я имею в основной форме:
private void timer2_Tick(object sender, EventArgs e)
{
label1.Visible = true;
if (counter == 200)
{
timer2.Enabled = false;//counter = 0;
return;
}
counter += 1;
distance = (float)counter;
CloudEnteringAlert.cloudalert(bitmapwithclouds, distance);
pictureBox1.Invalidate();
Теперь я обнаружил, что если я удалить для теста линии:
CloudEnteringAlert.cloudalert(bitmapwithclouds, distance);
И таймер работает там без проблем. Новая форма показывает точно, где находится курсор мыши. Это метод cloudalert, что делает эту проблему и я не знаю, почему:
public static List<PointF> cloudalert(Bitmap bmp, float kilometers)
{
AddDistanceToPoints = new List<PointF>();
Color c1 = Color.White;
Color c2 = Color.FromArgb(c1.A,
(int)(c1.R * 1), (int)(c1.G * 1), (int)(c1.B * 1));
Load();
float distance = kilometers/(float)1.09;
clouds = new List<PointF>();
clouds1 = new List<PointF>();
file = Path.GetDirectoryName(Application.LocalUserAppDataPath) + "\\Data" + "\\Data.txt";
OptionsFile setting_file = new OptionsFile(file);
LoadPoints_X = setting_file.GetListFloatKey("Points Coordinates X");
LoadPoints_Y = setting_file.GetListFloatKey("Points Coordinates Y");
for (int i = 0; i < PointsFloat.Count; i++)
{
//clouds1.Add(new PointF(LoadPoints_X[i] - distance, LoadPoints_Y[i]));
AddDistanceToPoints.Add(new PointF(PointsFloat[i].X - distance, PointsFloat[i].Y));
}
bmp = FastComparison(bmp, Properties.Resources.clean_radar_image);
newbitmap = bmp;
for (int x = 0; x < AddDistanceToPoints.Count; x++)//clouds1.Count; x++)
{
if (AddDistanceToPoints[x].X > 0)//clouds1[x].X > 0)
{
//Color color = bmp.GetPixel((int)clouds1[x].X, (int)clouds1[x].Y);
Color color = bmp.GetPixel((int)AddDistanceToPoints[x].X, (int)AddDistanceToPoints[x].Y);
int dR = (int)color.R;
int dG = (int)color.G;
int dB = (int)color.B;
if (dR == 0 && dG == 0 && dB == 0)
{
}
else
{
//clouds.Add(new PointF(clouds1[x].X, clouds1[x].Y));
clouds.Add(new PointF(AddDistanceToPoints[x].X, AddDistanceToPoints[x].Y));
//newbitmap.SetPixel((int)clouds1[x].X, (int)clouds1[x].Y, Color.White);
newbitmap.SetPixel((int)AddDistanceToPoints[x].X, (int)AddDistanceToPoints[x].Y, Color.White);
}
}
}
//newbitmap.Save(@"d:\test\newbitmap.jpg");
if (clouds.Count == 0)
{
cloudsfound = false;
cloudsdistance.Text = distance.ToString();
//clouds = null;
return clouds
;
}
else
{
cloudsfound = true;
for (int i = 0; i < clouds.Count; i++)
{
pointtocolor.Add(clouds[i]);
cloudsdistance.Text = distance.ToString();
}
}
return clouds;
}
И в основной форме им показывает новую форму по нажатию кнопки, например:
private void button1_Click(object sender, EventArgs e)
{
if (mf1 == null)
{
mf1 = new MagnifierForm(mConfiguration, System.Windows.Forms.Cursor.Position);
mf1.Show();
}
}
Тогда почему этот таймер tick или более, почему этот метод cloudalert делает отображение mf1 в другом месте на секунду, а затем на слайде формы или перемещении туда, где находится указатель мыши. Но когда этот метод я удаляю или останавливаю таймер и показываю новую форму, поэтому нет никаких проблем, когда форма отображается прямо там, где находится курсор мыши.
И новая форма, я показываю ее в любом месте на экране, я не показываю ее только по основной форме, я показываю ее где-нибудь курсор mosue. Мышь может быть на панели задач или на 0,0 экрана или в любом месте, а затем я нажимаю кнопку1 или у меня есть глобальные ключи, поэтому я делаю Ctrl + M
И когда таймер работает с этим методом cloudalert, форма отображается в другом месте, а затем перемещает слайд туда, где находится курсор мыши.
Вы можете получить новые форму им пытается показать, что это увеличительное стекло здесь:
http://www.codeproject.com/Articles/18235/Simple-Magnifier
Что им пытаются сделать это не с помощью этого меню лупы он есть, но с помощью моего события нажатия кнопки или клавиши ctrl + m, чтобы отобразить форму лупы. Но у меня есть эта проблема.
Если im использует это меню лупы и таймер работает с методом, проблем нет.
Странное отклонение, где проблема с моим таймером2/метод cloudalert.
Что еще вы делаете в мероприятии DoWork? Если вы просто создаете новую форму, не беспокойтесь использовать «BackgroundWorker». Просто сделайте это на основном потоке пользовательского интерфейса. [Похожие сообщения.] (Http://stackoverflow.com/questions/2073076/c-sharp-winforms-possible-to-construct-form-on-background-thread-then-display) –
Вызов Show() из bgw нить должна бросать исключение ... В режиме отладки, по крайней мере. –
Причина, по которой я хотел использовать фонового работника и показать форму, что если я покажу форму в коде формы ui, у меня есть таймер там, где мне нужно запустить его, и этот таймер сделает новую форму для показа на определенном точку/местоположение на экране, а затем переместите/сдвиньте туда, где находится курсор мыши. Я не понимаю, почему. Я не знаю, почему таймер заставляет это случиться. Но теперь, когда я использовал фонового рабочего, даже если таймер работает, новая форма показывает, где находится курсор мыши. Но вы сказали мне не использовать этот ui в фоновом режиме. Так как же я могу сделать что-то подобное? – user3200169