WIN32 API_第一课时、简单WIN32程序的创建

  由于之前的学习一直局限于语言基础的部分,而又对有窗体的程序感觉非常有兴趣,当然估计有很多的同学与我有着一样的疑惑,为什么我编写的程序跟我用的程序不太一样,我编写的程序都是一个一个的黑框框,而我平时在电脑上所使用的程序都是有着精美的界面。我便以一个学习者的身份来表达一下我对这些的理解,如有不正之处欢迎指点。

  随着学习的深入,也了解到了黑框框和五花八门的窗体之间的关系,知道什么是所谓的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

时间也不早了,今天先到这里,明天继续记录,这是第一课时的内容!

时间: 2024-10-14 15:49:00

WIN32 API_第一课时、简单WIN32程序的创建的相关文章

SpringMVC -- 第一个简单的程序

学习springMVC,我们来记录下第一个HelloWord的程序 首先.我们组织须要的jar包 commons-logging-1.1.3.jar spring-aop-4.1.7.RELEASE.jar spring-beans-4.1.7.RELEASE.jar spring-context-4.1.7.RELEASE.jar spring-core-4.1.7.RELEASE.jar spring-expression-4.1.7.RELEASE.jar **spring-web-4.1

C#第一个简单小程序——计算机

1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 11 namespace De

DuiLib学习笔记2——写一个简单的程序

我们要独立出来自己创建一个项目,在我们自己的项目上加皮肤这才是初衷.我的新建项目名为:duilibTest 在duilib根目录下面有个 Duilib入门文档.doc 我们就按这个教程开始入门 首先新建一个win32项目 去DuiLib根目录,把目录下DuiLib文件夹拷贝到新建项目的根目录.再把这个项目添加进我们解决方案中. 从教程里面把以下代码粘贴到我们项目的stdafx.h中 // Duilib使用设置部分 #pragma once #define WIN32_LEAN_AND_MEAN

2015-08-25 php大力力017 来来来,庆祝一下&#127873;大力力第一个数据库录入程序完成!

庆祝一下?? 1 <?php 2 $sql_connection = mysql_connect("localhost","ershugong","tuoqiangshijie"); 3 echo mysql_error(); 4 //设置字符集 5 mysql_query("set names utf8"); 6 //选择数据库 7 mysql_select_db("dalili"); 8 9 if

《Java项目实践》:简单聊天程序

<Java项目实践>:简单聊天程序 由于这个简单程序,还是涉及到很多的知识点,下面我们就一点一点的来完成. 我们熟悉的QQ聊天,就有一个界面,是吧,我们自己做一个简单的聊天程序,因此我们也就需要为Client写一个界面.因此,这就是我们第一步需要完成的任务. 第一步:为Client端写一个界面 完成一个界面有两种方法,一种是使用Frame对象来完成,另外一种是继承JFrame类来完成.本项目使用第二种. 第二种继承JFrame类完成的界面的程序如下: public class ChatClie

16.2 最简单界面程序(2)

添加自定义按钮的例子: #python 3.4 import sys import PySide from PySide.QtGui import QApplication from PySide.QtGui import QMessageBox # 创建应用程序对象 app = QApplication(sys.argv) # 创建简单的对话框 msgBox = QMessageBox() connectButton = msgBox.addButton("连接", QMessage

第一课时之c#程序设计概述

第一章 c#程序设计概述 本章学习目标: c#语言的主要特点 Visual Studio 2008/2017的集成开发环境 c#控制台应用程序和Windows窗体应用程序设计步骤 c#程序代码的基本书写规则和应用程序结构 1.1c#语言简介 C# 是一个简单的.现代的.通用的.面向对象的编程语言,它是由微软(Microsoft).NET公共语言运行环境中内置的核心程序设计语言.使用c#语言可以开发在.NET Framework上运行的多种应用程序,包括:控制台应用程序,Windows窗体应用程序

用一个简单小程序谈import和from...import的区别

今天在自己写代码的过程中,设计到随机种子数量(参数),因为一个文件中可能用到这个参数不止一次甚至是不止一个文件会用到这个参数.对于训练一个数据集来说,如果当你的性能跑的差不多的话,肯定会改这个参数,那如果你在函数中给这个参数直接赋了值,后期改的时候牵动会很大,所以这个时候就要想着在另一个文件中单独定义这个参数,在其他文件中来调用.这个时候就涉及到了在一个文件中导入另一个文件中包含的某些功能比如类和函数. 自己特意写了简单的程序帮理解:先说明我是在test1文件中定义两个函数sum1()和sum2

图解简单C程序的运行时结构

程序在内存中的存储分为三个区域,分别是动态数据区.静态数据区和代码区.函数存储在代码区,全局变量以及静态变量存储在静态数据区,而在程序执行的时候才会在动态数据区产生数据.程序执行的本质就是代码区的指令不断执行,驱使动态数据区和静态数据区产生数据变化. 代码区与动态数据区由三个寄存器控制,分别是eip.ebp和esp.eip指向代码区下一个要执行的指令,ebp与esp分别指向动态数据区的栈底和栈顶.初始情况下eip默认指向main函数的第一条指令,esp.ebp指向的位置由程序加载时内核的设置决定