【问题标题】:Structuring Win32 GUI code构建 Win32 GUI 代码
【发布时间】:2010-03-30 14:23:07
【问题描述】:

我希望在具有大量窗口和控件的大型 Win32 项目中改进我的代码和文件结构。目前,我倾向于为一个窗口或对话框的整个实现提供一个头文件和一个源文件。这适用于小型项目,但现在已经到了这些实现开始达到 1000-2000 行的地步,浏览起来很乏味。

我的一个典型的源文件是这样的:

static LRESULT CALLBACK on_create(const HWND hwnd, WPARAM wp, LPARAM lp) {
    setup_menu(hwnd);
    setup_list(hwnd);
    setup_context_menu(hwnd);

    /* clip */

    return 0;
}

static LRESULT CALLBACK on_notify(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
    const NMHDR* header = (const NMHDR*)lp;

    /* At this point I feel that the control's event handlers doesn't
     * necessarily belong in the same source file. Perhaps I could move
     * each control's creation code and event handlers into a separate
     * source file? Good practice or cause of confusion? */

    switch (header->idFrom) {
    case IDC_WINDOW_LIST:
        switch (header->code) {
        case NM_RCLICK:
            return on_window_list_right_click(hwnd, wp, lp);

        /* clip */
        }
    }
}

static LRESULT CALLBACK wndmain_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
    switch (msg) {
    case WM_CREATE:
        return on_create(hwnd, wp, lp);

    case WM_CLOSE:
        return on_close(hwnd, wp, lp);

    case WM_NOTIFY:
        return on_notify(hwnd, wp, lp);

    /* It doesn't matter much how the window proc looks as it just forwards
     * events to the appropriate handler. */

    /* clip */

    default:
        return DefWindowProc(hwnd, msg, wp, lp);
    }
}

但是现在窗口有更多的控件,这些控件又都有自己的消息处理程序,然后是菜单点击处理程序,等等......我明白了迷失了,我真的需要关于如何以一种好的和明智的方式来组织这个混乱的建议。

我试图找到构建 Win32 代码的良好开源示例,但我只是变得更加困惑,因为有数百个文件,并且在每个看起来与 GUI 相关的文件中,Win32 GUI 代码似乎已经被封装了.而当我终于找到CreateWindowEx 语句时,却找不到window proc。

任何关于如何在保持理智的情况下构建所有代码的建议将不胜感激。

谢谢!

我不想使用任何库或框架,因为我发现 Win32 API 有趣且对学习很有价值。

对如何构建自己的 GUI 代码的任何见解都可以作为灵感。

【问题讨论】:

  • 你喜欢至少使用 c++ 类还是只使用 c?
  • 您已经得出一个必然的结论,即您需要一个 C++ 类库来保持您的代码井井有条。
  • luca - 我目前正在探索 C,这就是我在相关项目中使用的。谢谢。
  • 这是一个垃圾问题。使用 C 还是 C++ 无关紧要 - 与科学校长应用相同的基本编程。即做某种模型视图控制器的功能拆分。仅仅因为你没有“类”并不意味着你不能应用 OO 原则。

标签: c user-interface winapi


【解决方案1】:

首先,我会看看windowsx.h 中的message crackers;它们可以省去你在窗口过程中编写繁琐的 case 语句,并且它们建议在函数名称中遵循一定的规则。

【讨论】:

  • 乍一看这看起来很有趣。今晚晚些时候我会仔细阅读这篇文章。谢谢。
  • 我只是在 win32 世界中冒险。谢谢你,否则它会在几个月内要求重构。
猜你喜欢
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 2011-10-08
相关资源
最近更新 更多