का उपयोग कर WinRT में एक मोडल संदेशबॉक्स कैसे बनाएं, इस समय मैं एक क्रॉस-प्लेटफ़ॉर्म सी ++ एसडीके पर काम कर रहा हूं और मुझे अपने जोरदार हैंडलर को WinRT पर पोर्ट करना होगा। प्रक्रिया का एक हिस्सा एक संदेश बॉक्स प्रदर्शित करना है, उपयोगकर्ता इनपुट के लिए प्रतीक्षा करें और जब उपयोगकर्ता "डीबग" चुनता है तो ब्रेकपॉइंट ट्रिगर करें।देशी सी ++
मुझे पहले से ही एक संदेश बॉक्स दिखाई देने के लिए मिला है, लेकिन मुझे संदेश बॉक्स को के बिना निष्पादन के वर्तमान बिंदु को छोड़ने के लिए प्रतीक्षा करने का कोई तरीका नहीं मिल रहा है।
यहां मेरा कोड अभी तक है।
// Create the message dialog factory
Microsoft::WRL::ComPtr<ABI::Windows::UI::Popups::IMessageDialogFactory> messageDialogFactory;
Microsoft::WRL::Wrappers::HStringReference messageDialogFactoryId(RuntimeClass_Windows_UI_Popups_MessageDialog);
Windows::Foundation::GetActivationFactory(messageDialogFactoryId.Get(), messageDialogFactory.GetAddressOf());
// Setup the used strings
Microsoft::WRL::Wrappers::HString message;
Microsoft::WRL::Wrappers::HString title;
Microsoft::WRL::Wrappers::HString labelDebug;
Microsoft::WRL::Wrappers::HString labelIgnore;
Microsoft::WRL::Wrappers::HString labelExit;
message.Set(L"Test");
title.Set(L"Assertion triggered");
labelDebug.Set(L"Debug");
labelIgnore.Set(L"Ignore");
labelExit.Set(L"Exit");
// Create the dialog object
Microsoft::WRL::ComPtr<ABI::Windows::UI::Popups::IMessageDialog> messageDialog;
Microsoft::WRL::ComPtr<ABI::Windows::Foundation::Collections::IVector<ABI::Windows::UI::Popups::IUICommand*>> messageDialogCommands;
messageDialogFactory->CreateWithTitle(message.Get(), title.Get(), messageDialog.GetAddressOf());
messageDialog->get_Commands(messageDialogCommands.GetAddressOf());
// Attach commands
Microsoft::WRL::ComPtr<ABI::Windows::UI::Popups::IUICommandFactory> commandFactory;
Microsoft::WRL::Wrappers::HStringReference commandFactoryId(RuntimeClass_Windows_UI_Popups_UICommand);
Windows::Foundation::GetActivationFactory(commandFactoryId.Get(), commandFactory.GetAddressOf());
CInvokeHandler commandListener;
commandFactory->CreateWithHandler(labelDebug.Get(), &commandListener, commandListener.m_DebugCmd.GetAddressOf());
commandFactory->CreateWithHandler(labelIgnore.Get(), &commandListener, commandListener.m_IgnoreCmd.GetAddressOf());
commandFactory->CreateWithHandler(labelExit.Get(), &commandListener, commandListener.m_ExitCmd.GetAddressOf());
messageDialogCommands->Append(commandListener.m_DebugCmd.Get());
messageDialogCommands->Append(commandListener.m_IgnoreCmd.Get());
messageDialogCommands->Append(commandListener.m_ExitCmd.Get());
// Show dialog
Microsoft::WRL::ComPtr<ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Popups::IUICommand*>> showOperation;
messageDialog->ShowAsync(showOperation.GetAddressOf());
// ... and wait for the user to choose ...?
और अब मैं यहां फंस गया हूं। यदि मैं कॉलबैक को ट्रिगर करने के लिए बस स्पिन-प्रतीक्षा करता हूं तो मैं अंतहीन पाश में प्रवेश कर रहा हूं और संदेश बॉक्स बिल्कुल दिखाई नहीं देता है (कम से कम जब मैं यूआई-थ्रेड से कॉल कर रहा हूं)। अगर मैं निष्पादन जारी रखता हूं तो मैं सही स्थिति पर ब्रेकपॉइंट ट्रिगर करने की संभावना खो रहा हूं।
तो मैं जो खोज रहा हूं वह रेड्रा को मजबूर करने के लिए या एसिंक कॉल को समाप्त करने के लिए "व्यस्त-प्रतीक्षा" करने का कोई तरीका है (sth। जैसे "मैसाडेडियलॉग-> शोएसिंक()" का इंतजार करें)। मुझे पता है कि मैं प्रबंधित-सी ++ का उपयोग कर सकता हूं, लेकिन मैं इसे टालना चाहता हूं :)
विस्तृत उत्तर के लिए धन्यवाद। मुझे लगता है कि यह मुझे कुछ देर के लिए व्यस्त रखेगा :) – mmpause