Định vị con trỏ chờ trên một nút bên trong hộp nhóm

lập trình


Sử dụng VB 2008 Express.
Tôi có biểu mẫu Chính có một số Hộp Nhóm.

Như mong muốn, tôi có thể định vị thành công Con trỏ chờ trên một điều khiển trên Biểu mẫu chính KHÔNG nằm trong hộp nhóm bằng cách sử dụng các dòng mã sau: (giả sử Nút1 KHÔNG nằm trong Hộp nhóm)

Cursor.Position = PointToScreen(Button1.Location)
Con trỏ = Con trỏ.WaitCursor
Ứng dụng.DoEvents()

Tuy nhiên, nếu Nút1 được định vị trong Hộp Nhóm (ví dụ: GroupBox1), tôi chưa tìm ra cách đưa con trỏ qua nút đó. Thay vào đó, nó được đặt ở một số vị trí khác trên Biểu mẫu chính không nằm trong GroupBox1.

Tôi đã thử các biến thể sau nhưng không thành công:

Cursor.Position = PointToScreen(Button1.Location) và
Cursor.Position = PointToScreen(GroupBox1.Button1.Location)

Không có lỗi nào được tạo ra nhưng không thu được kết quả mong muốn.
Tôi tin rằng nó có liên quan đến thực tế là thuộc tính vị trí của nút trong hộp nhóm có liên quan đến góc trên bên trái của hộp nhóm. Nhưng VB đặt con trỏ như thể thuộc tính vị trí của nút có liên quan đến góc trên bên trái của Biểu mẫu chính.
Sẽ đánh giá cao sự hướng dẫn – Cảm ơn, Mike

Những gì tôi đã thử:

Cursor.Position = PointToScreen(Button1.Location), and
Cursor.Position = PointToScreen(GroupBox1.Button1.Location)

Giải pháp 1

Vị trí của điều khiển luôn tương đối với vùng chứa của nó: nếu bạn có GroupBox trên Biểu mẫu và GroupBox chứa Nút thì myGroupBox.Location sẽ tương đối với góc trên cùng bên trái của myForm.ClientRectangle và myButton.Location là tương đối ở góc trên cùng bên trái của myGroupBox.ClientRectangle.

Vì vậy, để xác định Vị trí của myButton so với myForm, bạn cần thêm myButton.Location vào myGroupBox.Location – kết quả liên quan đến góc trên cùng bên trái của Form.ClientArea. Sau đó, bạn có thể sử dụng PointToScreen để xác định vị trí của nó so với góc trên cùng bên trái của màn hình thực tế.

Có lý?

Giải pháp 3

Cảm ơn OriginalGriff và Ralf Meier…

Hướng dẫn của họ đã dẫn tôi đến giải pháp được dán bên dưới.
Nhưng trước tiên, tôi cần làm rõ kịch bản được đăng ban đầu của mình. Có vẻ như dòng mã dưới đây SẼ hoạt động nếu không có biểu mẫu nào khác được mở trong quá trình này, chẳng hạn như cửa sổ Filedialog chẳng hạn.

Cursor.Position = PointToScreen(Button1.Location)

Nhưng nếu một biểu mẫu khác sẽ được mở trong quá trình này, ngay cả khi nó ở trước câu lệnh Cursor.Position, thì vị trí con trỏ không được định vị đúng với vị trí nút1 trong hộp nhóm.
Có thể có một cách đơn giản hơn để đưa hướng trở lại từ cửa sổ đã mở để dòng mã đó hoạt động, nhưng tôi chưa tìm thấy.

Kết quả là tôi đã tìm ra giải pháp sau (Lưu ý: Tôi là người có sở thích nên có thể có cách viết mã này chính xác hơn):

Trong Tuyên bố Lớp, phần sau đây đã được thêm vào:

Dim WaitCurPt As New Point(0, 0)

Trong mã mà tôi muốn đặt vị trí con trỏ, phần bên dưới đã được thêm vào trong đó tên thực của Hộp nhóm và Nút mong muốn được sử dụng (không có bất kỳ trích dẫn nào xung quanh Tên của chúng):

Call WaitCursorPoint(GroupBox1, Button1)
Cursor.Position = PointToScreen(WaitCurPt)
Cursor = Cursors.WaitCursor
Application.DoEvents()

Cuối cùng, chương trình con sau đã được thêm vào:

Private Sub WaitCursorPoint(ByVal grp As Object, ByVal Obj As Button)
    Dim x, y As Integer
    x = grp.Location.X
    y = grp.Location.Y
    x = x + Obj.Location.X
    y = y + Obj.Location.Y
    x = x + Obj.Size.Width / 2
    y = y + Obj.Size.Height / 2
    WaitCurPt.X = x
    WaitCurPt.Y = y
End Sub

Giải pháp 2

tay cầm nguyên bản,
Điều đó hoàn toàn hợp lý và phù hợp với những gì tôi nghĩ có thể xảy ra.

Tuy nhiên, tôi không quen với cách thực hiện điều đó bằng mã.
Bạn có thể cho tôi một ví dụ?
Cảm ơn.

コメント

タイトルとURLをコピーしました