实验一:HelloWorld程序的实现
一:实验目的
● 掌握Windows程序基本的运行原理。
● 学会编写简单的Windows程序。
二:实验内容
● 用Windows API(SDK)实现图形化HellowWorld程序。
● 用MFC类库实现图形化HellowWorld程序。
三:实验步骤及源代码
● 用Windows API(SDK)实现HellowWorld程序
实验步骤:
? 打开VS2008,从File菜单中选择New,单击Project标签,选择Win32 Application,输入项目名称和工程存放
,点击确定后出现3中选择,在此选择创建一个空的工程,点击工程的File View,向Source Files中添加源文件,然后编写代码。
1.windows程序的入口函数:
int WINAPI WinMain(
HINSTANCE hInstance, // 应用程序当前示例句柄
HINSTANCE hPrevInstance, // 应用程序其他实例句柄
LPSTR lpCmdLine, // 指向程序命令行参数的指针
int nCmdShow //应用程序开始执行时窗口显示方式的整数值标识
)
2. 窗口的创建:
创建一个完整的窗口需要经过下面四个操作步骤:
<1>.设计一个窗口类:
WNDCLASS类(结构体),定义如下:
typedef struct _WNDCLASS {
UINT style; //窗口风格
WNDPROC lpfnWndProc; //窗口过程
int cbClsExtra; //扩展空间
int cbWndExtra; //扩展空间
HINSTANCE hInstance; //实例句柄
HICON hIcon; //图标设置
HCURSOR hCursor; //光标设置
HBRUSH hbrBackground; //窗口背景颜色
LPCTSTR lpszMenuName; //窗口类菜单
LPCTSTR lpszClassName; //窗口类文本名称
} WNDCLASS, *PWNDCLASS;
用WNDCLASS定义一个窗口变量,然后依次初始化起它的每一个成员,注意:第二个成员变量lpfnWndProc指定了这一类型窗口的过程函数(函数名可以作为该函数的首地址),也称回调函数。每一种不同类型的窗口都有自己专用的回调函数。
<2>.注册窗口类:调用RegisterClass()函数注册窗口,函数原型如下:
ATOM RegisterClass( CONST WNDCLASS *lpWndClass );
<3>.创建窗口:调用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 // 指向一个传递给窗口的参数值的指针
);
<4>.显示及更新窗口:
在CreateWindow()调用返回后,Windows已经分配了一块内存,用于保存创建窗口的全部信息,然而窗口并未在显示器上显示,所以需要调用ShowWindow()函数显示窗口和UpdateWindow()更新窗口,两个函数原型分别为:
BOOL ShowWindow(
HWND hWnd, // 窗口句柄
int nCmdShow // 窗口显示形式标识
);
BOOL UpdateWindow(
HWND hWnd // 窗口句柄
);
4.消息循环:
当窗口显示在显示器上后,程序必须准备读入用户用键盘和鼠标输入的数据。Windows为每一个应用程序维护一个“消息队列”,当发生输入事件后,Windows将事件转化成一个消息,并将消息放入程序的消息队列中。
程序通过执行以下一段代码从消息队列中取出消息:
while(GetMessage(&msg,NULL,0,0)) //获取消息
{
TranslateMessage(&msg);//消息翻译
DispatchMessage(&msg); //发送消息给窗口过程
}
Msg变量为MSG结构体类型,类型定义如下:
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG, *PMSG;
5.头文件包含:
在每一个Windows程序C语言编写的Windows程序都可以看到#include
。
Windows.h是主要的包含文件,它包含的windows的其它头文件。
源代码:
#include
#include
//窗口过程函数声明:
LRESULT CALLBACK WinLiuProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
int WINAPI WinMain(
HINSTANCE hInstance, // 应用程序当前示例句柄
HINSTANCE hPrevInstance, // 应用程序其他实例句柄
LPSTR lpCmdLine, // 指向程序命令行参数的指针
int nCmdShow //应用程序开始执行时窗口显示方式的整数值标识
)
{
HWND hwnd; //窗口句柄
MSG msg; //消息
//声明一个窗口类
WNDCLASS wndcls;
//设置窗口类的属性:
wndcls.cbClsExtra = 0;
wndcls.cbWndExtra = 0;
wndcls.hbrBackground = ( HBRUSH)GetStockObject( WHITE_BRUSH );
wndcls.hCursor = LoadCursor( hInstance, IDC_ARROW );
wndcls.hIcon = LoadIcon( hInstance, IDI_APPLICATION );
wndcls.hInstance = hInstance;
wndcls.lpfnWndProc = WinLiuProc;
wndcls.lpszClassName = "Windows prog test";
wndcls.lpszMenuName = NULL;
wndcls.style = CS_HREDRAW | CS_VREDRAW;
//注册窗口类
RegisterClass(&wndcls);
//创建窗口
hwnd = CreateWindow( "Windows prog test", TEXT ("The Hello Program,SDK style"), WS_OVERLAPPEDWINDOW | WS_VISIBLE,CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL );
//显示窗口
ShowWindow( hwnd, SW_SHOWNORMAL );
UpdateWindow(hwnd);
while (GetMessage( &msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WinLiuProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(uMsg)
{
//字符输入消息
case WM_CHAR:
char szChar[20];
sprintf(szChar,"键盘按键按下");
MessageBox(hwnd,szChar,"Title",0);
break;
//鼠标左键按下消息
case WM_LBUTTONDOWN:
MessageBox(hwnd,"左键按下","Title",0);
HDC hdc;
hdc=GetDC(hwnd);
ReleaseDC(hwnd,hdc);
break;
//鼠标右键按下消息
case WM_RBUTTONDOWN:
MessageBox(hwnd,"鼠标右键按下","Title",0);
break;