2017-04-17 42 views
0

我希望有人能够帮助我。我的目标是使用C++打开一个数学输入面板,但面板仅在程序退出前一秒打开。这是我尝试过的。打开一个基本的数学输入控件

  • cin.get();
  • system(“PAUSE”);
  • getchar();

所有上述的尝试保持程序打开导致数学输入控制窗口弹出但保持空白。

我使用的代码直接来自这里。

https://msdn.microsoft.com/en-us/library/windows/desktop/dd317324(v=vs.85).aspx

我使用Visual Studio社区版2017年与Windows 10

任何和所有帮助表示赞赏。

#include "stdafx.h" 
#include "micaut.h" 
#include "micaut_i.c" 
#include "atlcomcli.h" 

using namespace std; 



int main() 
{ 
    CComPtr<IMathInputControl> g_spMIC; // Math Input Control 

    HRESULT hr = CoInitialize(NULL); 
    hr = g_spMIC.CoCreateInstance(CLSID_MathInputControl); 
    hr = g_spMIC->EnableExtendedButtons(VARIANT_TRUE); 
    hr = g_spMIC->Show(); 

    return 0; 
} 
+1

*“导致数学输入控制窗口弹出但保持空白”* - 您期望什么,而是为什么? – IInspectable

+2

您的程序立即终止。你需要它来保持活力。你将需要运行一个消息循环。 –

+0

@IInspectable:我希望它呈现数学输入控件,但它只打开一个空白窗口。没有暂停技术,它会呈现数学输入控件,但会自动关闭。 –

回答

0

您的程序会显示窗口,但会立即终止。您将需要运行消息循环来为GUI提供服务。

0

单线程单元(STA)中的同步通过窗口消息实现(请参见Understanding and Using COM Threading Models)。这要求你在每个STA线程中运行一个消息循环。

#include <windows.h> 
#include <micaut.h> 
#include <micaut_i.c> 
#include <atlcomcli.h> 

int main() { 
    HRESULT hr = ::CoInitialize(NULL); 

    CComPtr<IMathInputControl> g_spMIC; // Math Input Control 
    if (SUCCEEDED(hr)) { 
     hr = g_spMIC.CoCreateInstance(CLSID_MathInputControl); 
    } 
    if (SUCCEEDED(hr)) { 
     hr = g_spMIC->EnableExtendedButtons(VARIANT_TRUE); 
    } 
    if (SUCCEEDED(hr)) { 
     hr = g_spMIC->Show(); 
    } 

    if (SUCCEEDED(hr)) { 
     // Message loop for STA 
     MSG msg{ 0 }; 
     while (::GetMessageW(&msg, nullptr, 0, 0)) { 
      // MathInputControl sends WM_USER + 2 when it should close 
      if (msg.message == (WM_USER + 2)) 
       break; 
      ::TranslateMessage(&msg); 
      ::DispatchMessageW(&msg); 
     } 

     ::CoUninitialize(); 
    } 
} 

数学输入控制响应发送WM_USER + 2消息点击关闭取消按钮是不是记录合同的一部分。一个适当的实现将实现一个_IMathInputControlEvents,并响应它的Close事件。