كيف يمكنني النقر فوق زر في نموذج vb6؟

StackOverflow https://stackoverflow.com/questions/41089

  •  09-06-2019
  •  | 
  •  

سؤال

لدي نموذج vb6 مع عنصر تحكم ocx عليه.يحتوي عنصر التحكم ocx على زر أريد الضغط عليه من الكود.كيف أقوم بهذا العمل؟

أملك:

Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
SendMessage ocx.hwnd, WM_COMMAND, GetWindowLong(b.hwnd, GWL_ID), b.hwnd

ولكن لا يبدو أن العمل.

هل كانت مفيدة؟

المحلول

أعتقد أن ما يلي سيعمل:

Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
b = True

CommandButtonفي الواقع لها وظيفتان.أحدهما هو زر النقر المعتاد والآخر هو زر تبديل يعمل بشكل مشابه لـ CheckBox.الخاصية الافتراضية لل CommandButton هو في الواقع Value الخاصية التي تشير إلى ما إذا كان الزر قد تم تبديله أم لا.من خلال تحديد الخاصية، Click يتم إنشاء الحدث.يتم ذلك حتى لو لم يتم تصميم الزر على أنه ToggleButton وبالتالي لا يغير حالته.

نصائح أخرى

إذا كان لديك حق الوصول إلى رمز OCX، فيمكنك الكشف عن معالج الأحداث المرتبط واستدعائه مباشرة.
لا أعرف ما إذا كان ما يعادل طريقة Click() الخاصة بـ .Net Button موجودًا منذ أيام VB6

بالنسبة للضغط على المفاتيح، يمكنك أيضًا استخدام إرسال رسالة لإرسال كل من مفتاح التشغيل والمفتاح:

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
Const WM_KEYDOWN As Integer = &H100
Const WM_KEYUP As Integer = &H101
Const VK_SPACE = &H20

Private Sub cmdCommand1_Click()
    Dim b As CommandButton
    Set b = ocx.GetButton("btnPrint")
    SendMessage b.hWnd, WM_KEYDOWN, VK_SPACE, 0&
    SendMessage b.hWnd, WM_KEYUP, VK_SPACE, 0&
End Sub

هذا:

Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
b = True

تعمل.غير بديهية تماما.أتوقع أن يلقي خطأً نظرًا لأن المنطقي ليس CommandButton صالحًا، ولكن ذلك بسبب الخاصية الافتراضية.

WM_LBUTTONDOWN ستكون نقرة بالماوس، ما أريده هو نقرة زر (زر كما في زر hwnd، وليس زر الماوس).

لا يمكنني الوصول إلى مصدر ocx (إنه عنصر تحكم تابع لجهة خارجية).إذا فعلت ذلك، فسأكشف عن الوظيفة التي أردت الاتصال بها (كان من المفترض أن يكشفها الكاتب الأصلي لـ ocx).

هل يمكنك الوصول إلى رمز OCX؟لا ينبغي عليك حقًا استدعاء نقرة زر واحدة مباشرةً.يجب عليك إعادة بناء الكود بحيث يستدعي رمز النقر على زر OCX وظيفة، على سبيل المثال.

CMyWindow::OnLButtonDown()
{
  this->FooBar();
}

ثم من تطبيق VB6 الخاص بك، اتصل مباشرة بأسلوب FooBar.إذا لم تتمكن من استدعاء الوظائف مباشرة من VB6، فيمكنك تغليف طريقة FooBar() بوظيفة proc message في Windows، على سبيل المثال.

#define WM_FOOBAR WM_APP + 1

ثم استخدام SendMessage في VB6، مثل SendMessage(WM_FOOBAR, ...)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top