سؤال

أحتاج إلى تحديث أ combobox بقيمة جديدة بحيث يغير النص المنعكس فيه.أنظف طريقة للقيام بذلك هي بعد comboboxتمت تهيئة ومع رسالة.

لذلك أحاول صياغة أ postmessage إلى hwnd الذي يحتوي على combobox.

لذا، إذا كنت أرغب في إرسال رسالة إليه، لتغيير العنصر المحدد حاليًا إلى العنصر n، فماذا سيكون postmessage يبدو مثل؟

أظن أن الأمر سيشمل ON_CBN_SELCHANGE, ، لكن لا يمكنني تشغيله بشكل صحيح.

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

المحلول

انت تريد ComboBox_SetCurSel:

ComboBox_SetCurSel(hWndCombo, n);

أو إذا كان عنصر تحكم MFC CComboBox، فربما يمكنك القيام بما يلي:

m_combo.SetCurSel(2);

أتخيل أنك إذا كنت تفعل ذلك يدويًا فإنك تريد أيضًا SendMessage بدلاً من PostMessage.CBN_SELCHANGE هو الإعلام الذي يرسله عنصر التحكم العودة إليك عندما يتم تغيير الاختيار.

وأخيرًا، قد ترغب في إضافة علامة c++ إلى هذا السؤال.

نصائح أخرى

نسخة موجزة:

const int index = 0;
m_comboBox.PostMessage(CBN_SELCHANGE, index);

الخطأ الذي قد يحدث هو أن التحديد يتم تغييره داخل معالج رسالة تغيير التحديد، مما يؤدي إلى ظهور رسالة تغيير تحديد أخرى.

طريقة واحدة للالتفاف على هذا حلقة ردود الفعل غير المرغوب فيها هو إضافة حارس إلى معالج رسائل التغيير المحدد كما هو موضح أدناه:

void onSelectChangeHandler(HWND hwnd)
{
  static bool fInsideSelectChange = 0;

  //-- ignore the change message if this function generated it
  if (fInsideSelectChange == 0)
  {
    //-- turn on the sentinel
    fInsideSelectChange = 1;

    //-- make the selection changes as required
    .....

    //-- we are done so turn off the sentinel
    fInsideSelectChange = 0;
  }
}

إذا كنت تريد تغيير العنوان - وهو السطر الذي يظهر عند إغلاق combobox، فيمكنك القيام بما يلي:

m_ComboBox.DeleteString(0);// أولاً حذف سابقًا إن وجد ، 0 = سلسلة مرئية m_combobox.addstring (_t ("Hello There")) ؛

ضع هذا في الفوركسفي OnCloseupCombo - عند إغلاق الحدث، يتم تشغيل المربع المنسدل

ON_CBN_CLOSEUP(IDC_COMBO1, OnCloseupCombo)

هذا التغيير عبارة عن سلسلة جديدة وليس مجموعة مختارة من عناصر combobox المعينة بالفعل

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