c # gdi + не удалось нарисовать линии - PullRequest
0 голосов
/ 06 ноября 2018

Итак, я пытаюсь создать умный перекрестий, управляемый Win 10 для распознавания голоса в игре. Форма 1 используется для включения и выключения распознавания голоса. Если оно слышит мое изречение «медленно», оно нарисует линию на другой прозрачной наложенной форме

 public partial class Form1 : Form
    {
        formoverlay overlayform = new formoverlay();
        SpeechRecognitionEngine dasSpeechEngine = new SpeechRecognitionEngine(); 
        public Form1()
        {

            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            dasSpeechEngine.RecognizeAsync(RecognizeMode.Multiple);
            btnDisable.Enabled = true;
        }

        private void Form1_Load(object sender, EventArgs e)//load event
        {
            Choices commands = new Choices();
            commands.Add(new string[] { "slow", "medium", "fast","ultra","x"});
            GrammarBuilder gbuilder = new GrammarBuilder();
            gbuilder.Append(commands);
            Grammar thegrammar = new Grammar(gbuilder);

            dasSpeechEngine.LoadGrammarAsync(thegrammar);
            dasSpeechEngine.SetInputToDefaultAudioDevice();
            dasSpeechEngine.SpeechRecognized += dasSpeechEngine_SpeechRecognized;
            overlayform.timestart = DateTime.Now.Second;
            //MessageBox.Show(overlayform.timestart.ToString());   



            //for (si=1,si)
        }
        private void dasSpeechEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {

            switch (e.Result.Text)
            {
                case "slow":
                    if (ModifierKeys.HasFlag(Keys.Control))//prevent accidentally sight change
                    {
                        //clear current canvas
                        //draw all the lines that has true bool flag
                        //draw all the marks
                        overlayform.theclearform();

                        overlayform.paintHorline(15, slowAimSet.lineStartY,slowAimSet.lineEndY,1);
                        break;
                    }
                    break;
            }
        }
    }

На оверлейной форме код (не включая частичное объявление класса):

Graphics g;
Pen myPen = new Pen(Color.Green);
Pen smallPen = new Pen(Color.GreenYellow);
public formoverlay()
{
    InitializeComponent();
}
private void formoverlay_Load(object sender, EventArgs e)
{
    this.BackColor = Color.Wheat;
    this.TransparencyKey = Color.Wheat;
    this.TopMost = true;
    this.FormBorderStyle = FormBorderStyle.None;

    int initialStyle = GetWindowLong (this.Handle, -20);
    SetWindowLong(this.Handle, -20, initialStyle | 0x80000 | 0x20);
    //enable click through


    //get wows window size;
    GetWindowRect(handle, out rect);

    this.Size = new Size(rect.right - rect.left, rect.bottom - rect.top);
    this.Top = rect.top;
    this.Left = rect.left;
    smallPen.Width = 2.0f;



}

public void paintHorline(int theTgtSpd,int tStartY, int tEndY, int thisRngMarkerDir)
{

    int rngMarkerOffset = 10;
    //aimlineForSpeed[] thisAimLine = new aimlineForSpeed [4];
    //g.DrawLine(myPen, 500,500, 600, 600);
   g.DrawLine(myPen, 0,tStartY, 1920, tEndY);   
}

public void theclearform()//everytime user say, re-draw everything
{
    Invalidate();
}   

Когда я запускаю программу, когда я говорю «медленно», появляется ошибка введите описание изображения здесь говорят системный аргумент исключение: {"Параметр недействителен."} Это не имеет никакого значения, если я пишу постоянные значения в моих вызовах отрисовки, например, g.DrawRectangle (myPen, 100, 100, 200,200);

Судя по всему, программа вызывает функцию "painthorline", но она рисует неправильно. Если я создам новую графику в методе painthorline, она не вызовет этой ошибки, но она вообще ничего не рисует ..

Где я ошибся? Нужно ли было создавать отдельное событие, чтобы заставить работать вызов drawline / drawrectangle?

...