3

我有一个解决方案,其中有两个项目。当我得到代码时,他们告诉一个项目处理视觉部分,另一个项目处理逻辑部分。现在我在窗口中添加了一个按钮。为此,我编辑了处理视觉部分的项目。我对此很陌生,但在 Visual Studio 2010 中创建和添加按钮相当简单。现在的问题是我想检测是否从另一个项目中按下了按钮。我确信这些项目正在共享一些数据,但我无法捕获它。现在我正在更改文件中的值并从另一个项目中读取相同的数据以检查按钮是否被按下。但我认为有更好的方法来做到这一点。任何人都可以帮忙吗?

4

1 回答 1

2

我认为这两个项目不会自动共享。您必须定义两个项目通信的接口。例如,在您上面的解决方案中,“文件中的值”是您定义的“接口”。听起来您想要实现的是将控制器(逻辑部分)和视图(视觉部分)分开,这似乎表明您的项目正在使用 MVC 模型。

我建议定义一个抽象类(接口)来定义你想要的两个项目之间的交互。他们所要共享的只是一个头文件。

例如:

// Solution A (Controller - logic part)
// MyUIHandler.h
class IMyUIHandler //You can also use microsoft's interface keyword for something similar.
{
public:
    HRESULT onButtonPressed() = 0; // Note that you can also add parameters to onButtonPressed.
};

HRESULT getMyUIHandler(IMyUIHandler **ppHandler);

然后实现这个接口:

// Solustion A (Controller - logic part)
// MyUIHandler.cpp
#include "MyUIHandler.h"
class CMyUIHandler : public IMyUIHandler
{
private:
   // Add your private parameter here for anything you need
public:
    HRESULT onButtonPressed();
}

HRESULT getMyUIHandler(IMyUIHandler **ppHandler)
{
    // There are many ways to handle it here:
    // 1. Define a singleton object CMyUIHandler in your project A. Just return a pointer 
    //    to that object here. This way the client never releases the memory for this 
    //    object.
    // 2. Create an instance of this object and have the client release it. The client 
    //    would be responsible for releasing the memory when it's done with the object. 
    // 3. Create an instance of this object and have a class/method in Solution A release
    //    the memory. 
    // 4. Reference count the object, for example, make IUnknown the parent class of 
    //    IMyUIHandler, and implement the IUnknown interace (which is boiler plate code).
    // Since I don't know your project it's hard for me to pick the most suitable one. 
    ...
    *ppHandler = myNewHandler;
    ...
    return S_OK;
}

CMyUIHandler 可以只是您现有的已经处理一些逻辑的类。

在解决方案 B 中,您应该在一些初始化函数中调用 getMyUIHandler,例如 UI 类的控制器,将其保存为您的成员。然后是 VS 为您创建的“Button clicked”事件处理程序。

// Solution B (View - visual part)
// MyUIView.h
class MyUIView
{
protected:
    IMyUIHandler *m_pHandler;
}

// MyUIView.cpp
CMyUIView::CMyUIView(...) 
{
    ...
    hr = getMyUIHandler(&m_pHandler);
    // error handler, etc...   
    ...
}

// In the function that is created for you when button is clicked (I'm not sure if I get the signature right below.
void OnClick(EventArgs^ e) 
{
    ...
    hr = m_pHandler->onButtonPressed();
    ...
}

然后,您可以在单击按钮后立即传递您为函数 onButtonPressed 定义的任何参数。

于 2012-07-02T06:42:28.217 回答