分享
 
 
 

Visual C++ 入门精解-第三部分

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

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

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

顺序结构:

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

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

分析代码如下:

//程序作者:管宁

//站点: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

);

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有