由于之前的学习一直局限于语言基础的部分,而又对有窗体的程序感觉非常有兴趣,当然估计有很多的同学与我有着一样的疑惑,为什么我编写的程序跟我用的程序不太一样,我编写的程序都是一个一个的黑框框,而我平时在电脑上所使用的程序都是有着精美的界面。我便以一个学习者的身份来表达一下我对这些的理解,如有不正之处欢迎指点。
随着学习的深入,也了解到了黑框框和五花八门的窗体之间的关系,知道什么是所谓的GUI(Graphic User Interface)。也在随着大多数学习者的脚步接触了MFC框架,同时也了解到还有QT图形库和现在主流的.NET框架下的WPF。但是在了解稍微多一些之后,也明白了更加底层一些,而比如MFC和WPF也只是对API的调用与封装罢了,如果是要学习,不会追求开发效率,那么使用WIN32 API能够更加灵活并且更为重要的是它能让编程者能够更加清晰地了解到窗体的构建过程,从而增强理解,何乐而不为呢?
由于还没入手经典的《Windows 程序设计》,便在网上找了一个还不错的教程,叫做"theForger‘s Win32 API":http://winprog.org/tutorial/
而今天由于一些事情的耽搁,也只进展了它的两个课时的内容:
首先作者放出了一个简单的小程序:
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow) {
MessageBox(NULL, "Goodbye, cruel world!", "Note", MB_OK);
return 0;
}
作者当然提醒的要以*.c来命名这段代码,但是我们当然不会止于他怎么说我们怎么做的地步,但是很不幸地以*.cpp保存的这段代码并不能通过编译,只好像作者所说的那样做咯,然后也顺利地编译成功并执行。
结果就如图所示(还是很想吐槽该作者这么悲观的情绪,不应该是"Hello World!"么?!效果跟我不一样也不要紧张,因为Win10就是这样的标题栏,刚开始我也很纠结)
既然成功执行的话,那么就让我们来分析一下这个小小小程序的代码:
首先是#include<windows.h>,这个头文件我并不熟悉,现在网络也不方便,而在MSDN中也没有查找到,就等网络方便的时候再仔细地了解一下它的作用吧。
接下来的就是WinMain()函数了,在MSDN中是这样说的"就像每个 C 应用程序和 C++ 应用程序都以 main 函数作为起点那样,每个基于 Win32 的应用程序同样必须要有 WinMain 函数。"那么我们仔细了解一下它:
The user-provided entry point for a graphical Windows-based application.
WinMain is the conventional name used for the application entry point.
通过这两句话我们了解到它跟C中的main()函数一样,但是它的参数确实值得细细琢磨
int CALLBACK WinMain(
_In_ HINSTANCE hInstance,
_In_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow
);
它的几个参数的解释是这样的:
hInstance [in]
Type: HINSTANCE
A handle to the current instance of the application.
应用程序当前实例的一个handle,这通常解释为一个"句柄",虽然我也不知道为什么这样翻译= =!
hPrevInstance [in]
Type: HINSTANCE
A handle to the previous instance of the application. This parameter is always NULL.
指向该程序上一个实例的句柄,这个参数通常为NULL
lpCmdLine [in]
Type: LPSTR
The command line for the application, excluding the program name.
To retrieve the entire command line, use the GetCommandLine function.
程序的命令行参数,是一个字符串,但是不包含程序名
nCmdShow [in]
Type: int
Controls how the window is to be shown.
控制这个窗口时怎么显示的
这是MSDN给的类型值的列表,作者说这是一个要传给ShowWindow()的整数,我们之后再看这个函数
http://msdn.microsoft.com/EN-US/library/ms633559(v=VS.85,d=hv.2).aspx
好了,接下来我们进入这个函数体:
MessageBox(NULL, "Goodbye, cruel world!", "Note", MB_OK);
又是一个函数的调用,顾名思义这是一个信息提示小窗口(因为它是一个Box,= =!)作者可能认为这个函数太简单,不愿意详细解释,那我们就来简单看看它吧
Displays a modal dialog box that contains a system icon, a set of buttons, and a brief application-specific message, such as status or error information.
The message box returns an integer value that indicates which button the user clicked.
显示一个包含系统图标,一些按钮,和简短有关程序的消息(诸如程序状态或者错误信息)的模态的对话框。(关于模态和非模态,后面应该会提到)这个消息窗口返回一个整型值指出用户点击了哪个按钮。
int WINAPI MessageBox(
_In_opt_ HWND hWnd,
_In_opt_ LPCTSTR lpText,
_In_opt_ LPCTSTR lpCaption,
_In_ UINT uType
);
我们来一起看一看这个函数的参数:
hWnd [in, optional]
Type: HWND
A handle to the owner window of the message box to be created.
If this parameter is NULL, the message box has no owner window.
一个句柄指出创建这个消息提示框的窗口,如果这个参数是NULL,那么它没有父窗口
lpText [in, optional]
Type: LPCTSTR
The message to be displayed.
将要被显示的消息
lpCaption [in, optional]
Type: LPCTSTR
The dialog box title.
If this parameter is NULL, the default title is Error.
这个对话框的标题,如果这个参数是NULL,默认的标题是Error
uType [in]
Type: UINT
The contents and behavior of the dialog box.
This parameter can be a combination of flags from the following groups of flags.
这个对话框的内容和表现(注意这里所指的内容并非它所显示的信息,所显示的信息由第二个参数所指示),这个参数可以由以下的标记结合在一起使用:
To indicate the buttons displayed in the message box, specify one of the following values.(按钮)
To display an icon in the message box, specify one of the following values.(图标)
To indicate the default button, specify one of the following values.(指示默认按钮)
To indicate the modality of the dialog box, specify one of the following values.(对话框形式)
To specify other options, use one or more of the following values.(其他选项)
返回值:
Return value
Type: int
If a message box has a Cancel button, the function returns the IDCANCEL value if either the ESC key is pressed or the Cancel button is selected.
If the message box has no Cancel button, pressing ESC has no effect.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
If the function succeeds, the return value is one of the following menu-item values.
这也就是完整的MessageBox()的说明了,如果想要更直观完整的资料就直接查看MSDN吧
http://msdn.microsoft.com/EN-US/library/ms645505(v=VS.85,d=hv.2).aspx
时间也不早了,今天先到这里,明天继续记录,这是第一课时的内容!