`
thecloud
  • 浏览: 951401 次
文章分类
社区版块
存档分类
最新评论

WINDOWS编程入门一个初级问题的分析

 
阅读更多

#include <windows.h> //包括了所有基本的WINDOWS API函数,写WIN32应用程序必须包含


LRESULT CALLBACK WndProc(HWND hMainWnd,UINT message,WPARAM wParam,LPARAM lParam)

//LRESULT 是函数的类型,CALLBACK声明了函数参数的调用顺序。详情请看这里。
{

switch(message) //建立消息循环。关于消息请看这里。
{
case WM_DESTROY: //如果是WM_DESTROY消息,进入这个处理过程
{
PostQuitMessage(0); //退出
return 0;
}
default:
break;
}
//以下这个函数是调用默认的消息处理函数
return DefWindowProc(hMainWnd,message,wParam,lParam);
}

//这里要注意了,这里是程序的入口点,相当于DOS里的 main()函数,只不过参数都了些。
int CALLBACK WinMain(HINSTANCE hInstance, //这个参数是实例句柄
HINSTANCE hPrevInstance, //上一个实例句柄
LPSTR lpszCmdParam, //命令行字符串
int nCmdShow)
{
MSG message; //定义消息数据结构
WNDCLASS myWC; //定义窗口风格
HAND hMainWnd; //窗体句柄
char szAppTitle[]="API建立的程序"; //应用程序标题字符串
char szAppName[]="WinAPIDemo"; //应用程序名
if(! hPrevInstance)
{ //以下的定义是关于窗口参数的
myWC.style = CS_HREDRAW | CS_VREDRAW;
myWC.lpfnWndProc=WndProc;
myWC.cbClsExtra= 0;
myWC.cbWndExtra =0;
myWC.hInstance=hInstance;
myWC.hIcon=LoadIcon(NULL,IDI_INFORMATION);
myWC.hCursor=LoadCursor(NULL,IDC_HELP);
myWC.hbrBackground=GetStockObject(WHITE_BRUSH);
myWC.lpszClassName=szAppName;
myWC.lpszMenuName = NULL;
RegisterClass(&myWC); //注册窗体
}
hMainWnd=CreateWindow(szAppName, //创建窗体
szAppTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hMainWnd,SW_SHOWMAXIMIZED); //显示窗体

UpdateWindow(hMainWnd); //更新窗体
while(GetMessage(&message,NULL,0,0)) //建立消息循环
{
TranslateMessage(&message);
DispatchMessage(&message);

}
return (TRUE);
}

这里面最让人不明白的就是数据类型了。当你学完标准的C后,你看这个程序,就跟看天书一样,很多的东西你明白语法,但是就是看不懂。所以,首先我来说一下WINDOWS编程里的数据类型。

以下数据取自于VC6 Include目录下的“windef.h”文件。

#define CALLBACK PASCAL
#define WINAPI CDECL
#define WINAPIV CDECL
#define APIENTRY WINAPI
#define APIPRIVATE CDECL

#define PASCAL __pascal

#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall

typedef unsigned long DWORD;
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef float FLOAT;

typedef int INT;
typedef unsigned int UINT;

typedef UINT WPARAM;
typedef LONG LPARAM;
typedef LONG LRESULT;

你可以看到,这里面有很多的定义的本质是一样的,为的只是便于阅读而已。其实,WIN32环境下只有一种数据类型,就是32BIT整形,其他的都是来自于这里。而且,绝大部分数据类型直接就是32BIT的。这样,你所要做的事情,就是熟悉这些名字,详情见《WIN32数据类型入门》

int CALLBACK WinMain()。这个函数是WIN32程序的入口,就象DOS下的main(),不同的是main函数的参数是可选的,WinMain函数的参数是必须的。相同的是,main和WinMain都不是给程序员调用的,而是有系统调用的。在C里面,main是没有返回值的,我们看到WinMain是有返回值的,它是用 int CALLBACK 来修饰的。CALLBACK 说明了WinMain函数参数调用的顺序。int是说明了函数的返回值。关于CALLBACK的意义,请参考《WIN32函数压栈顺序》。根据“windef.h”文件的定义,WinMain函数的修饰符的写法也不是唯一的。你可以有很多中写法。例如:INT PASCAL WinMain(),int __stdcall WinMain()。这些写法其实本质是一样的,只是为了不同的风格。

下面,的语句很多书里都有介绍,我就不详细说了,如果你还不熟悉,请看《WIN32数据类型入门》

当你把程序全部书写完毕后,你会保存为一个C文件,在这里我保存为了miniwin.c。当你双击这个文件就会用VC6打开。这时候你首先要看看,你的程序有没有语法错误了,VC++可以帮你自动完成这个工作。选择Build-->>Compile winiwin.c。根据,我的经验,很多第一次手工输入这个程序的人,都会出现各种各样的错误,这个问题比较简单,一般都是拼写错误。对照上面的程序就可以了。当你点下菜单按纽后,出现一个消息框,提示你没有建立相关的工程,你直接选yes,VC会自动帮你建立的(看看你保存miniwin.c的目录下,是不是多了很多文件呀)。如果,你的程序拼写没问题的话,你将看到:miniwin.obj - 0 error(s), 0 warning(s)。这就是说明了,编译已经通过了。然后就是LINK了。你在Build菜单先选择“建立EXE”的选项。本来是可以建立的,但是VC却提示:Linking...
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/miniwin.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

miniwin.exe - 2 error(s), 0 warning(s)
这个问题几乎存在于所有的VC入门教材里,程序有问题吗?显然不是的,上面的这个程序是正确的。问题出在这里了。请你选择Project-->>Setting,选择Link选项卡,最底下有个Project Options删除里面的/subsystem:console,按OK保存。然后再建立EXE试试。看到这个提示了吗?miniwin.exe - 0 error(s), 0 warning(s)。如果有,恭喜你,成功了。这时候在DEBUG目录下会有一个EXE文件,双击它,一个简单的窗体就出现在你面前了。

至此,你已经可以建立WIN32程序了,这个程序是一个框架,里面是最基本的东西 . 

分享到:
评论

相关推荐

    初级3D编程入门书籍———Windows游戏编程大师技巧(第二版).chm

    初级3D编程入门书籍———Windows游戏编程大师技巧(第二版).chm

    SolidEdgeVisualBasic开发入门(初级)

    这本书籍首先会介绍SolidEdge的基础知识,包括用户界面、基本操作和设计流程,以便读者对软件有一个全面的认识。然后,它将详细讲解VisualBasic编程环境,包括VBScript语言的基本语法、变量、数据类型、控制结构(如...

    Windows API范例入门与提高

    总的来说,《Windows API范例入门与提高》初级教程是一本实用性很强的教材,适合有一定C/C++基础并希望深入学习Windows编程的初学者。通过系统学习,你将能够熟练地运用Windows API编写出高效、稳定的桌面应用程序。

    windows程序设计教程

    通过这个教程,你将不仅能够编写基本的Windows应用程序,还能掌握高级的Windows编程技巧,为将来开发复杂的桌面应用打下坚实的基础。在实践中,结合具体的代码示例和项目练习,将使你更好地理解和掌握这些知识,成为...

    VB 编程入门教程(强烈推荐)

    VB编程入门教程是一个非常适合初学者的学习资源,通过图文并茂的方式,帮助新手快速掌握编程基础。 本教程可能涵盖以下关键知识点: 1. **基本概念**:首先,你会了解到VB的基本概念,如编程环境、代码编辑器、...

    VC++初级编程.zip

    第一章 VC入门 1.1 如何学好VC 1.2 理解Windows消息机制 1.3 利用Visual C++/MFC开发Windows程序的优势 1.4 利用MFC进行开发的通用方法介绍 1.5 MFC中常用类、宏、函数介绍 第二章 图形输出 2.1 和GUI有关的各种对象...

    c#编程 初级学习者入门

    C#编程语言是微软公司开发的一种面向对象的、现代的编程语言,被广泛应用于Windows桌面应用、游戏开发、Web应用以及移动应用等多个领域。对于初级学习者来说,掌握C#的基础知识是至关重要的,这包括语法结构、基本...

    java语言入门,编程入门教程

    Java编程入门通常会包括以下几个关键知识点: 1. **环境搭建**:学习者需要安装Java Development Kit (JDK),配置好环境变量,如JAVA_HOME、Path等,以便于编译和运行Java程序。 2. **基础语法**:包括数据类型...

    长沙APP软件计算机编程入门.docx

    然后,可以回头学习C++的初级内容,比如《C++ Primer中文第四版》,以及进一步深入学习Windows编程,如《VC初级教程》和《MFC深入浅出第二版》。 学习编程的动机多种多样,包括找工作、提升技能、满足实际需求、...

    windows高级编程指南(第三版)(Jeffrey Richter著 王书洪翻译)

    7. **系统调用和驱动程序**:虽然不是初级开发者通常涉及的领域,但书中仍然对系统调用和驱动程序编写进行了简要介绍,为有兴趣的读者提供了入门知识。 8. **调试技术**:包括使用调试工具如WinDbg,以及调试技巧和...

    C# 初级者天堂——入门教程 PDF

    ASP.NET MVC(Model-View-Controller)模式也是教程中的一个重要部分,它是一种流行的Web开发架构,强调分离关注点,提高代码的可读性和可维护性。你将了解到如何使用路由、控制器和视图来组织应用逻辑,并通过C#...

    qt开发初级入门

    跨平台开发能力是Qt框架的一个重要特点,它支持许多操作系统,如Windows、Mac OS X、Linux、Unix、Android和iOS等。 标签"qt"为我们指明本文档的主题焦点,即所有的内容都是围绕Qt框架的使用和开发技巧。 根据提供...

    编程入门学习

    编程入门学习是一个广阔而深奥的主题,涉及到许多不同的方面。首先,我们从计算机导论开始,这是理解计算机科学的基础,虽然它可能不涉及具体的编程内容,但能让你对计算机硬件、操作系统、网络等方面有一个基本的...

    C#程序设计初级入门书

    《C#程序设计初级入门书》是一本专为初学者设计的编程教程,旨在帮助新手快速掌握C#语言的基础知识,领略编程的乐趣。C#,由微软公司开发,是一种面向对象的、现代的编程语言,广泛应用于Windows平台、游戏开发、...

    游戏编程入门 directx C++ 课件 代码 第二2课

    结合"游戏编程入门"这个主题,我们可以深入探讨如何使用DirectX和C++进行游戏开发。 在DirectX中,主要包含以下几个组件: 1. Direct3D:这是DirectX的核心部分,负责处理图形渲染,包括3D模型、纹理、光照和阴影等...

    C++入门游戏编程 《网络象棋》源码

    总的来说,《网络象棋》项目涵盖了C++的基础语法、面向对象编程、网络编程和图形界面设计等多个方面,对于想要入门C++游戏编程的初学者,这是一个很好的实践平台。通过分析和修改这个游戏的源码,不仅可以加深对C++...

    php初级入门教程

    从给定的文件信息中,我们可以提取到关于PHP初级入门教程的关键知识点,下面将详细解析这些知识点: ### PHP初级入门教程概述 ...无论是构建简单的个人网站还是复杂的Web应用,PHP都是一个值得信赖的选择。

    java 快速入门 初级 易理解 让你快速突破编程障碍

    据说,这个名称的灵感来源于团队成员们在喝 Java 咖啡时的一次讨论,Java 岛是印度尼西亚的一个盛产咖啡的地方。 Java 的发展历程可以追溯到 1991 年,当时 Sun 公司试图进入消费电子产品市场,成立了“Green”小组,并...

    Visual Basic 编程入门到实战教程,含控制台与Windows Forms应用实例

    此外,还提供了两个实战案例——简单控制台应用与 Windows Forms 应用来帮助读者巩固理论知识。 适合人群:对编程有基本认知,想要进一步了解 VB.NET 或转型为 VB.NET 开发者的初级技术人员。 使用场景及目标:① ...

Global site tag (gtag.js) - Google Analytics