如何编写Windows应用程序?

5

我对编程非常不熟悉,但想要编写一个Windows应用。目前我已经阅读了《24小时自学C语言》这本书,请问我接下来该怎么做(需要阅读哪些教程),才能实现我的目标呢?谢谢。


3
奇怪这个问题被关闭了。回答它并不那么简单。以下是我对如何构建程序的建议:void main(); void mainInit(); void mainInitClasses(); void mainInitStyles(); void mainInitWindows(); void mainUpdateOsDevices(); void mainUpdateOsDevicesProc(HWND,int,WPARAM,LPARAM); void mainUpdateOsDevice(int deviceId);在下一个评论中会继续解释。 - AareP
2
因此,我们在这里解决了几个问题,以使Windows应用程序正常工作。 mainInitWindows()函数解决了CreateWindow()函数的执行问题。 mainInitClasses()函数解决了RegisterWindowEx()函数的执行问题。 mainInitStyles()函数为不同窗口类型查找正确的WS_*值组合。 解释请见下一条评论... - AareP
2
mainUpdateOsDevices() 处理消息泵,即调用 GetMessage()、TranslateMessage() 和 ProcessMessage()。 mainUpdateOsDevicesProc() 查找有关当前设备(鼠标、键盘、屏幕等)状态的更多信息,并以比 WPARAM/LPARAM 整数更方便的形式呈现它。在屏幕设备的 WM_PAINT 事件中,它还执行所有必要的预处理,如 BeginPaint() 执行。 mainUpdateOsDevice() 最终处理设备状态变化。它处理键盘按键、鼠标移动和屏幕更新。 待续... - AareP
2
请注意,您可以为屏幕更新拥有多个deviceId。例如,hud重绘的id和camera-1视图重绘的id是分开的。当调用mainUpdateOsDevice(int deviceId)时,所有必要的相机变换都已完成,因此您可以立即开始绘制。 - AareP
2
PS. mainUpdateOsDevicesProc()也是您传递给RegisterClassEx()的回调函数。 - AareP
显示剩余8条评论
13个回答

11

15年前,我开始为Windows开发应用程序时,记得读到Charles Petzold的一些非常有用的资料。他较新的书是关于C#的,但他旧书中的内容仍然相关,因为基础的Win32 API并没有太多变化。


1
具体来说,学习《Programming Windows》(http://www.charlespetzold.com/pw5/index.html),您将了解Windows的许多细节。 - artlogic
1
+1. Petzold的书为基本的Win32开发提供了非常好的基础。 - Paul Dixon
1
编写 Windows 程序是一本很棒的书。 - Benjamin Autin

10

你好,世界!

编写著名的“Hello World”程序(如果不确定,请Google):

  1. 输出文本到控制台。
  2. 将文本输出到对话框中。
  3. 在选择菜单项后使对话框出现。

然后,如果你仍然感兴趣:

  1. 编写一个程序,允许用户在文本框中输入文本。点击按钮后,在对话框中显示该文本。
  2. 将文本保存到文件中。
  3. 编写一个程序来读取文件并在窗口中显示其内容。

这些内容应该可以让你开始学习编写Windows应用程序的基础知识。

此外,阅读其他人推荐你阅读的所有链接和本主题中的链接。

旧与新

学习.NET、C#和C++的建议非常好。这些技术为你隐藏了很多繁琐的“苦力”工作。我仍然认为,对于各种原因,了解低层次发生的事情是有益的,包括:

  • 学习C适用于更多的基于Windows的应用程序(一些人会认为.NET和C#是可移植的,这在理论上是正确的,而ANSI C和Java在实践中是可移植的)。
  • 了解隐藏的内容将使您避免技术失误并诊断深层次的技术问题。

目前取决于你的目标。如果你只想编写Windows应用程序,那么请使用更适合此任务的现代技术。如果你想编写一个具有编写应用程序的理解(不仅仅是为Windows),那么现在继续追求C之路,并在扩展知识的同时开始探索其他技术。


4
根据应用程序而定。但现在你需要熟悉一个API。API基本上是预先制作的函数,您可以将其用作工具来执行... API旨在帮助您完成的任何操作。您正在寻找图形用户界面API。Windows有自己的API,但我建议您使用一些跨平台的API,这样您的应用程序将在多个平台上运行。
在维基百科上查找以下内容:
GTK+
Trolltech的QT4
它们几乎可以像Windows API一样做任何事情,并具有在Windows、Linux、Mac等多个平台上运行的额外好处。

2

http://winprog.org/tutorial/

这些对于学习Win32非常有用。如果你能找到Charles Petzold的书,那他是一个很好的资源,但The Forger's是免费的,现在就可以拿到它们。

总的来说,你应该先花一些时间编写使用标准库的C/C++应用程序。首先打开文件,编写输出,编写文件,读取/写入stdio,并掌握语言的基础知识。

查阅数据结构和算法分析方面的书籍对于任何类型的编程都是基本的。


1

阅读this

你是在暗示你想用C语言编写Windows桌面应用程序吗?那可是很久以前的技术了。根据this,你回到了2002年。

大多数在Windows上编写程序的人都使用.NET,这意味着使用C++或C#。


3
在C语言中写“ one ”并不是一个坏主意。 - Nosredna
这绝非坏主意,Nosredna。我不是Windows程序员,所以我甚至不知道Petzold的API是否仍然可用。如果我仍然在编写它,我会使用C ++作为“更好的C”。 - duffymo
他可以肯定地使用C++编译器并将其视为C语言。 - Nosredna

1
如果您需要一些GUI或复杂的功能,您需要一些面向对象编程技能...
您可以阅读这本书系列中的一些书籍:Head first... from O'Reilly

  1. Head first Object-Oriented Analysis and Design
  2. Head First Software Development
  3. Head first C# or Java (无论哪种语言都可以...)
  4. Trolltech Qt4,这也是必须的!感谢CptAJ

它们是非常适合初学者的好书...也适合高级程序员;-)

祝愉快阅读!


1
如果他正在学习C语言,为什么面向对象的技能会有帮助呢?C是一种过程式语言。当然,如果你建议他应该真正学习C#或Java,那么你的建议是有效的,但你没有推荐一种不同的语言。 - Colin Mackay
1
你可以不用面向对象编程来进行Windows编程!纯C就足够了。 - PhiLho
因为大多数具有 GUI 的 Windows 应用程序都需要它! - Matthieu
1
你可以用C语言编写GUI Windows应用程序。可能已经有数十万个GUI Windows应用程序是用C语言编写的。我认为现在使用C#语言最有意义,但C语言肯定也可以。 - Nosredna
1
是的,但今天我认为初学者必须了解这些概念... 他将能够更快地开发出更复杂、可维护的应用程序! - Matthieu
显示剩余2条评论

1

我不同意这里很多答案...从头开始学习并不是一件坏事。

我不会用C语言开发一个完整的应用程序,但用C语言编写一个小应用程序肯定是学习该语言、理解win32 API(更可能的是厌恶它)的好方法。

此外,如果你没有经历旧的痛苦方式,你就无法真正欣赏新的语言/框架为你带来的便利。

话虽如此,也要认识到现在有新的语言和框架出现了,也要学习它们;尤其是如果你想找工作的话。


1
如果您深入研究Win32 API并遇到MsgWaitForMultipleObjectsEx,那么您会讨厌.NET BCL API……因为在.NET中,所有文件和网络活动都是同步函数,事件仅用于GUI,而Win32允许一切成为事件,这是编程的一种更一致和高效的方式。 - Ben Voigt

1

1

虽然我不会说学习C是浪费时间,但我猜你最终不会停在这里。

如果你真的想要快速入门,而且不想花太多力气的话,我强烈建议你获取以下资源:

这应该基本上就能满足你的需求了。你将拥有所有需要的东西,Petzold 从简单开始,并逐步提高,让你制作出有趣的应用程序而不会让你失望。

(你可能会想知道为什么我和许多其他人会在你特别说已经阅读和学习了C之后将你引导到C#或其他语言。这是因为使用旧的Win32 API在Windows中进行编程更加繁琐。 它很容易因为必须输入的大量额外代码而感到不知所措。)


你为什么要将一个显示完整GUI并在屏幕上绘制“Hello World”的Win32应用程序与C#控制台应用程序进行比较呢?这就像是在比较苹果和垃圾桶。是的,C# GUI应用程序仍然比Win32 GUI应用程序更容易,所以你的观点仍然成立,但我很困惑为什么你要这样做。 - Rob
你可以将基本的Hello world控制台程序与Win32窗口应用程序进行比较。#include <stdio.h> int main(void) { printf("你好,世界"); return 0; } - toto
这两个程序是不可比较的。如果你要在C#中使用MessageBox.Show(),那么C版本应该是一个调用MessageBox()的一行代码。 - ChrisV
好的,算了吧。虽然它们略有不同,但我只是想说明一个观点。都过去了。 - Beska

1
在微软,我们一直在努力为简单创建Windows应用程序提供一些很棒的资源。我们的页面开始使用Windows 7编程将提供大量中高级程序员的新资源。
我们正在开发两个非常重要的新学习系列:
- Hilo项目:一个从头开始构建的应用程序,展示如何使用最现代的编程和应用程序设计方法专门针对Windows 7功能开发程序。 - Windows编程入门模块:由微软的开发人员教育专家编写的Windows编程介绍。这个模块更符合您的需求,我建议您去看看。
我们正在努力在Windows开发人员中心上尽可能地展示学习资源,这是一个为新手开发Windows或新手使用最新Windows功能开发的开发人员学习资源集合。
通过MSDN主页上的新Home和Hub资源,还会有更多的指导信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接