سؤال

لدي شجرة كائن التحكم التي تم إنشاؤها باستخدام CTreeCtrl فئة MFC.شجرة التحكم يحتاج إلى دعم إعادة تسمية.عندما غادر انقر على أي من العناصر في شجرة TVN_SELCHANGED الحدث دعا من خلالها يمكنني الحصول على العنصر المحدد من الشجرة كما يلي :HTREEITEM h = m_moveListTree.GetSelectedItem();CString s = m_moveListTree.GetItemText(ح) ؛

ومع ذلك عندما rightclick على أي بند في شجرة أنا لا أحصل على أي TVN_SELCHANGED الحدث ومن ثم بلدي العنصر المحدد لا يزال نفس من اليسار انقر فوق الحدث.هذا هو الذي يسبب المشكلة التالية :1)المستخدم leftclicks على البند 2)حق المستخدم بالنقر على البند " ب " و يقول تسمية 3)منذ العنصر المحدد لا يزال rename هو تطبيق البند أ.

الرجاء المساعدة في حل المشكلة.

-برافين

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

المحلول

أنا خلقت بلدي MFC مثل المنزل نمت C++ GUI على رأس Win32 API و النظر في قانون بلدي ، هذا هو كيف يتعامل مع هذا الوضع:

LRESULT xTreeCtrl::onRightClick(NMHDR *)
{
  xPoint pt;

  //-- get the cursor at the time the mesage was posted
  DWORD dwPos = ::GetMessagePos();

  pt.x = GET_X_LPARAM(dwPos);
  pt.y = GET_Y_LPARAM (dwPos);

  //-- now convert to window co-ordinates
  pt.toWindow(this);

  //-- check for a hit
  HTREEITEM hItem = this->hitTest(pt);

  //-- select any item that was hit
  if ((int)hItem != -1) this->select(hItem);

  //-- leave the rest to default processing
  return 0;
}

وأظن إذا كنت تفعل شيئا من هذا القبيل في MFC حق انقر على زر اليمين أو إلى أسفل الأحداث التي سوف يحل المشكلة.

ملاحظة:على onRightClick رمز أعلاه هو لا شيء أكثر من معالج WM_NOTIFY, NM_RCLICK رسالة.

نصائح أخرى

هذا السلوك حسب التصميم -- النقر بزر الماوس الأيمن لا نقل التحديد.

من أجل ما تريد ، بدوره على TVS_EDITLABELS أسلوب في طريقة عرض الشجرة.ثم يمكنك التعامل مع TVN_BEGINLABELEDIT و TVN_ENDLABELEDIT الإخطارات.

غير متأكد من كيفية المنبثقة قائمة السياق ، ولكن يمكنك استخدام HitTest() للوصول من نقطة إلى شجرة البند.لذا يمكنك استخدام هذا في حق انقر فوق معالج.

لا ننسى أن قائمة السياق كما يمكن تفعيلها من خلال مفتاح معقولة الحديثة لوحات المفاتيح.ثم ربما كنت ترغب في استخدام العنصر المحدد هدفا.

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