【问题标题】:C++ How to make a GUI in directx?C ++如何在directx中制作GUI?
【发布时间】:2010-11-29 02:44:35
【问题描述】:

我对这个主题有几个问题。
我为按钮创建了一个类,该类有问题。
问题是:
1.我想创建一个在按钮被点击时被调用的函数,问题是每个按钮在被点击时都会做不同的事情。所以我不知道如何创建对每个按钮执行不同操作的函数。
我不知道我应该如何设计我的界面。
如果你能给我一个关于我应该如何设计我的 GUI 的想法,那就太好了。
这是我的按钮类

class GUIButtons
{
public:
    GUIButtons(void);
    ~GUIButtons(void);
    void LoadMesh(string fileName, int startAnimation, LPDIRECT3DDEVICE9 d3ddev);
    void Render(float timeElapsed, D3DXMATRIX *matWorld);
    void EventProc(HWND hWnd, UINT msg, LPDIRECT3DDEVICE9 d3ddev);
    void Picking(HWND hWnd, LPDIRECT3DDEVICE9 d3ddev);
private:
    CXFileEntity *Button;
};

编辑 2:
伙计们,这可能吗?
我创建了两个函数,而不是将一个函数指向另一个函数。
像这样的

void a()
{
     ....
}
void b() = a;

编辑 3:
好的,我应该将这种方式用于onClick() 函数。

void Onclick( void(*fun) )
{
    fun();
}

我将一个函数传递给OnClick,而不是它调用该函数。
我应该用这种方式吗?

【问题讨论】:

  • 如果您已经在 Microsoft 平台上,为什么不使用 Windows Presentation Foundation?
  • 因为,在directx全屏下你不能使用Windows Presentation Foundation
  • 您在第二次编辑时所写的内容是不可能的。但是你可以使用函数指针。但说真的,使用类/多态会更好、更安全、更优雅,这样你会学到更多:)
  • 您可以使用 Boost Signals 库来实现与您想要的类似的东西。查看:boost.org/doc/libs/release/doc/html/signals.html 或线程友好的:boost.org/doc/libs/release/libs/signals2

标签: c++ winapi user-interface visual-c++ directx


【解决方案1】:

使用继承/多态:基类是GUIButtons,每个新的单独按钮都派生自该基类:

class MyButton : public GUIButtons { ... }

然后点击功能以虚拟方法onClick() 或其他方式实现。

更多细节:

class GUIButtons 
{
   ... \\ lots of stuff
   virtual void onClick() { };
};

class CloseButton : public GUIButtons
{
  ...
  virtual void onClick()
  {
    //code to close window
  }
};

class SettingsButton : public GUIButtons
{
  ...
  virtual void onClick()
  {
    //stuff to open settings menu
  }
};

【讨论】:

  • 我很困惑.. 所以假设我创建了两个按钮。如果单击第一个按钮,则窗口应关闭,如果单击第二个按钮,则应显示消息框。我想如何用一个功能做到这一点?
  • 我编辑了我的答案。作为一个非常简单的替代方案(虽然没有那么强大),您可以为按钮操作(CLOSE、MESSAGE、NEW_GAME、...)设置一个枚举变量,然后在单击按钮时调用的函数中使用 switch 语句。
  • 为每个场景定义 OnClick() 并不是 GUI 库的工作。该库必须提供一个接口,以便使用小部件的应用程序可以按照自己的意愿处理它。
  • 当然。这就是为什么我喜欢使用多态的版本。但是如果你不写一个 GUI library 而只是一个简单的窗口,有 3 个按钮,为什么不采用简单的方法呢?
  • 如果它是一个带有 3 个按钮的简单窗口,那么使用继承就可以了。但是将它们与小部件分离会更具可扩展性。
【解决方案2】:

按钮点击是一个动作/事件。您可以将单击操作封装为一个类。使用按钮小部件的应用程序会以不同方式解释和使用此操作。 gui 库必须通知已单击带有相关信息的按钮。您可以参考 Qt 或 Gtk+ 等流行的 GUI 库作为示例,了解它们如何实现 GUI 事件等等。

【讨论】:

    【解决方案3】:

    我向你推荐这本书"DirectX 9 User Interfaces: Design and Implementation"。我有,我可以说你会在那里找到你需要的一切!!!;)

    【讨论】:

      猜你喜欢
      • 2011-02-16
      • 1970-01-01
      • 2013-08-19
      • 2013-11-29
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 2014-01-08
      相关资源
      最近更新 更多