我希望在具有大量窗口和控件的较大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代码的见解都可能成为灵感。
答案 0 :(得分:5)
对于初学者,我会看一下windowsx.h
中的message crackers;他们会节省你在窗口程序中编写繁琐的案例陈述,并且他们建议在函数名称中使用某种规则。