سؤال
لدي نموذج 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, ...)