Я работаю над своим проектом C++/CLI, добавляя элементы подменю с помощью события щелчка. У меня проблема с получением текста пункта меню, потому что когда я пробую это:
Debug::WriteLine("SmtpEmail............" + sender);
Я получаю это как обратный вывод:
System.Windows.Forms.MenuItem, Items.Count: 0, Text: hello
Поэтому мне придется преобразовать строку в пункт системного меню.
Когда я пробую это:
MenuItem^ selectedItem = (MenuItem)sender;
Debug::WriteLine("SmtpEmail............" + selectedItem.Text->ToString());
Я получаю сообщение об ошибке:
'type cast' : cannot convert from 'System::Object ^' to 'System::Windows::Forms::MenuItem'
Ошибка прыгает на этой строке:
MenuItem^ selectedItem = (MenuItem)sender;
Он сказал, что я не могу преобразовать «System::Object ^» в «System::Windows::Forms::MenuItem».
Вот полный код:
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
RegistryKey^ rkCurrentUser = Registry::CurrentUser;
RegistryKey^ rkInternetAccountManager = rkCurrentUser->OpenSubKey("Software\\Microsoft\\Internet Account Manager\\Accounts");
for each (String^ getkeysNames in rkInternetAccountManager->GetSubKeyNames()) {
if (getkeysNames->Contains("0000000")) {
RegistryKey^ myKey = rkCurrentUser->OpenSubKey("Software\\Microsoft\\Internet Account Manager\\Accounts\\"+getkeysNames->ToString());
String^ AccountName = myKey->GetValue("Account Name")->ToString();
String^ POP3Server = myKey->GetValue("POP3 Server", "")->ToString();
String^ IMAPServer = myKey->GetValue("IMAP Server", "")->ToString();
String^ HTTPMailServer = myKey->GetValue("HTTPMail Server", "")->ToString();
String^ SmtpDisplayName = myKey->GetValue("SMTP Display Name")->ToString();
String^ SmtpEmail = myKey->GetValue("SMTP Email Address")->ToString();
Debug::WriteLine("getkeys............" + getkeysNames->ToString());
Debug::WriteLine("AccountName............" + AccountName);
Debug::WriteLine("SmtpDisplayName............" + SmtpDisplayName);
Debug::WriteLine("SmtpEmail............" + SmtpEmail);
if (SmtpEmail->Length > 0) {
menuItem121->MenuItems->Add(SmtpEmail)->Click += gcnew EventHandler(this, &Form1::MenuItem_Click);
}
//Close the Registry.
myKey->Close();
}
}
}
private: void MenuItem_Click(Object^ sender, EventArgs^ e) {
MenuItem^ selectedItem = (MenuItem)sender;
// Access the clicked item here..
//String text = menuitem->Text; // I guess it's called text(?)
Debug::WriteLine("SmtpEmail............" + selectedItem.Text->ToString());
//Debug::WriteLine("SmtpEmail............" + sender);
}
Можете ли вы показать мне пример, как я могу преобразовать системный объект\строку в пункт меню, чтобы я мог получить текст пункта меню?
Я удалил тег C++, потому что это не C++.
Пробовали (MenuItem^)sender
?
auto selectedItem = safe_cast<MenuItem^>sender;
Ссылочные типы в C++/CLI используются с оператором Handle to Object (^).
Поэтому эта строка:
MenuItem^ selectedItem = (MenuItem)sender;
Следует изменить на:
//--------------------------------V--------
MenuItem^ selectedItem = (MenuItem^)sender;
Обратите внимание, что в C# это эквивалентно:
MenuItem selectedItem = (MenuItem)sender;
(т.е. без ^
).
Итак, ваша ошибочная строка представляет собой смесь синтаксиса C# и C++/CLI.
Почему вопрос о C++cli помечен как C++? Это два разных языка.