王朝网络
分享
 
 
 

Visual C++ 入门精解

王朝vc·作者佚名  2008-06-01
宽屏版  字体: |||超大  

程序作者:管宁个人网站:www.cndev-lab.com VC作为一个主流的开发平台一直深受编程爱好者的喜爱,但是很多人却对它的入门感到难于上青天,究其原因主要是大家对他错误的熟悉造成的,严格的来说VC++不是门语言,虽然它和C++之间有密切的关系,假如形象点比喻的话,可以C++看作为一种”工业标准”,而VC++则是某种操作系统平台下的”厂商标准”,而”厂商标准”是在遵循”工业标准”的前提下扩展而来的。

VC++应用程序的开发主要有两种模式,一种是WIN API方式,另一种则是MFC方式,传统的WIN API开发方式比较繁琐,而MFC则是对WIN API再次封装,所以MFC相对于WIN API开发更具备效率优势,但为了对WINDOWS开发有一个较为全面细致的熟悉,笔者在这里还是以讲解WIN API的相关内容为主线。

话说到这里可能更多人关心的是学习VC++需要具备什么条件,为什么对于这扇门屡攻不破呢?

要想学习好VC必须具备良好的C/C++的基础,必要的英语阅读能力也是必不可少的,因为大量的技术文档多以英文形式发布。

许多初学VC++的人对于它怪异的写法和程序奇异的工作方式非常不理解,为了帮助大家对它的入门有一个比较概括的了解,我们把这一小节内容分成若干部分讲解。

第一部分:VC++中的对象的命名规则、常用宏定义的命名,以及VC++下的数据类型。

注:这部分简单浏览即可。

第二部分:VC++常用技术术语的解释。

第三部分:HelloWin程序的具体分析。

更多内容请看C/C++技术学堂 C/C++技术专题 Solaris基础知识入门专题,或

第一部分

匈牙利命名法规则

一般情况下,变量的取名方式为:

<scope_> + <prefix_> + <qualifier>。

范围前缀_,类型前缀_,限定词。

非凡的类型命名,前缀表示:

类、接口

前缀

类型

例子

备注

Lm

Class

LmObject

表示类型本身

不与范围前缀结合使用

I

Interface 接口

IUnknown

注:类名前缀改为Lm,对于非全局的类最好有语义表示其所属模块。类的实例命名与类名大致相同,只是类名语义表示类的通用含义,而类名表示此实例的具体语义。如类名LmSketPoint表示草图点的类定义,而它的两个实例 _StartPoint,_EndPoint分别代表起点和终点的语义。类的实例命名带上前缀_。

非凡约定:

a. MouseTool的派生类的前缀为_Mt.

b. 对话框类的前缀为CDlg.

c. 橡皮条类的前缀为_Rb.

凡围前缀:

前缀

类型

例子

备注

g_

全局作用域

g_Servers

m_

成员变量

m_pDoc,

l_

局部作用域

l_strName

少用

注:编程时尽量少用全程变量,对于全程变量还应在类型前缀后加上如下要害字:

特征模块 : Fea

草图模块 : Sket

装配模块 : Asm

工程图模块: Lay

曲面模块 : Surf

界面模块 : Ui

常用的一般数据类型的前缀

前缀

类型

内存规格描述

例子

ch

char

8-bit character

chGrade

ch

TCHAR

16-bit character if _UNICODE is defined

chName

b

BOOL

Boolean value

bEnabled

n

int

Integer (size dependent on operating system)

nLength

n

UINT

Unsigned value (size dependent on operating system)

nLength

w

Word

16-bit unsigned value

wPos

l

LONG

32-bit signed integer

lOffset

dw

DWORD

32-bit unsigned integer

dwRange

p

*

Ambient memory model pointer

pDoc

lp

FAR*

Far pointer

lpDoc

lpsz

LPSTR

32-bit pointer to character string

lpszName

lpsz

LPCSTR

32-bit pointer to constant character string

lpszName

lpsz

LPCTSTR

32-bit pointer to constant character string if _UNICODE is defined

lpszName

h

handle

Handle to Windows object

hWnd

lpfn

(*fn)()

callbackFar pointer to CALLBACK function

lpfnAbort

常用Windows对象名称缩写

Windows 对象

例子变量

MFC类

例子对象

HWND

hWnd;

CWnd*

pWnd;

HDLG

hDlg;

CDialog*

pDlg;

HDC

hDC;

CDC*

pDC;

HGDIOBJ

hGdiObj;

CGdiObject*

pGdiObj;

HPEN

hPen;

CPen*

pPen;

HBRUSH

hBrush;

CBrush*

pBrush;

HFONT

hFont;

CFont*

pFont;

HBITMAP

hBitmap;

CBitmap*

pBitmap;

HPALETTE

hPalette;

CPalette*

pPalette;

HRGN

hRgn;

CRgn*

pRgn;

HMENU

hMenu;

CMenu*

pMenu;

HWND

hCtl;

CStatic*

pStatic;

HWND

hCtl;

CButton*

pBTn;

HWND

hCtl;

CEdit*

pEdit;

HWND

hCtl;

CListBox*

pListBox;

HWND

hCtl;

CComboBox*

pComboBox;

Visual C++常用宏定义命名列表

前缀

符号类型

符号例子

范围

IDR_

标识多个资源共享的类型

IDR_MAINFRAME

1 to 0x6FFF

IDD_

对话框资源(Dialog)

IDD_SPELL_CHECK

1 to 0x6FFF

IDB_

位图资源(Bitmap)

IDB_COMPANY_LOGO

1 to 0x6FFF

IDC_

光标资源(Cursor)

IDC_PENCIL

1 to 0x6FFF

IDI_

图标资源(Icon)

IDI_NOTEPAD

1 to 0x6FFF

ID_IDM_

工具栏或菜单栏的命令项

ID_TOOLS_SPELLING

0x8000 to 0xDFFF

HID_

命令上下文帮助(Command Help context)

HID_TOOLS_SPELLING

0x18000 to 0x1DFFF

IDP_

消息框提示文字资源

IDP_INVALID_PARTNO

8 to 0xDFFF

HIDP_

消息框上下文帮助(Message-box Help context)

HIDP_INVALID_PARTNO

0x30008 to 0x3DFFF

IDS_

字符串资源(String)

IDS_COPYRIGHT

1 to 0x7FFF

IDC_

对话框内的控制资源(Control)

IDC_RECALC

8 to 0xDFFF

VISUAL C++ 下的数据类型

类型

含义

ATOM

Atom. For more information, see Atoms.

BOOL

Boolean variable (should be TRUE or FALSE).

BOOLEAN

Boolean variable (should be TRUE or FALSE).

BYTE

Byte (8 bits).

CALLBACK

Calling convention for callback functions.

CHAR

8-bit Windows (ANSI) character. For more information, see Character Sets Used By Fonts.

COLORREF

Red, green, blue (RGB) color value (32 bits). See COLORREF for information on this type.

CONST

Variable whose value is to remain constant during execution.

DWORD

32-bit unsigned integer.

DWORD_PTR

Unsigned long type for pointer precision. Use when casting a pointer to a long type to perform pointer arithmetic. (Also commonly used for general 32-bit parameters that have been extended to 64 bits in 64-bit Windows. )

DWORD32

32-bit unsigned integer.

DWORD64

64-bit unsigned integer.

FLOAT

Floating-point variable.

HACCEL

Handle to an accelerator table.

HANDLE

Handle to an object.

HBITMAP

Handle to a bitmap.

HBRUSH

Handle to a brush.

HCONV

Handle to a dynamic data exchange (DDE) conversation.

HCONVLIST

Handle to a DDE conversation list.

HCURSOR

Handle to a cursor.

HDC

Handle to a device context (DC).

HDDEDATA

Handle to DDE data.

HDESK

Handle to a desktop.

HDROP

Handle to an internal drop strUCture.

HDWP

Handle to a deferred window position structure.

HENHMETAFILE

Handle to an enhanced metafile.

HFILE

Handle to a file opened by OpenFile, not CreateFile.

HFONT

Handle to a font.

HGDIOBJ

Handle to a GDI object.

HGLOBAL

Handle to a global memory block.

HHOOK

Handle to a hook.

HICON

Handle to an icon.

HIMAGELIST

Handle to an image list.

HIMC

Handle to input context.

HINSTANCE

Handle to an instance.

HKEY

Handle to a registry key.

HKL

Input locale identifier.

HLOCAL

Handle to a local memory block.

HMENU

Handle to a menu.

HMETAFILE

Handle to a metafile.

HMODULE

Handle to a module. The value is the base address of the module.

HMONITOR

Handle to a display monitor.

HPALETTE

Handle to a palette.

HPEN

Handle to a pen.

HRGN

Handle to a region.

HRSRC

Handle to a resource.

HSZ

Handle to a DDE string.

HWINSTA

Handle to a window station.

HWND

Handle to a window.

INT

32-bit signed integer.

INT_PTR

Signed integral type for pointer precision. Use when casting a pointer to an integer to perform pointer arithmetic.

INT32

32-bit signed integer.

INT64

64-bit signed integer.

LANGID

Language identifier. For more information, see Locales.

LCID

Locale identifier. For more information, see Locales.

LCTYPE

Locale information type. For a list, see Locale and Language Information.

LONG

32-bit signed integer.

LONG_PTR

Signed long type for pointer precision. Use when casting a pointer to a long to perform pointer arithmetic.

LONG32

32-bit signed integer.

LONG64

64-bit signed integer.

LONGLONG

64-bit signed integer.

LPARAM

Message parameter.

LPBOOL

Pointer to a BOOL.

LPBYTE

Pointer to a BYTE.

LPCOLORREF

Pointer to a COLORREF value.

LPCRITICAL_SECTION

Pointer to a CRITICAL_SECTION.

LPCSTR

Pointer to a constant null-terminated string of 8-bit Windows (ANSI) characters. For more information, see Character Sets Used By Fonts.

LPCTSTR

An LPCWSTR if UNICODE is defined, an LPCTSTR otherwise.

LPCVOID

Pointer to a constant of any type.

LPCWSTR

Pointer to a constant null-terminated string of 16-bit Unicode characters. For more information, see Character Sets Used By Fonts.

LPDWORD

Pointer to a DWORD.

LPHANDLE

Pointer to a HANDLE.

LPINT

Pointer to an INT.

LPLONG

Pointer to a LONG.

LPSTR

Pointer to a null-terminated string of 8-bit Windows (ANSI) characters. For more information, see Character Sets Used By Fonts.

LPTSTR

An LPWSTR if UNICODE is defined, an LPSTR otherwise.

LPVOID

Pointer to any type.

LPWORD

Pointer to a WORD.

LPWSTR

Pointer to a null-terminated string of 16-bit Unicode characters. For more information, see Character Sets Used By Fonts.

LRESULT

Signed result of message processing.

LUID

Locally unique identifier.

PBOOL

Pointer to a BOOL.

PBOOLEAN

Pointer to a BOOL.

PBYTE

Pointer to a BYTE.

PCHAR

Pointer to a CHAR.

PCRITICAL_SECTION

Pointer to a CRITICAL_SECTION.

PCSTR

Pointer to a constant null-terminated string of 8-bit Windows (ANSI) characters. For more information, see Character Sets Used By Fonts.

PCTSTR

A PCWSTR if UNICODE is defined, a PCSTR otherwise.

PCWCH

Pointer to a constant WCHAR.

PCWSTR

Pointer to a constant null-terminated string of 16-bit Unicode characters. For more information, see Character Sets Used By Fonts.

PDWORD

Pointer to a DWORD.

PFLOAT

Pointer to a FLOAT.

PHANDLE

Pointer to a HANDLE.

PHKEY

Pointer to an HKEY.

PINT

Pointer to an INT.

PLCID

Pointer to an LCID.

PLONG

Pointer to a LONG.

PLUID

Pointer to a LUID.

POINTER_32

32-bit pointer. On a 32-bit system, this is a native pointer. On a 64-bit system, this is a truncated 64-bit pointer.

POINTER_64

64-bit pointer. On a 64-bit system, this is a native pointer. On a 32-bit system, this is a sign-extended 32-bit pointer.

PSHORT

Pointer to a SHORT.

PSTR

Pointer to a null-terminated string of 8-bit Windows (ANSI) characters. For more information, see Character Sets Used By Fonts.

PTBYTE

Pointer to a TBYTE.

PTCHAR

Pointer to a TCHAR.

PTSTR

PWSTR if UNICODE is defined, a PSTR otherwise.

PTBYTE

Pointer to a TBYTE.

PTCHAR

Pointer to a TCHAR.

PTSTR

A PWSTR if UNICODE is defined, a PSTR otherwise.

PUCHAR

Pointer to a UCHAR.

PUINT

Pointer to a UINT.

PULONG

Pointer to a ULONG.

PUSHORT

Pointer to a USHORT.

PVOID

Pointer to any type.

PWCHAR

Pointer to a WCHAR.

PWORD

Pointer to a WORD.

PWSTR

Pointer to a null-terminated string of 16-bit Unicode characters. For more information, see Character Sets Used By Fonts.

REGSAM

Security Access mask for registry key.

SC_HANDLE

Handle to a service control manager database. For more information, see SCM Handles.

SC_LOCK

Handle to a service control manager database lock. For more information, see SCM Handles.

SERVICE_STATUS_HANDLE

Handle to a service status value. For more information, see SCM Handles.

SHORT

Short integer (16 bits).

SIZE_T

The maximum number of bytes to which a pointer can point. Use for a count that must span the full range of a pointer.

SSIZE_ T

Signed SIZE_T.

TBYTE

A WCHAR if UNICODE is defined, a CHAR otherwise.

TCHAR

A WCHAR if UNICODE is defined, a CHAR otherwise.

UCHAR

Unsigned CHAR.

UINT

Unsigned INT.

UINT_PTR

Unsigned INT_PTR.

UINT32

Unsigned INT32.

UINT64

Unsigned INT64.

ULONG

Unsigned LONG.

ULONG_PTR

Unsigned LONG_PTR.

ULONG32

Unsigned LONG32.

ULONG64

Unsigned LONG64.

ULONGLONG

64-bit unsigned integer.

UNSIGNED

Unsigned attribute.

USHORT

Unsigned SHORT.

VOID

Any type.

WCHAR

16-bit Unicode character. For more information, see Character Sets Used By Fonts.

WINAPI

Calling convention for system functions.

WORD

16-bit unsigned integer.

WPARAM

Message parameter.

更多内容请看C/C++技术学堂 C/C++技术专题 Solaris基础知识入门专题,或

第二部分

WINDOWS应用程序设计用到的基本术语:

1.窗口

任何一个使用过Windows的人对窗口这个概念绝对不会生疏,窗口是windows应用程序的基本操作单元,用户通过它与应用程序发生交互,例如输入输出操作等等,从程序的内部工作原来来看,每一个窗口对应一个消息处理队列,应用程序主要通过窗口消息处理函数对用户的输入操作进行响应与处理。要想从程序员的角度充分理解窗口的含义,那么对WNDCLASS这个数据结构进行充分的了解是必须的。

2.实例

单个实例代表一个可执行程序在内存中的拷贝,假如一个应用程序执行许多次,那么在内存中就有多少个拷贝,也就可以说明有多少个实例存在。

3.句柄

句柄在windows环境下被定义成了一个无符号的整数,用于标识应用程序中不同的对象和同类对象中的不同实例。句柄可以看成是对象的编号,联系上面的实例,那么一个实例句柄就可以看作是单个应用程序在内存中拷贝的唯一身份编号,通常系统只能通过实例句柄去识别不同的应用程序,或者是相同应用程序的不同副本。

4.资源

Windows应用程序包含很多资源,例如,菜单,图标,对话框等等,VC++环境下我们不仅仅可以使用系统下原有的资源,我们也可以定义自己的资源,这些资源被定义在.RC文件中,通过应用程序最后的编译,这些资源文件和程序代码连接在一起,形成一个可执行的.EXE文件或者是一个.DLL的库文件。在使用这些资源的时候,通过WIN API函数学将这些资源调用使用。

5.窗口消息处理函数

窗口是人机交互的接口,当窗口接受到输入请求的时候,就会把这一请求交给某一个函数进行处理,而这个函数就是窗口消息处理函数,它能够决定当一个消息被接受到的时候采取什么行动。

消息通常是由一系列的输入操作触发的,比如当我按下鼠标左键那么窗口消息处理函数就会收到一个WM_LBUTTONDOWN的消息信号。在窗口消息处理函数中,我们可以利用switch和case结构进行控制, 针对此消息作出我们想要的操作。

6.图形设备接口

应用程序的任何输出操作都需要通过图形设备接口(GDI)中的函数来完成操作,GDI负责系统与用户或绘图程序之间的信息交换,并控制在输出设备上显示图形或者文字,它将程序员与具体的硬件设备隔离开,让程序员不需要考虑硬件设备操作的细节。

7.回调函数

回调函数是windows操作系统自己调用的函数,用户是不能直接调用他们的。回调函数的定义必须严格的按照windows标准进行编写。

在下面我们将要看到的HelloWin程序中,WndProc就是一个回调函数,它是是应用程序的窗口消息处理函数,当注册窗口类的时候,要把窗口消息处理函数的地址告诉Windows,Windows通过调用此函数进行消息处理。

更多内容请看C/C++技术学堂 C/C++技术专题 Solaris基础知识入门专题,或

第三部分

Windows应用程序的基本运行机制与HelloWin程序具体解

总的来说最基本的Windows应用程序的运行执行顺序总是以如下的基本顺序执行的。

顺序结构:

调用WinMain函数开始执行--à定义窗口类--à初始化窗口类---à窗口的实例化--à通过消息循环获取消息并将消息发送给消息处理函数做出相应的操作

由于windows应用程序运行的逻辑结构非凡所以代码的具体解释笔者就不把程序于叙述分开了了,这样有利于阅读与分析。

程序运行预览图

下载该程序:点击这里下载(82K, WinZip压缩文件)

分析代码如下:

//程序作者:管宁

//站点:www.cndev-lab.com

//所有稿件均有版权,如要转载,请务必注明出处和作者

#include <windows.h>

#pragma comment(lib,"winmm.lib")//为了要播放声音,必须导入这个库

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)

/*

HINSTANCE 类型的含义为实例句柄。

hInstance 事实上就是当前应用程序自身的标识代号,代号通常都是一个32位整数。

hPrevInstance 与过去的16位应用程序有关系,表示指向前一个实例的句柄。

PSTR 类型的含义是指向以\0结尾的字符串指针。

szCmdLine 前面的sz同样是表示指向以\0结尾的字符串指针,这个对象用于保存命令行。

最后iCmdShow是一个整型数据,标记了程序最初的显示状态。

为SW_SHOWNORAML的时候为一般大小显示方式。

为SW_SHOWMAXIMIZED的时候为最大化显示方式。

为SW_SHOWMINNOACTIVE的时候程序将显示在任务栏上。

*/

{

static char szAppName[] = TEXT("HelloWin");//预先定义一个c风格字符串,稍后用于设置窗口类名称。

WNDCLASS wndclass;//定义窗口类对象

/*

在这里不得不说一下的是,窗口类事实上是struct结构体,内部有10个分量,他们是用来于初始化窗口类对象而用的。

这个结构体在winuser.h头文件中定义,从方式上来说,分为ASCII版的WNDCLASSA和Unicode版的WNDCLASSW两个。

typedef struct tagWNDCLASSA {

UINT style;

WNDPROC lpfnWndProc;

int cbClsExtra;

int cbWndExtra;

HINSTANCE hInstance;

HICON hIcon;

HCURSOR hCursor;

HBRUSH hbrBackground;

LPCSTR lpszMenuName;

LPCSTR lpszClassName;

} WNDCLASSA, *PWNDCLASSA, NEAR *NPWNDCLASSA, FAR *LPWNDCLASSA;

typedef struct tagWNDCLASSW {

UINT style;

WNDPROC lpfnWndProc;

int cbClsExtra;

int cbWndExtra;

HINSTANCE hInstance;

HICON hIcon;

HCURSOR hCursor;

HBRUSH hbrBackground;

LPCWSTR lpszMenuName;

LPCWSTR lpszClassName;

} WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;

*/

//------------------------------- 窗口类对象初始化过程 ------------------------------------ wndclass.style = CS_HREDRAW CS_VREDRAW;

/*

设置窗口类对象的样式风格,CS_HREDRAW CS_VREDRAW这两个值是通过位运算的与运算结合起来的。

表示了窗口在改变了水平和垂直大小的时候,窗口要强迫刷新。

这些通过define定义的标识,可以在WinUser.h头文件中找到。

#define CS_VREDRAW 0x0001

#define CS_HREDRAW 0x0002

#define CS_DBLCLKS 0x0008

#define CS_OWNDC 0x0020

#define CS_CLASSDC 0x0040

#define CS_PARENTDC 0x0080

#define CS_NOCLOSE 0x0200

#define CS_SAVEBITS 0x0800

#define CS_BYTEALIGNCLIENT 0x1000

#define CS_BYTEALIGNWINDOW 0x2000

#define CS_GLOBALCLASS 0x4000

#define CS_IME 0x00010000

*/

wndclass.lpfnWndProc = WndProc ;//指定窗口的处理函数为WndProc,WndProc将处理windows消息。

wndclass.cbClsExtra = 0;//窗口类无扩展

wndclass.cbWndExtra = 0;//窗口实例无扩展

wndclass.hInstance = hInstance;//指定当前应用程序实例句柄,也就是程序当前的标识号。

wndclass.hIcon = LoadIcon (NULL,IDI_APPLICATION);

/*

通过LoadIcon函数设置应用程序窗口标题的icon图标。

HICON LoadIcon(HINSTANCE hInstance,LPCTSTR lpIconName);

函数返回HICON类型的图标句柄。

第一个参数表示当前应用程序的窗口句柄,第二个参数表示图标。

默认状态下,第一个参数为NULL,第二个为IDI_APPLICATION,表示使用系统默认提供的图标,可以在WinUser.h头文件中找到。

#define IDI_APPLICATION 32512

*/

wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;

/*

通过LoadCursor函数设置应用程序窗口光标样式。

HCURSOR LoadCursor(HINSTANCE hInstance,LPCTSTR lpCursorName);

函数返回HCURSOR类型的光标句柄。

第一个参数表示当前应用程序的窗口句柄,第二个参数表示光标。

默认状态下,第一个参数为NULL,第二个为IDC_ARROW,表示使用系统默认提供的光标,可以在WinUser.h头文件中找到。

#define IDC_ARROW MAKEINTRESOURCE(32512)

*/

wndclass.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);

/*

通过GetStockObject函数设置应用程序窗口的背景颜色。

HGDIOBJ GetStockObject(int fnObject);

函数返回HCURSOR类型的GDI对象句柄,为了程序能够正确执行,必须把HGDIOBJ类型强制转换成HBRUSH画刷句柄。

参数表示当前使用的画刷颜色。

这些常量的定义可以在WinGDI.h头文件中找到。

#define WHITE_BRUSH 0

#define LTGRAY_BRUSH 1

#define GRAY_BRUSH 2

#define DKGRAY_BRUSH 3

#define BLACK_BRUSH 4

#define NULL_BRUSH 5

#define HOLLOW_BRUSH NULL_BRUSH

*/

wndclass.lpszMenuName = NULL;

wndclass.lpszClassName = szAppName;//窗口类对象的名称

//-----------------------------------------------------------------------------------------

RegisterClass (&wndclass);

/*

注册窗口类,参数为窗口类对象的指针。

函数原形为:

ATOM RegisterClass(CONST WNDCLASS *lpWndClass);

*/

//-------------------------- 实例化过程 -------------------------------------------------

HWND hwnd ; //创建用于保存窗口句柄的对象,窗口句柄是系统识别不同窗口的依据,它只是个代号。

hwnd = CreateWindow(

szAppName, // 窗口类名称

"你好世界", // 窗口标题

WS_OVERLAPPEDWINDOW, // 窗口样式

CW_USEDEFAULT, // 初始的窗口x轴位置

CW_USEDEFAULT, // 初始的窗口y轴位置

CW_USEDEFAULT, // 初始的窗口x轴大小

CW_USEDEFAULT, // 初始的窗口y轴大小

NULL, // 父窗口句柄

NULL, // 窗口功能表句柄

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

NULL // 建立参数,这个参数可以存取后面程序中可能引用到的资料。

);

/*

在窗口类对象的初始化过程中,我们定义了窗口的一些简单一般特征,比如背景颜色呀,光标呀,等等。

但是在利用CreateWindow创建窗口的时候可以设置更多的细节,比如窗口标题这些。

函数原形如下:

HWND CreateWindow( LPCTSTR lpClassName,

LPCTSTR lpWindowName,

DWORD dwStyle,

int x,

int y,

int nWidth,

int nHeight,

HWND hWndParent,

HMENU hMenu,

HINSTANCE hInstance,

LPVOID lpParam

);

一旦窗口创建成功,那么CreateWindow将返回窗口句柄,也就是窗口代号,值保存在窗口句柄对象hwnd中。

*/

ShowWindow(hwnd, iCmdShow);

/*

在执行过CreateWindow函数后,在系统的内部窗口已经创建成功了。

但为了要把窗口显示在桌面上,我们还必须调用ShowWindow函数。

其函数原形如下:

BOOL ShowWindow(WND hWnd,int iCmdShow);

参数1是需要显示的窗口句柄,第二个则是传递给WinMain的iCmdShow,用来确定最开始窗口的显示方式。

在这里窗口的显示方式,主要是指最大化,最小化这些。

*/

UpdateWindow (hwnd);

/*

UpdateWindow这个函数的作用是用于重绘显示区域。

因为假如ShowWindow函数的iCmdShow从WinMain获得的参数是SW——SHOWNORMAL,那么窗口的显示区域就会被背景画刷覆盖,

调用UpdateWindow函数会通过发送给窗口消息处理函数WndProc一个WM_PAINT消息,通过这个消息完成重绘显示区域的工作。

*/

//-----------------------------------------------------------------------------------------

//---------------------------- 消息循环 -------------------------------------------------

/*

当调用过UpdateWindow函数后,窗口已经显示在了桌面屏幕上,接下来要做的工作是处理消息。

windows应用程序可以接受各种消息包括键盘,鼠标,等等。

windows是通过监视各种输入设备,把发生的事件转化为消息的,并将消息保存在消息队列中。

最后当前的应用程序从自己的消息队列中按顺序检索消息,并把每一个消息发送到所对应的窗口消息处理函数总去,这里是指WndProc。

*/

MSG msg ;//建立消息对象。

/*

MSG是个结构体类型,在WinUser.h头文件中可以找到。

typedef struct tagMSG{

HWND hwnd;//窗口句柄

UINT message;//消息识别字,在WinUser.h头文件中可以找到,以WM开头,这里就不全部举出来了。

WPARAM wParam;//32位的消息参数,其含义和值根据消息的不同而不同。

LPARAM lParam;//32位的消息参数,其值和消息无关。

DWORD time;//消息进入消息队列的时间。

POINT pt;//消息进入消息队列时候的鼠标坐标。

#ifdef _MAC

DWORD lPrivate;

#endif

} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;

其中POINT也是个结构体类型,在WinDef.h头文件中可以找到

typedef struct tagPOINT

{

LONG x;

LONG y;

} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;

*/

while (GetMessage (&msg, NULL, 0, 0))

{

/*

我们通过这个循环代码来维护消息循环,循环的执行条件是通过GetMessage函数获得的。

函数原型如下:

BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax);

参数一是一个指向msg对象的指针,剩余的参数为NULL或0表示程序接受它自己建立的所有窗口的消息。

windows从消息队列取出的下一个消息将填充MSG结构中的各成员分量。

*/

TranslateMessage (&msg);//把虚拟键盘消息转换到字符消息,满足键盘输入的需要,参数为msg消息对象的指针。

DispatchMessage (&msg);

/*

把当前的消息发送到窗口消息处理函数中去处理,在这里为WndProc。

当DispatchMessage调用结束后,循环再次重复,重新回到GetMessage处,接着获取消息。

假如消息循环接收到WM_QUIT消息则跳出消息循环。

*/

}

//----------------------------------------------------------------------------------------

return msg.wParam;//返回消息结构中的wParam成员信息。

/*

MSG结构的wParam成员的值是传递给PostQuitMessage函数参数,通常是0。

因为PostQuitMessage函数是在结束消息循环必须调用的函数。

系统其实是执行了return 0;结束了WinMain函数退出了程序,很想控制台应用程序main结束的时候的return 0;,所以直接写return 0;也不会导致程序错误。

*/

}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)//窗口消息处理函数

/*

函数返回类型为LRESULT,是一个长整数,修饰CALLBACK表示此函数为回调函数,函数的返回类型,和参数顺序都必须按照系统的规定设置。

参数一为窗口句柄,第二个参数是无符号整型数据,用于标识接受的消息,最后两个参数为32位的消息参数,提供了更多关于消息的信息。

WPARAM和LPARAM都表示的是长整数,该函数的四个参数与MSG结构的前四个成员相同。

消息处理函数,通常是windows自己调用的,当然程序作者也可以通过调用SendMessage函数直接呼叫自己的窗口消息处理函数,只是在这里暂时不讨论。

*/

{

HDC hdc;//创建设备描述句柄对象

PAINTSTRUCT ps;//创建绘制结构对象

/*

PAINTSTRUCT结构包含了一些窗口消息处理程序,可以用来更新窗口显示区域中的信息。

结构如下:

typedef struct tagPAINTSTRUCT {

HDC hdc;

BOOL fErase;

RECT rcPaint;

BOOL fRestore;

BOOL fIncUpdate;

BYTE rgbReserved[32];

} PAINTSTRUCT, *PPAINTSTRUCT;

*/

RECT rect;//创建矩形结构对象

/*

此结构的定义如下:

typedef struct _RECT {

LONG left;

LONG top;

LONG right;

LONG bottom;

} RECT, *PRECT;

*/

switch (message)//通过switch和case结构来确定处理什么样的消息,假如不想处理某些消息则把消息传递给DefWindowProc函数处理。

{

case WM_CREATE://当窗口创建的时候获得WM_CREATE消息

PlaySound (TEXT("C:\\online.wav"),NULL,SND_FILENAMESND_ASYNC);//播放声音

return 0;//窗口消息处理函数假如正在处理消息必须返回0

case WM_PAINT://通知窗口更新显示区域的信息

/*

当窗口刚开始建立的时候,整个显示区域都是无效的,因为程序还没有在窗口上绘制任何东西。

第一条WM_PAINT消息通常发生在调用UpdateWindows函数的时候,告诉窗口消息处理函数在显示区域绘制一些东西。

事实上当用户把wndclass.style设置成CS_HREDRAW CS_VREDRAW后,一旦用户改变窗口大小,就会把显示区域当作无效,这时候就会收到WM_PAINT消息。

*/

/*

通常在处理WM_PAINT消息的时候,总是以BeginPaint开头和EndPaint结尾的。

*/

hdc = BeginPaint (hwnd, &ps);

/*

调用BeginPaint函数可以传回设备句柄,这里指的是显示器的代号和显示器的驱动程序。

因为在窗口显示区域要显示文字或者图形都需要用到设备句柄。

它的函数原形为:

HDC BeginPaint(

HWND hwnd, // handle to window

LPPAINTSTRUCT lpPaint // paint information

);

它实际的功能是:当发现窗口显示区域的背景还没有被清除的时候,则由windows来删除它。

我们前面在wndclass结构中设置了画刷为白色,这么以来系统就用白色来遮盖桌面的颜色,这样窗口显示区域就变成白色了。

*/

GetClientRect (hwnd,&rect);//设置窗口显示区域的尺寸,同时它也负责获得窗口改变后的窗口显示区域的尺寸信息。

DrawText (hdc,TEXT("中国软件开发实验室,http://www.cndev-lab.com"),-1,&rect,DT_SINGLELINEDT_CENTERDT_VCENTER);//绘制文字在窗口显示区域中

/*

DT_SINGLELINEDT_CENTERDT_VCENTER表示的是文字显示的方式,这些在WinUser.h头文件中定义。

*/

EndPaint (hwnd,&ps);//结束指定窗口的绘图

return 0;

case WM_DESTROY://当窗口销毁的时候会返回此信息,比如ALT+F4或关闭窗口的时候,系统默认调用DestroyWindow()函数撤消窗口。

PostQuitMessage (0);

/*

处理WM_DESTROY消息必须调用PostQuitMessage函数,该函数向消息队列中发送WM_QUIT消息,让程序退出消息循环。

应用程序可以在响应这个消息的同时做一些其它结束的工作。

*/

return 0;

}

return DefWindowProc (hwnd, message, wParam, lParam);//处理不于处理的消息

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有