//CREATE OBJECT TO ALLOW USER TO CANCEL ITrackCancel trackCancel = new CancelTrackerClass(); trackCancel.CancelOnClick = true; trackCancel.CancelOnKeyPress = true; //CREATE A PROGRESS DIALOG IProgressDialogFactory progDialogFact = new ProgressDialogFactoryClass(); IStepProgressor stepProg = progDialogFact.Create(trackCancel, Handle.ToInt32()); IProgressDialog2 progDialog = (IProgressDialog2)stepProg; progDialog.CancelEnabled = true; progDialog.Description = "Querying database..."; progDialog.Title = "Progress Dialog Title Here"; progDialog.Animation = esriProgressAnimationTypes.esriProgressGlobe; stepProg.Message = "Click below to Cancel..."; stepProg.Hide();
progDialog.HideDialog();
I have found the IMouseCursor to behave strangely so tend to avoid it. I think each time your code calls external methods then you need to call .SetCursor() again.
Have you looked into using IProgressDialog? You can use it with a step progressor bar if you know how many iterations the process will take. If you don't know then hide the step progressor as shown below://CREATE OBJECT TO ALLOW USER TO CANCEL ITrackCancel trackCancel = new CancelTrackerClass(); trackCancel.CancelOnClick = true; trackCancel.CancelOnKeyPress = true; //CREATE A PROGRESS DIALOG IProgressDialogFactory progDialogFact = new ProgressDialogFactoryClass(); IStepProgressor stepProg = progDialogFact.Create(trackCancel, Handle.ToInt32()); IProgressDialog2 progDialog = (IProgressDialog2)stepProg; progDialog.CancelEnabled = true; progDialog.Description = "Querying database..."; progDialog.Title = "Progress Dialog Title Here"; progDialog.Animation = esriProgressAnimationTypes.esriProgressGlobe; stepProg.Message = "Click below to Cancel..."; stepProg.Hide();
Don't forget to close the dialog in your Finally block:progDialog.HideDialog();
This progess dialog will not be embeded in your form but pop up in front. However, I have found it to be the most reliable way to show the user that lengthy background processes are occuring. For shorter processes where a WinForm remains open you may just want to set the Windows cursor to a wait one.
Windows.Forms.Cursor.Current = Windows.Forms.Cursors.WaitCursor
'form initialization subroutine
            StatusStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {toolStripStatusLabel1})
            StatusStrip1.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.HorizontalStackWithOverflow
            StatusStrip1.Location = New System.Drawing.Point(0, 0)
            StatusStrip1.Name = "statusStrip1"
            StatusStrip1.ShowItemToolTips = True
            StatusStrip1.Size = New System.Drawing.Size(292, 22)
            StatusStrip1.Text = "statusStrip1"
            toolStripStatusLabel1.Name = "toolStripStatusLabel1"
            toolStripStatusLabel1.Size = New System.Drawing.Size(109, 17)
            toolStripStatusLabel1.Text = "toolStripStatusLabel1"
            StatusStrip1.Visible = False
'processing code
        Try
            StatusStrip1.Visible = True
            toolStripStatusLabel1.Text = "Starting"
            StatusStrip1.Refresh()
            'more code
            toolStripStatusLabel1.Text = "Processing layer " & pLayer.Name
            StatusStrip1.Refresh()
            'more code
        Catch ex As Exception
            System.Windows.Forms.MessageBox.Show(ex.ToString, "Run")
        Finally
              StatusStrip1.Visible = False 'Make it invisible when finished or in case the process crashes early
        End Try