【问题标题】:How can I make my Windows API GUI code more object-oriented?如何使我的 Windows API GUI 代码更加面向对象?
【发布时间】:2013-12-11 16:56:21
【问题描述】:

对于一个班级项目,我正在创建一个带有 GUI 的井字游戏。作业需要使用类。

该作业最初不需要 GUI,因此我创建了一个带有命令行界面的有效井字游戏。但是,为了获得一些额外的积分,我现在想实现一个 GUI。问题是我们还没有涵盖 GUI 设计。

到目前为止,我能够显示一个带有 9 个按钮的窗口。正如您从下面的代码中看到的那样,这一切都是在没有类的情况下完成的。如何将我的代码分成一个或多个类?那么,在 main 中创建对象后如何显示 GUI?

我不想在已经包含的 windows.h 系统头文件之外引入任何框架依赖项。

最后我希望有一个类来处理接口和一个类来处理逻辑。

感谢您的任何建议

main.cpp

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine, int nCmdShow )
{
  MSG  msg ;    
  WNDCLASS wc = {0};
  wc.lpszClassName = TEXT( "Buttons" );
  wc.hInstance     = hInstance ;
  wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
  wc.lpfnWndProc   = WndProc ;
  wc.hCursor       = LoadCursor(0, IDC_ARROW);


  RegisterClass(&wc);
  CreateWindow( wc.lpszClassName, TEXT("Buttons"),
                WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                150, 150, 340, 360, 0, 0, hInstance, 0);  

  while( GetMessage(&msg, NULL, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  return (int) msg.wParam;
}

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{


  switch(msg)  
  {
    case WM_CREATE:
    {
        CreateWindow(TEXT("button"), TEXT(""),    
                     WS_VISIBLE | WS_CHILD ,
                     20, 20, 80, 80,        
                     hwnd, (HMENU) 1, NULL, NULL);    

        CreateWindow(TEXT("button"), TEXT(""),    
                     WS_VISIBLE | WS_CHILD ,
                     120, 20, 80, 80,        
                     hwnd, (HMENU) 2, NULL, NULL); 

        CreateWindow(TEXT("button"), TEXT(""),    
                     WS_VISIBLE | WS_CHILD ,
                     220, 20, 80, 80,        
                     hwnd, (HMENU) 3, NULL, NULL); 

        CreateWindow(TEXT("button"), TEXT(""),    
                     WS_VISIBLE | WS_CHILD ,
                     20, 120, 80, 80,        
                     hwnd, (HMENU) 4, NULL, NULL);

        CreateWindow(TEXT("button"), TEXT(""),    
                     WS_VISIBLE | WS_CHILD ,
                     120, 120, 80, 80,        
                     hwnd, (HMENU) 5, NULL, NULL);    

        CreateWindow(TEXT("button"), TEXT(""),    
                     WS_VISIBLE | WS_CHILD ,
                     220, 120, 80, 80,        
                     hwnd, (HMENU) 5, NULL, NULL); 

        CreateWindow(TEXT("button"), TEXT(""),    
                     WS_VISIBLE | WS_CHILD ,
                     20, 220, 80, 80,        
                     hwnd, (HMENU) 1, NULL, NULL); 

        CreateWindow(TEXT("button"), TEXT(""),    
                     WS_VISIBLE | WS_CHILD ,
                     120, 220, 80, 80,        
                     hwnd, (HMENU) 1, NULL, NULL); 

        CreateWindow(TEXT("button"), TEXT(""),    
                     WS_VISIBLE | WS_CHILD ,
                     220, 220, 80, 80,        
                     hwnd, (HMENU) 1, NULL, NULL);                                                       
        break;
    }
        // incomplete
      case WM_COMMAND:
      {
       if (LOWORD(wParam) == 1) {
           Beep(40, 50);
       }

       if (LOWORD(wParam) == 2) {
              PostQuitMessage(0);
       }

       break;
       }

      case WM_DESTROY:
      {
         PostQuitMessage(0);
         break;
      }
  }
  return DefWindowProc(hwnd, msg, wParam, lParam);
}

【问题讨论】:

  • 看看 MFC 或 Qt。还可以选择阅读有关 mvc 模式的信息
  • 我宁愿不看其他任何东西。我只想用 windows.h 来做这个。
  • @Hayri Uğur Koltuk 我将开始阅读有关 mvc 模式的内容。谢谢
  • mvc 模式将是仅使用 WinAPI 实现的大量工作,特别是如果目标只是为基于文本的井字游戏添加 GUI。
  • @drescherjm 好吧,那不是我想走的路。我试图让它尽可能简单。现在我要做的就是创建一个显示九个按钮的类。

标签: c++ oop winapi


【解决方案1】:

您可能正在寻找Raymond Chen's C++ version of his scratch program

它向您展示了如何将 C++ 类(和成员函数)与 Windows API 使用的 C 样式回调方法一起使用。如果您对如何在 Windows 中做好事以及 API 以它们的方式工作的原因感兴趣,他几乎所有的博客文章都值得一读。

但是,Raymond 的程序还有很多可以改进的地方,尤其是新的std::unique_ptr(在 2005 年他的帖子出现时它还不存在,而且他在两年前就已经写了这些东西而享有盛誉他们公开了,所以他可能甚至没有 C++03 可以使用)。

不过,它向您展示了如何将this 指针存储在 Win32 GUI 对象中,以及如何将消息分派给成员函数进行处理。

【讨论】:

  • 我也赞成 WTL(正如您在上一个答案的评论中提到的)它相对轻量级(与 Qt 相比)并且易于上手。
  • @CoreyStup:在一个相关问题中,他提到它必须在他教授的测试机器上编译,这排除了第三方库的下载。否则 WTL 将是一个很好的补充。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多