码迷,mamicode.com
首页 > Windows程序 > 详细

【win32】day01-Windows编程

时间:2016-08-04 06:49:20      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:

Windows编程基础知识的介绍

Win32应用程序的基本类型

1.1 控制台程序

   不需要完善的Windows窗口,可以使用DOS窗口的方式显示。

1.2 Win32窗口程序

    包含窗口的程序。可以通过窗口与程序进行交互。

1.3 Win32库程序

提供已有的代码,供其他程序使用。

动态库:DLL 是在执行的时候可以加载的程序。

静态库:LIB 是在编译链接是使用的程序。

1.4 对比

1.4.1 程序的入口函数不同

     控制台:main

     Win32窗口程序:WinMain

     动态库DLLDllMain

     静态库LIB:无         

1.4.2 编译链接后存在的形式不同

     控制台和Win32窗口程序:EXE文件,可以执行

     动态库DLLDLL文件,无法执行

     静态库LIBLIB文件,无法执行         

1.4.3 执行结果不同

     控制台:使用DOS窗口,自己没有窗口。

     Win32窗口程序:会产生自己的窗口,可以将结果输出或者从窗口接受输入。

     动态库DLL:自己无法执行,提供可以执行的代码,EXE等程序执行时,可以使用这些代码.执行时,该库必须在指定的路径.

     静态库LIB: 自己无法执行,提供给程序在编译链接时使用,将库中的代码嵌入到程序当中.执行时,不需要该库存在.    

Win32窗口程序和编译环境

2.1 开发和编译环境

   VC1.5 - VC6.0(2008) - VC10.0(2010)  

   2.1.1 编译器 CL.EXE

     将原代码编译目标代码. OBJ文件.

   2.1.2 链接器 Link.EXE

     OBJ文件和库函数链接.生成EXE.

   2.1.3 资源编译器 rc.exe

     将资源脚本编译成可以链接的文件(RES).

2.2 头文件和库

   2.2.1 头文件 windows.h包含了windows

     常用的定义等.其他,还包含了一些其他的

     头文件:

    windef.h - 定义了各种的数据类型

winbase.h- 定义了kernel的相关函数

wingdi.h - 定义了绘图和文字

winuser.h- 窗口 控件等函数

winnt.h - 提供Unicode支持

 

2.2.2

     kernel32.lib - 提供进程/线程/内存等等

     API函数支持

     user32.lib - 包括窗户/界面等等.

     gdi32.lib  - 提供绘图/文字等。

   

2.3 Hello World程序

2.3.1 入口函数

     int WinMain(

        HINSTANCE hInstance,

        HINSTANCE hPrevInstance,

        LPSTR pszCmdLine,

        int  nShowCmd )

    

   hInstance - 应用程序的实例句柄     

   hPrevInstance - 该应用程序的前一个实例句柄

   pszCmdLine - 命令行参数

   nShowCmd - 窗口的显示方式

   

2.3.2 MessageBox

   

2.4 编译环境的准备

   VC98BIN目录下VCVARS32.BAT   

C:\Users\wuyq\Desktop>cl h.c
'cl' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
C:\Users\wuyq\Desktop>"C:\Program Files\Microsoft Visual Studio 12.0\VC\bin\vcv
rs32.bat"
C:\Users\wuyq\Desktop>cl h.c
用于 x86 的 Microsoft (R) C/C++ 优化编译器 18.00.21005.1 版版权所有(C) Microsof
 Corporation。  保留所有权利。
h.c
Microsoft (R) Incremental Linker Version 12.00.21005.1
Copyright (C) Microsoft Corporation.  All rights reserved.
/out:h.exe
h.obj

或者借助开发人员工具命令行:

技术分享

2.5 编译CL.EXE

CL的常用选项

/c 只编译不链接

/TC 编译C文件

/TP 编译C++文件

如果不指定,CL会根据文件类型自动区分

    /I 头文件所在路径

    字符大小写敏感

2.6 链接LINK.EXE

LINK常用选项:

   /out:文件名,链接成指定文件名的程序

/LIBPATH:LIB文件存放的路径, /LIBPATH:"E:\XXX"

/SUBSYSTEM: CONSOLE/WINDOW

字符大小写不敏感

2.7 执行

    正常执行或带参数执行

helloworld.c

#include <windows.h>

int WINAPI WinMain( 
             HINSTANCE hInstance,
             HINSTANCE hPrevInstance,
             LPSTR pszCmdLine,
             int  nShowCmd )
{
	MessageBox( NULL, pszCmdLine, 
		"FirstWin32", MB_OK );
	
	return 0;
}

Cl helloworld.c /c

Link helloworld.obj user32.lib

helloworld  

第一个窗口程序

3.1 入口函数WinMain

3.2 窗口处理函数

    当窗口处理消息事件时,系统调用该函数

    LRESULT CALLBACK WindowProc(

  HWND hwnd,      // 窗口的句柄

     UINT uMsg,      // 消息的ID

     WPARAM wParam,  // 消息所对应的参数

     LPARAM lParam   // 消息所对应的参数

);

3.3 注册窗口类型

    typedef struct _WNDCLASS {

     UINT    style;  //窗口类的风格

     WNDPROC lpfnWndProc; //窗口处理函数

     int     cbClsExtra; //窗口类附加数据大小

     int     cbWndExtra; //窗口附加数据大小

     HANDLE  hInstance; //当前应用程序的实例句柄

     HICON   hIcon; //窗口图标

     HCURSOR hCursor; //窗口的鼠标

     HBRUSH  hbrBackground; //窗口的背景画刷

     LPCTSTR lpszMenuName; //菜单

     LPCTSTR lpszClassName; //类型名称

    } WNDCLASS;

    注册函数 RegisterClass

3.4 创建窗口

     HWND CreateWindow(

   LPCTSTR lpClassName,  //窗口类型名称

   LPCTSTR lpWindowName, //窗口名称

   DWORD dwStyle,        //窗口类型

   int x,                //窗口的左上角X坐边

   int y,                //窗口的左上角X坐边

   int nWidth,           //窗口的宽度

   int nHeight,          //窗口的高度

   HWND hWndParent,      //父窗口句柄

   HMENU hMenu,          //窗口菜单句柄

      HANDLE hInstance,     //应用程序的实例句柄

      LPVOID lpParam        //创建的参数,一般为NULL

  );

3.5 显示窗口

     ShowWindow 显示窗口

        BOOL ShowWindow(

   HWND hWnd,     //显示的窗口句柄

      int nCmdShow   //显示的方式

);

     UpdateWindow 刷新窗口

3.6 消息处理

     GetMessage 获取消息

     DispatchMessage 派发消息   

3.7 程序退出

     窗口销毁时,退出程序。在WndProc中实现。

        WM_DESTROY: 当窗口销毁时,会调用WndProc传递给使用者。

        PostQuitMessage:发送一个退出消息。

技术分享

Hellownd.c

#include <windows.h>

HINSTANCE g_hInst = NULL;

//2 窗口处理函数
LRESULT CALLBACK WndProc( HWND hWnd, 
                          UINT nMsg, 
                          WPARAM wParam,
                          LPARAM lParam )
{
	//判断消息ID
	switch( nMsg )
	{
	case WM_DESTROY: //窗口销毁的消息
		PostQuitMessage( 0 ); //发送退出消息
		return 0;
	}
	//调用缺省的消息处理程序
	return DefWindowProc( hWnd, nMsg, 
		wParam, lParam );	               
}

//3 注册窗口类型
BOOL MyRegister( LPSTR pszClassName )
{
	WNDCLASS wc = {0};
	ATOM  nAtom = 0;
	//构造注册窗口的参数
	wc.style         = CS_VREDRAW|CS_HREDRAW;
	wc.lpfnWndProc   = WndProc;
	wc.cbClsExtra    = 0;
	wc.cbWndExtra    = 0;
	wc.hInstance     = g_hInst;
	wc.hIcon         = NULL;
	wc.hCursor       = NULL;
	wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE);
	wc.lpszMenuName  = NULL;
	wc.lpszClassName = pszClassName;
	//注册窗口
	nAtom = RegisterClass( &wc );
	if( 0 == nAtom )
	{
		MessageBox( NULL, "Register Failed",
		  "Error", MB_OK|MB_ICONWARNING );
		return FALSE;
	}
	else
	{
		MessageBox( NULL, "Register Successed",
		  "Successed", MB_OK );
	}
	return TRUE;
}

//4 窗口创建
HWND MyCreate( LPSTR pszClassName )
{
	HWND hWnd = NULL;
	//创建窗口
	hWnd = CreateWindow( pszClassName, 
			"HelloWnd", WS_OVERLAPPEDWINDOW,
			100, 100, 300, 500, NULL, NULL,
			g_hInst,	NULL );
	if( NULL == hWnd )
	{
		MessageBox( NULL, "CreateWnd Failed", 
		  "Error", MB_OK );
		return NULL;
	}
  MessageBox( NULL, "CreateWnd Successed", 
		  "Successed", MB_OK );
	return hWnd;
}

//5 显示窗口
void DisplayWnd( HWND hWnd )
{
	//显示
	ShowWindow( hWnd, SW_SHOW );
	//刷新
	UpdateWindow( hWnd );
}
//6 消息处理
void Message( )
{
	MSG msg = { 0 };
	//消息循环处理,获取消息
	while( GetMessage( &msg, NULL, 0, 0 ) )
	{
		//派发消息
		DispatchMessage( &msg );
	}
}
//1 入口函数
int WINAPI WinMain( HINSTANCE hInst,
                    HINSTANCE hPrevInst,
                    LPSTR pszCmdLine,
                    int   nShowCmd )
{
	HWND hWnd = NULL;
	g_hInst = hInst;
	//注册窗口类型
	MyRegister( "MyWnd" );
	//创建注册类型的窗口
	hWnd = MyCreate( "MyWnd" );
	//显示窗口
	DisplayWnd( hWnd );
	//消息处理
	Message( );
	return 0;
}

Cl hellownd.c /c

Link hellownd.obj user32.lib

hellownd

资源的处理

4.1 资源和资源脚本

   资源:ICON/CUSRUR/BITMAP/MENU......

   资源脚本: 扩展名为rc文件。

4.2 编译资源

   使用rc.exe编译资源,生成RES文件

4.3 链接资源

   使用link.exeRES文件链接到程序当中

4.4 ICON的使用

  LoadIcon从指定程序中加载ICON资源。

Hellownd.c

#include <windows.h>

HINSTANCE g_hInst = NULL;

//2 窗口处理函数
LRESULT CALLBACK WndProc( HWND hWnd, 
                          UINT nMsg, 
                          WPARAM wParam,
                          LPARAM lParam )
{
	//判断消息ID
	switch( nMsg )
	{
	case WM_DESTROY: //窗口销毁的消息
		PostQuitMessage( 0 ); //发送退出消息
		return 0;
	}
	//调用缺省的消息处理程序
	return DefWindowProc( hWnd, nMsg, 
		wParam, lParam );	               
}

//3 注册窗口类型
BOOL MyRegister( LPSTR pszClassName )
{
	WNDCLASS wc = {0};
	ATOM  nAtom = 0;
	//构造注册窗口的参数
	wc.style         = CS_VREDRAW|CS_HREDRAW;
	wc.lpfnWndProc   = WndProc;
	wc.cbClsExtra    = 0;
	wc.cbWndExtra    = 0;
	wc.hInstance     = g_hInst;
	wc.hIcon         = LoadIcon( g_hInst, 
			MAKEINTRESOURCE( 100 ) );//MAKEINTRESOURCE  将整数转为字符串 
	wc.hCursor       = NULL;
	wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE);
	wc.lpszMenuName  = NULL;
	wc.lpszClassName = pszClassName;
	//注册窗口
	nAtom = RegisterClass( &wc );
	if( 0 == nAtom )
	{
		MessageBox( NULL, "Register Failed",
		  "Error", MB_OK|MB_ICONWARNING );
		return FALSE;
	}
	else
	{
		MessageBox( NULL, "Register Successed",
		  "Successed", MB_OK );
	}
	return TRUE;
}

//4 窗口创建
HWND MyCreate( LPSTR pszClassName )
{
	HWND hWnd = NULL;
	//创建窗口
	hWnd = CreateWindow( pszClassName, 
			"HelloWnd", WS_OVERLAPPEDWINDOW,
			100, 100, 300, 500, NULL, NULL,
			g_hInst,	NULL );
	if( NULL == hWnd )
	{
		MessageBox( NULL, "CreateWnd Failed", 
		  "Error", MB_OK );
		return NULL;
	}
  MessageBox( NULL, "CreateWnd Successed", 
		  "Successed", MB_OK );
	return hWnd;
}

//5 显示窗口
void DisplayWnd( HWND hWnd )
{
	//显示
	ShowWindow( hWnd, SW_SHOW );
	//刷新
	UpdateWindow( hWnd );
}
//6 消息处理
void Message( )
{
	MSG msg = { 0 };
	//消息循环处理,获取消息
	while( GetMessage( &msg, NULL, 0, 0 ) )
	{
		//派发消息
		DispatchMessage( &msg );
	}
}
//1 入口函数
int WINAPI WinMain( HINSTANCE hInst,
                    HINSTANCE hPrevInst,
                    LPSTR pszCmdLine,
                    int   nShowCmd )
{
	HWND hWnd = NULL;
	g_hInst = hInst;
	//注册窗口类型
	MyRegister( "MyWnd" );
	//创建注册类型的窗口
	hWnd = MyCreate( "MyWnd" );
	//显示窗口
	DisplayWnd( hWnd );
	//消息处理
	Message( );
	return 0;
}

Hellownd.rc

100 ICON "window.ico"

hellownd.c

Window.ico 这个图标可以自己进行制作

hellownd.rc

资源编号 资源类型资源的使用文件

 

编译的过程:

rc hellownd.rc

会生成hellownd.RES文件

 

cl hellownd.c /c

 

link hellownd.obj hellownd.res user32.lib

此时会生成带ico图标的exe可执行文件

技术分享

NMAKEMakefile

1.1 NMAKE - 命令解释器,根据Makefile文件中定义的脚本,完成项目的编译等操作。

 

1.2 Makefile - 定义编译/链接等脚本语言。

  

1.3 Makefile文件的编写

1.3.1 基本语法规则

      window.exe:window.obj // 依赖行

     cl.exe window.c /c    // 命令行

     link.exe window.obj user32.lib

  

    window.exe的依赖项是window.obj,如果window.obj被重新改写,window.exe将重新生成.通过时间戳(time stamp)判断程序是否需要重新编译链接,如果当文件修改最后时间与时间戳不同,将会重新编译链接.

1.3.2 执行过程

  1 NMAKE首先找到第一个依赖行,根据依赖行之间的关系,建立依赖树。例如:

         A:B

         B:C

         C:D

      NMAKE会建立对应的依赖树

         A

         |-B

           |-C

             |-D

  2 在树建好后,NMAKE会首先执行D的命令行,然后依次执行父结点的命令行

  3 A的命令执行结束后,退出NMAKE.

  4 如果需要执行指定依赖行,需要在执行NMAKE时增加依赖行的名称。

        NMAKE /f Makefile.mak B <--指定从B执行

 

1.4 使用

  1.4.1 NAMKE指定文件名

NMAKE /f Makefile.mak

  1.4.2 使用缺省文件名Makefile

NMAKE在执行时会自动查找这个文件.

 

Makefile文件夹下面新建一个windows.chelloworld程序,makefile.mak

 

#nmake /f makefile.mak

技术分享

Windows.c

#include <windows.h>

int WINAPI WinMain( HINSTANCE hInst,
                    HINSTANCE hPrevInst, 
                    LPSTR pszCmdLine,
                    int nShowCmd )
{
	
	MessageBox( NULL, "Hello World", 
		"Hello", MB_OKCANCEL );
	return 0;
}

 Makefile.mak

window.exe:window.obj
	cl.exe window.c /c
	link.exe window.obj user32.lib

Makefile2.mak

CPP=cl.exe
CPP_FLAG="/c"
LINK32=link.exe
LINK_LIB=user32.lib

ALL:CLEAN
	@echo Building....
	$(CPP) $(CPP_FLAG) window.c
	$(LINK32) $(LINK_LIB) window.obj /out:window.exe

CLEAN:
	@echo Deleting....
	del *.obj
	del *.exe

INSTALL:

技术分享


【win32】day01-Windows编程

标签:

原文地址:http://blog.csdn.net/waldmer/article/details/52103045

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!