تغيير combobox برمجيا
-
09-06-2019 - |
سؤال
أحتاج إلى تحديث أ 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 المعينة بالفعل