|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
源代码选参考 《windows程序设计》第三章
没什么好讲的 只是我把每一句都注释
希望对初学者有帮助,
本来想出个课程的,但是自己学艺未精,怕大伙笑话,就不献丑了 所以就帖 吹水阁了
代码放在编译器上观看效果更好 ,VC6新建一个 win32 Application 选择第二个 一个简单的Win32程序。 #include "stdafx.h"
#include <windows.h>//包含应用程序中,数据类型和,数据结构的定义 ;
LRESULT CALLBACK WndProc (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);//消息处理函数声明
// WINAPI,__stdcall是函数调用约定的一种,函数调用约定主要约束了两件事;1.参数传递顺序 ;2.调用堆栈由谁清理.
//WinMain函数是所有Windows应用程序的入口,类似c语言中的main函数 其功能是完成//一系列的定义和初始化,并产生消息循环
/* 入口 实例句柄 父类实例 字符串 命令行 窗体显示方式 */
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
//函数入口 函数说明
{
/* 全局静态变量 随意取名*/
static TCHAR szApppName[] =TEXT("hello,windows!"); //定义字符串型数组,为主窗体取一个名称;
HWND hwnd; //句柄;hwnd表示消息所属的窗口
MSG msg; //一个结构体 叫做消息;MSG类型
//初始化包括窗口类的定义、注册、创建窗口实例和显示窗口四部分
//第一步以下是窗口类的定义
WNDCLASS wndclass;//定义一个窗口类确定窗口的属性;包含一个窗口类的全部信息
wndclass.style =CS_HREDRAW|CS_VREDRAW;//窗口风格 =水平重画|竖向重画;
wndclass.lpfnWndProc = WndProc;//回调函数;定义窗口处理函数;;窗口过程
wndclass.cbClsExtra =0; //窗口类扩展 =无;;额外附加字节数
wndclass.cbWndExtra =0;//窗口实例扩展=无;;窗口额外附近字节数
wndclass.hInstance =hInstance; //当前实例句柄 ; 应用程序程序实例号;
wndclass.hIcon =LoadIcon(NULL,IDI_APPLICATION); //图标=窗口的最小化图标为缺省图标;第一个参数为句柄,设置为空
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);// 光标标=采用箭头光标;第一个参数为句柄,设置为空
/* GetStockObject返回HGDIOBJ类型;因为wndclass.hbrBackground是HBRUSH类型所以需要转化 */
wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);//窗口背景==白色
wndclass.lpszMenuName =NULL;//菜单名称,没有菜单所以不需要名称;
wndclass.lpszClassName =szApppName; //窗口类名,开始定义的那个字符串数组名;
//*****************************************************************************************************
/*RegisterClass()函数功能:该函数注册在随后调用CreateWindow函数和CreateWindowEx函数中使用的窗口类 。
CreateWindow();该函数创建一个重叠式窗口、弹出式窗口或子窗口。
它指定窗口类,窗口标题,窗口风格,以及窗口的初始位置及大小(可选的)。
函数也指该窗口的父窗口或所属窗口,及窗口的菜单
CreateWindowEx();该函数创建一个具有扩展风格的重叠式窗口、弹出式窗口或子窗口,其他与 CreateWindow函数相同。
//*****************************************************************************************************
RegisterClass函数有一个参数 是一个指针 ,在这里我们指向的是,我们定义的窗体类
如果你的应用程序不打算创建窗口,就可以不用这个函数; */
if (!RegisterClass(&wndclass)) //如果注册失败 发出警告
{
MessageBox(NULL,TEXT("窗口注册失败不能运行"),szApppName,MB_OK);//自己去查
return 0;//不成功的话得让他返回,返回0就是结束了···
}//如果创建失败,就此结束!
//如果创建成功进行以下步骤,
//第二步以下是窗口类的注册 ,关于CreateWindow的介绍 往上看;
//CreateWindow 有一个返回值,是HWND类型,他必须返回;我们就用前面定义的 HWND hwnd;来接收他;
hwnd = CreateWindow(szApppName, //窗口类名;开始定义的那个字符串数组名
TEXT("患得患失"),//窗口标题名;随便取
WS_OVERLAPPEDWINDOW, //窗口的风格=默认的,可选风格实在太多,这里就不列举了喜欢倒腾的,童鞋们自己去MSDN吧;
CW_USEDEFAULT, // 指定窗口的初始水平位置X
CW_USEDEFAULT, // 指定窗口的初始垂直位置Y
/*CW_USEDEFAULT是指窗口的大小位置等位默认值*/
CW_USEDEFAULT, // 以设备单元指明窗口的宽度
CW_USEDEFAULT, // 以设备单元指明窗口的宽度
NULL,//此窗口父窗口 无
NULL, //此窗口子菜单 无
hInstance, //创建此窗口的应用程序的当前句柄
NULL //窗口创建数据;无
);
//创建完成我们就得显示他,
//第三步显示窗体;
//SW_SHOW:在窗口原来的位置以原来的尺寸激活和显示窗口,显示方式很多,详见MSDN;
ShowWindow(hwnd,SW_SHOW);//窗体句柄,指定窗口如何显示;
//第四步更新窗体;
UpdateWindow(hwnd);
/////////////消息循环
//函数GetMessage 是从调用线程的消息队列里取得一个消息并将其放于指定的结构
//GetMessage()参数1.指向MSG结构的指针,2取得其消息的窗口的句柄,3第一条消息4.最后一条信息
while (GetMessage (&msg, NULL, 0, 0))//while条件循环 ;; 最后参数 为 0,所有消息都会响应
{
/*TranslateMessage函数功能:该函数将虚拟键消息转换为字符消息。
字符消息被寄送到调用线程的消息队列里,
当下一次线程调用函数GetMessage或PeekMessage时被读出。*/
TranslateMessage (&msg) ; //将虚拟键消息转换为字符消息。翻译消息,处理键盘;
DispatchMessage (&msg) ;//分发一个消息给窗口程序,
}
return msg.wParam ; //消息循环结束 即程序结束时 将信息返回系统
//系统根据hwnd来确定窗体
}
//窗口函数定义了应用程序对接收到的不同消息的响应,其中包含了应用程序对各种可能接受到的消息的
//处理过程,时消息处理分支控制语句的集合
//第五步处理过程;
//ALLBACK,__stdcall是函数调用约定的一种,函数调用约定主要约束了两件事;1.参数传递顺序 ;2.调用堆栈由谁清理.
//LRESULT就是longresult,也就是长整型之所以取名类LRESULT,是因为L即long ::: 结果
/* 函数原型定义 句柄 消息, 这个两个是指它的高16位和低16位 */
LRESULT CALLBACK WndProc (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{ /*long __stdcall ==LRESULT CALLBACK*/
PAINTSTRUCT ps; // PAINTSTRUCT结构
HDC hdc;//hDC是DC的句柄,API中的一个类似指针的数据类型 显卡有关;
RECT rect;//rect这个对象是用来存储成对出现的参数,比如,一个矩形框的左上角坐标、宽度和高度
switch (message)//选择消息
{
case WM_CREATE: //WM_CREATE窗体创建的消息
return 0 ;
case WM_PAINT:
// BeginPaint函数为指定窗口进行绘图工作的准备,并用将和绘图有关的信息填充到一个PAINTSTRUCT结构中。
//返回的HDC句柄;
hdc =BeginPaint(hwnd,&ps);//被重绘的窗口句柄,输出指向一个用来接收绘画信息的PAINTSTRUCT结构
//GetClientRect该函数获取窗口客户区的坐标
GetClientRect(hwnd,&rect);// 窗口句柄,客户区坐标
//DrawText该函数在指定的矩形里写入格式化的正文,根据指定的方法对正文格式化
DrawText(hdc,TEXT("爱鱼C!爱编程!"),-1,&rect,DT_CENTER|DT_SINGLELINE|DT_VCENTER);
/* int DrawText(
HDC hDC, // 设备描述表句柄
LPCTSTR lpString, // 将要绘制的字符串
int nCount, // 字符串的长度 如果参数nCount是-1,则字符串必须是以\0结束的
LPRECT lpRect, // 指向矩形结构RECT的指针
UINT uFormat // 正文的绘制选项 希望怎么显示自己去查MSDN
); */
/* EndPaint函数标记指定窗口的绘画过程结束;
这个函数在每次调用BeginPaint函数之后被请求,但仅仅在绘画完成以后。*/
EndPaint (hwnd,&ps);
return 0;
case WM_DESTROY://是关闭程序的 由系统处理;
PostQuitMessage(0);//该函数向系统表明有个线程有终止请求。通常用来响应WM_DESTROY消息。
return 0;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;//交给系统处理一些消息;
}
//系统根据hwnd来确定窗体
}
//窗口函数定义了应用程序对接收到的不同消息的响应,其中包含了应用程序对各种可能接受到的消息的
//处理过程,时消息处理分支控制语句的集合
//第五步处理过程;
//ALLBACK,__stdcall是函数调用约定的一种,函数调用约定主要约束了两件事;1.参数传递顺序 ;2.调用堆栈由谁清理.
//LRESULT就是longresult,也就是长整型之所以取名类LRESULT,是因为L即long ::: 结果
/* 函数原型定义 句柄 消息, 这个两个是指它的高16位和低16位 */
LRESULT CALLBACK WndProc (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{ /*long __stdcall ==LRESULT CALLBACK*/
PAINTSTRUCT ps; // PAINTSTRUCT结构
HDC hdc;//hDC是DC的句柄,API中的一个类似指针的数据类型 显卡有关;
RECT rect;//rect这个对象是用来存储成对出现的参数,比如,一个矩形框的左上角坐标、宽度和高度
switch (message) //选择消息
{
case WM_CREATE: //WM_CREATE窗体创建的消息
return 0 ;
case WM_PAINT:
// BeginPaint函数为指定窗口进行绘图工作的准备,并用将和绘图有关的信息填充到一个PAINTSTRUCT结构中。
//返回的HDC句柄;
hdc =BeginPaint(hwnd,&ps); //被重绘的窗口句柄,输出指向一个用来接收绘画信息的PAINTSTRUCT结构
//GetClientRect该函数获取窗口客户区的坐标
GetClientRect(hwnd,&rect); // 窗口句柄,客户区坐标
//DrawText该函数在指定的矩形里写入格式化的正文,根据指定的方法对正文格式化
DrawText(hdc,TEXT("爱鱼C!爱编程!"),-1,&rect,DT_CENTER|DT_SINGLELINE|DT_VCENTER);
/*
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
int DrawText(
HDC hDC, // 设备描述表句柄
LPCTSTR lpString, // 将要绘制的字符串
int nCount, // 字符串的长度 如果参数nCount是-1,则字符串必须是以\0结束的
LPRECT lpRect, // 指向矩形结构RECT的指针
UINT uFormat // 正文的绘制选项 希望怎么显示自己去查MSDN
);
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
*/
/* EndPaint函数标记指定窗口的绘画过程结束;
这个函数在每次调用BeginPaint函数之后被请求,但仅仅在绘画完成以后。 */
EndPaint (hwnd,&ps);
return 0;
case WM_DESTROY: //是关闭程序的 由系统处理;
PostQuitMessage(0); //该函数向系统表明有个线程有终止请求。通常用来响应WM_DESTROY消息。
return 0;
}
return DefWindowProc (hwnd, message, wParam, lParam) ; //交给系统处理一些消息;
}
如果此帖对你有些帮助就 打赏点吧,有较多的朋友想需要的话 我可以再更新几篇 往后进阶的!
欢迎朋友指正错误;
|
|