作为C Windows编程的前任讲师,我可以肯定地说,使用C构建GUI没有简单的方法 - 语言不适合这项任务.几乎任何其他东西都是更好的选择 - 我自己最喜欢的GUI开发是Delphi.
作为C Windows编程的前任讲师,我可以肯定地说,使用C构建GUI没有简单的方法 - 语言不适合这项任务.几乎任何其他东西都是更好的选择 - 我自己最喜欢的GUI开发是Delphi.
Win32 + C是一种非常低级的方法,它有其优点和缺点.也就是说,有办法让事情变得更容易.
首先,关于位移,有几个宏可用于WPARAM和LPARAM.事实上,您可能不应该编写位移,因为WPARAM和LPARAM的大小多年来已经发生了变化,您可能正在创建未来的错误.
其次,关于WindowProc函数中的巨型switch语句,虽然它会存在,但有一种方法可以使它更易于管理. #include
获得一大堆有用的宏,最值得一提的是HANDLE_MSG.而不是需要写
LRESULT CALLBACK MyWindowProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch(Message) { case WM_COMMAND: ... } }
你可以写:
void MyOnCommand(HWND hwnd, int controlID, HWND hwndCtl, UINT codeNotify); LRESULT CALLBACK MyWindowProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch(Message) { HANDLE_MSG(hwnd, WM_COMMAND, MyOnCommand); } }
并且宏自动将该消息类型的所有不同参数转换并分离为适当命名的&typed变量.浏览windowsx.h
以查看处理的消息以及所需的函数原型.并非所有不同的消息都被处理,但不少消息.
至于同时拥有多个窗口,不应该阻止你多次调用CreateWindow或其亲属.虽然你只有一个HINSTANCE
(给你的WinMain
),你可以拥有任意数量的HWND
s.
您可能会发现Raymond Chen的临时程序非常有用,因为它应该为您提供一个合适的骨架.您还可以考虑使应用程序使用对话框而不仅仅是窗口; 你可以免费获得一堆东西,你可以使用资源编辑器来设计窗口及其所有控件. Visual C++ Standard及以上版本包括一个资源编辑器,还有几个免费版本: XN Resource Editor似乎是一个流行的开源编辑器,我相信你可以在Google上找到更多.所有这些生产资源的脚本,你应该在你的工具链的资源编译器:RC.EXE为Visual Studio(包括速成版,或可作为SDK的一部分),或windres在Cygwin的GNU的BINUTILS的一部分或者mingw.
我将抛弃我传统的开箱即用建议:将Lua添加到您的应用程序中,并使用Lua和合适的工具包模块组合构建GUI.一个很好的选择是IUP,另一个是wxWidgets.两者都有不错的Lua绑定.更好的是,Lua本身连同wxLua和IUP都可以在一个安装中与Lua for Windows项目中的一堆其他有用的Lua模块一起使用.
Lua很容易与C代码集成,因为它从一开始就是为此目的而设计的.
使用Lua作为将应用程序保持在一起的粘合剂也很容易,其核心功能在C中实现或作为本机API调用的接口实现.
如果您有一个广泛的库来适应,SWA也支持Lua .
当然,您可以直接使用来自C的wxWidgets或IUP,因为它们都具有C可调用API,但事件驱动的GUI通常充满了极易处理的小型管家回调函数,这些函数易于用脚本语言处理.
另一个需要考虑的工具包是Tk,它最常见于Tcl脚本语言.Tcl的开发也考虑了嵌入更大的应用程序,尽管它已经从它作为主要用例发展而来.Tk已经被各种其他语言所包括,包括Perl.