كيفية تغيير موقف Caret في MSHTML أثناء النقر على الماوس؟

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

  •  21-09-2019
  •  | 
  •  

سؤال

لديّ عنصر تحكم قائم على MSHTML مضمن في التطبيق و قابلة للاستمتاع يستخدم الوضع لتحرير المستندات بداخله. يحتوي جسم وثيقة HTML في البداية على الأسطر التالية:

<div></div>
<div id="signature"></div>

يتم وضع الكاريت في بداية المستند ، وهو داخل عنصر Div الأول. الآن عندما ينقر المستخدم مع الماوس داخل عنصر التحكم في مكان أسفل السطر الأخير ، يتم نقل الكاريت إلى عنصر DIV الثاني ، لأنه الأقرب إلى النقطة التي نقر فيها المستخدم.

أريد نقل المؤشر إلى نهاية Div الأولى على النقر بالماوس. الآن لدي الرمز لحساب الموضع المقصود للسيارة كما IMarkupPointer و IDisplayPointer. ما أحتاج إلى معرفته هو مكان اعتراض خط أنابيب حدث MSHTML للقيام بحركة Caret الفعلية.

لقد كتبت رمزًا ينفذ IHTMLEditDesigner ويحرك القطرات باستخدام IHTMLCaret.MoveCaretToPointer إلى الموقف المقصود. تكمن المشكلة في أنه بغض النظر عن المكان الذي أتعرض فيه للحدث (prehandleevent ، posthandleevent أو posterItOreventNotify) ، يتم إعادة وضع Caret في النهاية إلى الحدث الافتراضي بنقرة واحدة (ولكن لا يتم إرجاعه إذا قمت بالضغط على زر الماوس الأيسر لفترة من الوقت أو إذا أنا نقر مع زر الماوس الأيمن).

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

المحلول

استخدم JScript داخل HTML التي تقوم بتحميلها في عنصر تحكم IE. إذا كنت لا تعرف HTML و JScript ممتاز ستجد هذه المهمة جدا مؤلم.

شاهد هذه الأسئلة لتجربتي عندما حاولت القيام بذلك شيئًا كهذا.

واجهت أيضًا الكثير من المشكلات الأخرى ، بما في ذلك يجب أن أكتب تغيير حجم المنطق في JScript للحصول على محرر HTML إلى حجم مع نموذج winform واضطرار إلى تمرير ألوان النموذج/coontrol الافتراضي في محرر HTML بحيث بدا أن الكتابة ثم تغيير المستخدمين مخططات الألوان على Windows.

من الأفضل أن تجد محرر HTML وتحميله في عنصر تحكم IE ، فلا يزال يتعين عليك الترميز بألوان النوافذ القياسية وما إلى ذلك.

هناك أيضًا محرّرات HTML من الطرف الثالث الذي يمكنك استخدامه. إذا كان ذلك ممكنًا ، أعتقد أنه يجب عليك الشراء في حل لأن قابلاً للضمن أصعب بكثير في الحياة الحقيقية ، فهو يبدو.

وجدت Google سريعة.

نصائح أخرى

هل حاولت استخدام مؤقت WinForms مع مهلة 0؟

  • عندما تحصل على حدث Mouse Down ، ابدأ المؤقت.
  • ثم سيقوم التحكم MSHTML بمعالجة الحدث
  • ستعود بعد ذلك إلى حلقة رسالة Windows
  • جميع الرسائل الأخرى في قائمة انتظار الرسائل ستكون معالجة قبل الموقت
  • نأمل الآن أن تقوم MSHTML بتعيين موضع الكاريت الافتراضي بنقرة واحدة
  • يمكنك بعد ذلك تحريك موقع الذبابة بنفسك عندما يطلق الموقت

إلقاء نظرة مع Spy ++ لمعرفة الأحداث التي يتم إرسالها بين النوافذ المختلفة في عنصر تحكم MSHTML للحصول على مُثُل أخرى. لا يشبه التحكم في MSHTML أي تحكم في WinForms وعليك العودة إلى كل الخدعة التي استخدمتها في أيام C و Win32.

ربما هناك أحداث منفصلة لـ Mousedown Mouseup و Mouseclick.

يمكنك اعتراض Mouseclick ولكن يتم تنفيذ السلوك الافتراضي على Mouseup.

هل ربطت تعيين "التركيز" على DIV الأول من خلال العثور على عنصر DOM لذلك ، واستدعاء SetFocus (أو أي شيء يطلق عليه) طريقة DOM؟ يجب أن تنتقل الكاريت إلى حيث يوجد fosus.

(هناك واجهات تعرضها MSHTML للعثور على عناصر DOM وطرق الاتصال عليها. آسف لا أتذكر تفاصيل كيفية القيام بذلك)

أعتقد أنك بحاجة إلى تغيير خاصية SelectStart وترك طول التحديد = 0. هذا من شأنه أن ينقل الكاريت إلى وضع جديد.

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