构建Win32 GUI代码

时间:2010-03-30 14:23:07

标签: c user-interface winapi

我希望在具有大量窗口和控件的较大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语句时,窗口过程无处可寻。

关于如何在保持理智的同时构建所有代码的任何建议都将非常感激。

谢谢!

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

任何关于如何构建自己的GUI代码的见解都可能成为灵感。

1 个答案:

答案 0 :(得分:5)

对于初学者,我会看一下windowsx.h中的message crackers;他们会节省你在窗口程序中编写繁琐的案例陈述,并且他们建议在函数名称中使用某种规则。