WinAPI入门: 第一个标准Win32窗口程序

下载链接:
若想立即看到本程序的运行结果,可点击EXE文件的免费下载链接;
HelloWin_v1.sfx.exe;–带语音和背景音乐;
相关链接:
MFC入门: 从WinAPI到MFC过渡的完整模板程序 [详细注释+示例教程]
(WinAPI进阶教程)

//v1;WinAPI入门;第一个标准Win32窗口程序;[改进&详细注释版@HelloWin.c;]

/*/背景说明;

 1.无论你编程使用的是MFC,还是DirectX,最终都是调用的WinAPI函数;其功能仅限于WinAPI的某个子集;因此,WinAPI编程有时可以简单实现MFC某些看起来复杂的功能;还可以实现MFC编程无法实现的功能;WinAPI定义了Windows编程所需的一切,直接使用WinAPI将无所不能;2.通过学习WinAPI编程,有助于理解现代操作系统的工作原理,更能深入理解Windows应用程序的运行原理;3.WinAPI编程作为一切Windows应用程序的基础,本程序的大部分语句都会出现在任何Windows程序中;因此,本程序可以作为任何新程序的起点;或者通过复制作为一个模板来使用;4.本例演示最简单的标准Win32应用程序的结构框架;更完整的Win32应用程序还应该包括菜单和控制响应;因此,本例的每个部分都是必不可少的;包括窗口的类注册/创建/显示/消息循环/回调函数等;
//----------------------------------------------+------------------------------------------------*/

//主程序;

//---------------------------------------------*/
//库引用;
#include <windows.h>                  //WinAPI基本库;
//其中主要包含有以下5部分:             --但不包含winmm.lib;
//WINDEF.H      基本类型定义;
//WINNT.H       支持Unicode的类型定义; --支持中文&国际化;
//WINBASE.H     Kernel函数;
//WINUSER.H     用户接口函数;
//WINGDI.H      图形设备接口函数;       --即GDI编程;
#pragma comment(lib,"winmm.lib")      //添加多媒体库;--可播放声音及视频;
//---------------------------------------------*/
//声明本地函数;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);   //回调函数CALLBACK;即窗口过程proc;
//----------------------------------------------+------------------------------------------------*/

//定义主函数;–程序进入点;[相当于main();]

//---------------------------------------------*/
/*/补充资料;--Windows程序是如何执行的;1.在Win32中 CALLBACK/WINAPI均被定义为__stdcall,即标准调用;这是一种函数调用习惯,关系到参数压栈的次序,以及处理堆栈的责任归属;其它的函数调用习惯还有_pascal 和_cdecl;2.当 Windows的「外壳」shell(例如资源管理器侦测到使用者意欲执行一个 Windows程序,于是调用加载器把该程序加载,然后调用C_startup代码;后者再调用WinMain()开始执行程序;WinMain()的四个参数由操作系统传递进来。
//---------------------------------------------*/
//v1;主函数;[启动本应用程序时, Windows会提供4个实参;其中仅 hInstance和 nCmdShow在程序中用到;]
int WINAPI WinMain(HINSTANCE    hInstance,      //主窗口实例句柄;[*最重要;]HINSTANCE  hPrevInstance,  //上一个窗口实例句柄;[总是NULL;]LPSTR      lpCmdLine,      //命令行;[程序启动时可带参数;]int           nCmdShow)       //窗口显示方式;[窗口最大化/最小化等旗标组合;]
{static TCHAR szAppName[] =TEXT("HelloWin");         //定义应用程序名称;--字符串; TCHAR兼容宽字符UNICODE;//定义内部变量;//句柄Handle;即32位的ID代号,在 Windows编程中使用非常频繁,相当于资源对象的指针;HWND         hwnd;              //窗口句柄;--即窗口ID代号;是创建窗口时Windows的返回值;MSG          msg ;               //消息结构;--每个窗口都有一个消息循环,用它不断读取消息;然后转译分发处理;WNDCLASS     wndclass;          //窗口类结构;--存放窗口类的特征信息;//定义窗口;--用于窗口注册,共需10个参数;[结构体初始化;]//窗口产生之前,其众多属性参数必须先设定好;--这些属性牵涉广泛,需提前存放在数据结构wndclass中;wndclass.style          = CS_HREDRAW | CS_VREDRAW;              //窗口样式;旗标组合;--水平或垂直改变重绘REDRAW;wndclass.lpfnWndProc    = WndProc;                               //回调函数名称;--实际是函数指针pfn;wndclass.cbClsExtra     = 0;                                 //为类对象预留的额外计数字节cb;[=couter byte;]wndclass.cbWndExtra     = 0;                                 //为窗体预留的额外计数字节cb;wndclass.hInstance      = hInstance;                          //App实例句柄;--当前窗口实例的ID代号;由Windows提供;wndclass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);      //Icon图标句柄;--普通应用图标;wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW);         //Cursor光标句柄;--箭头鼠标指针;wndclass.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);   //HBRUSH背景画刷句柄;--选择预设的标准画刷--白色;wndclass.lpszMenuName   = NULL;                                 //菜单名;--没有菜单为NULL;wndclass.lpszClassName  = szAppName;                         //窗口类别名=应用程序名称;[小程序可以同名;]//注册窗口类;--如不成功则返回0;并立即跳出程序;if (!RegisterClass (&wndclass))        //如果窗口类注册不成功,则给出提示;{MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR); //对话框消息MB;[=Message Box;有时需要Windows NT环境兼容宽字符UNICODE;]return 0;}//创建窗口;--共需11个参数;[函数实参说明;中英对照;]//Windows创建窗口是一个复杂的过程,牵涉广泛,参数多点很正常;hwnd =CreateWindow(szAppName,                       // window class name;       [窗口类别名=应用程序名称;同前;]TEXT ("HelloWin_v1"),          // window caption;          [窗口标题;文本字符串;]WS_OVERLAPPEDWINDOW,           // window style;            [窗口样式;同前;]CW_USEDEFAULT,                    // initial x position;      [x坐标位置;窗口左上角;]CW_USEDEFAULT,                    // initial y position;      [y坐标位置;窗口左上角;]240,                          // initial x size;          [窗口尺寸;单位=像素Pixel;默认CW_USEDEFAULT;]120,                         // initial y size;          [窗口尺寸;单位=像素Pixel;默认CW_USEDEFAULT;]NULL,                            // parent window handle;    [父窗口句柄;没有为NULL;]NULL,                           // window menu handle;      [窗口菜单句柄;没有为NULL;]hInstance,                     // program instance handle; [App实例句柄;由Windows提供;]NULL);                         // creation parameters;     [建立参数;可选的引用资料;]//显示窗口;//注意://通过CreateWindows()函数创建窗口后,仅仅是为窗口分配了内存空间,获得了句柄,但窗口并没有显示出来;//所以还需要调用 ShowWindow()函数来显示窗口;--包括正常显示/最大化/最小化;[由程序安装或使用者决定;]//而调用了ShowWindow()函数又仅仅是将窗口显示出来,但不会进行客户区的绘制;//所以还需要调用UpdateWindow()函数,生成 WM_PAINT消息,将客户区中的各种控件绘制出来;ShowWindow(hwnd, iCmdShow);           //显示窗口;--决定窗口的显示方式iCmdShow;UpdateWindow(hwnd);                  //刷新窗口;--发送重绘消息WM_PAINT通知屏幕窗口区域自动刷新;//消息循环;while (GetMessage(&msg, NULL,0,0))   //(NULL,0,0)表示程式接收它自己建立的所有视窗的所有讯息;{TranslateMessage(&msg);          //转译消息;--将消息结构传给Windows,进行一些键盘转换;DispatchMessage(&msg);          //分发消息;--消息各部分经由Windows传给窗口回调函数Proc接收并处理;//[处理完原地返回继续读取下一条消息;]}//如果msg.message=WM_QUIT;这时GetMessage()传回0;退出msg循环;return msg.wParam;                    //程序结束;返回wParam;
}
//----------------------------------------------+------------------------------------------------*/

//定义回调函数;–窗口消息响应;

//---------------------------------------------*/
/*/补充资料;--消息结构MSG;
//对消息msg的理解是Win32编程所必需的;因此这里列出MSG类型的结构;
typedef struct tagMSG
{ HWND  hwnd;       //窗口句柄;--窗口ID代号32位整数;同前;UINT    message;    //消息标识;--无符号整型32位;WPARAM    wParam;     //消息短参数;--实际为32位;LPARAM lParam;     //消息长参数;--实际为32位; DWORD time;       //消息放入消息队列的时间;POINT pt;         //消息放入消息队列时的鼠标位置坐标(x,y);
}MSG, *PMSG;
//---------------------------------------------*/
//v1;回调函数;--负责处理本窗口类所有实例的消息;
//[因为专为Windows向上调用而设计,所以叫回调函数;通常子程序为向下调用;]
//注意,回调函数的4个形参,对应消息结构中的4个成员;
//当Windows向应用程序发送消息,其实质就是通过调用本回调函数实现的;
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{//定义内部变量;HDC         hdc;      //设备环境句柄;PAINTSTRUCT ps ;       //保存绘图环境数据的结构体;RECT        rect;        //客户区矩形; //消息处理;--消息响应;switch (message){case WM_CREATE:                     //创建窗口;[WM =Window Message;]PlaySound( TEXT("HelloWin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;   //语音;Sleep(2000);                   //等待语音结束,再开始音乐;PlaySound( TEXT("bkmusic.wav"), NULL, SND_FILENAME | SND_ASYNC);   //背景音乐;break;      case WM_PAINT:                       //绘制窗口或重绘无效矩形区;--此处显示文本信息;hdc =BeginPaint(hwnd, &ps);      //获取设备环境句柄;--包括绘图环境数据;   GetClientRect(hwnd, &rect);    //获取客户区矩形;    DrawText(hdc, TEXT("Hi,我是Win32窗口!"), -1, &rect,DT_SINGLELINE |DT_CENTER |DT_VCENTER);    //@客户区rect;文本格式=(单行|水平居中|垂直居中); EndPaint(hwnd, &ps);break;      case WM_DESTROY:                 //已销毁窗口;--由 WM_CLOSE消息触发;[如用户点击了关闭按钮;]PostQuitMessage(0);               //将 WM_QUIT放入消息队列;break;default:return DefWindowProc(hwnd, message, wParam, lParam);    //默认;Windows内部消息处理;}return 0 ;
}
//----------------------------------------------+------------------------------------------------*/
//----------------------------------------------+------------------------------------------------*/

WinAPI入门: 第一个标准Win32窗口程序 [改进详细注释版]相关推荐

  1. 让Win32窗口程序拥有控制台窗口

    让Win32窗口程序拥有控制台窗口 首先,为什么我们有了普通窗口后还要控制台窗口呢?因为我们可以用它方便的输出调试信息,而且普通玩家看到了也会觉得很高端.如果他会输几条命令,可能他会以为自己就是黑客了 ...

  2. 第一个 Win32 窗口程序

    第一个 Win32 窗口程序 程序骨架 int WinMain(){ // 设计窗口外观及交互响应,注册,申请专利RegisterClass(...) ;// 生产窗口 CreateWindow(.. ...

  3. Win32窗口程序实例

    转自:http://blog.csdn.net/earbao/article/details/8638348 <pre name="code" class="cpp ...

  4. 冒泡排序Matlab程序超详细注释

    冒泡排序Matlab程序超详细注释 bubble_sort.m function y=bubble_sort(x) % %冒泡算法: x_len=length(x);%度量数量长度,为排序做准备 fo ...

  5. 三轴桁架机械手上下料程序,用西门子smart200 ST40 脉冲控制3轴伺服程序,触摸屏程序,详细注释

    三轴桁架机械手上下料程序,用西门子smart200 ST40 脉冲控制3轴伺服程序,触摸屏程序,详细注释,控制系统详细说明书,文档详细讲解组态和指令,IO表,电气原理图G YID:8515649356 ...

  6. 三菱fx3U插补画圆,仅提供plc程序。 程序已详细注释

    三菱fx3U插补画圆,仅提供plc程序.程序已详细注释 ID:6949613098227047Miracle201999

  7. 西门子smart200控制3轴伺服程序,触摸屏程序,详细注释,控制系统详细

    三轴桁架机械手上下料程序,用西门子smart200 ST40 脉冲控制3轴伺服程序,可上西门子触摸屏程序,详细注释,控制系统详细说明书,文档详细讲解组态和指令,IO表,电气原理图 链接:https:/ ...

  8. C/C++认识标准win32应用程序

    我们创建好win32项目的空项目后创建main.cpp文件 敲以下代码 #include <Windows.h>int WINAPI WinMain(HINSTANCE hInstance ...

  9. X86汇编——计算斐波那契数列程序(详细注释和流程图说明)

    #X86汇编实现斐波那契数列 ##程序说明: 输入斐波那契数列的项数, 然后依次输出斐波那契数列, 输入的项数小于256且为数字, 计算的项数不能超过2^16次方, 输入失败是 不会回显数字 因为存结 ...

最新文章

  1. Android 6.0 以及HttpClient
  2. 五连阳回调买入法_短线高手总结的强势股回调买入法,散户需牢记
  3. 解密方程式组织的Unix后门NOPEN
  4. NP-Hard问题及组合最优化问题
  5. 循环自相关函数和谱相关密度(五)——实信号、复信号模型下的QPSK信号循环谱MATLAB仿真结果及代码
  6. [密码学基础][信息安全][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第一篇]不同类型的处理器
  7. 修改 JSON 对象的值
  8. mi max android 8.1,小米这款手机可以升级安卓 8.1 了!
  9. 第一章节 ASP.NET Web应用程序基础(二)
  10. markdown与latex:单行式子中连加连乘i放在下面\displaystyle
  11. 向java全台推送数据等
  12. 基于Python操作Excel实战案例
  13. SQL server 数据库 实验一
  14. diskgenius数据恢复软件,亲测可用!
  15. adb shell dunpsys SurfaceFlinger
  16. 关于csgo的观看录像fps低_CSGO如何设置视频选项高FPS
  17. 自制冰箱,冰柜蒸发器和毛细管的速算
  18. 家用千兆路由器排行榜前十名_家庭用哪款路由器好 2017最适合家用路由器排行榜...
  19. 蓝桥杯--第七届决赛:圆圈舞
  20. canvas快速入门(三)canvas实现笔触绘画案例

热门文章

  1. Swift UIImageView 相框
  2. 高斯滤波及高斯卷积核C++实现
  3. 多项选择题标准化考试系统设计
  4. 05. 交换机划分Vlan配置
  5. Android学习资源汇总
  6. 计算机软件被删了,电脑Word软件被卸载了,怎么办?
  7. 【封装】Deviation求方差
  8. 资本寒冬融资难,具备这四大特质的创业者更受青睐
  9. kubernetes容灾备份工具velero
  10. 创建html自定义标签,如何为htm创建自定义标签