- /************************************************************************/
- /* Win32程序设计基础 */
- /************************************************************************/
- /************************************************************************/
- /* Win32程序的注释,虽然很简单,但是这是Win32程序设计的起步,所以详细些 */
- /************************************************************************/
- /************************************************************************/
- /* 导入包含文件WINDOWS.H,此文件包含了其它的Windows头文件 */
- /* WINDEF.H 基本类型定义 */
- /* WINNT.H 支持Unicode的类型定义 */
- /* WINBASE.H 内核函数 */
- /* WINUSER.H 用户接口函数 */
- /* WINGDI.H 图形设备接口函数 */
- /************************************************************************/
- #include <windows.h>
- /************************************************************************/
- /* 窗口对象的过程处理函数 */
- /* LRESULT: 简单定义为LONG(long) */
- /* CALLBACK:__stdcall,指在Windows本身和用户的应用程序之间发生的函数调 */
- /* 用的特殊调用序列。 */
- /* HWND: 窗口句柄,32位数字,该参数为接受消息的窗口的句柄, */
- /* CreateWindow函数的返回值。 */
- /* UINT: unsigned int 无符号整型32位, */
- /* 该参数为MSG结构中的message域相同,表示该消息的数字 */
- /* WPARAM: UINT,32位消息参数 */
- /* LPARAM: LONG,32位消息参数 */
- /************************************************************************/
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
- /************************************************************************/
- /* Windows应用程序的主函数,有四个参数,名称固定为WinMain,返回值为int */
- /* WINAPI 在WINDEF.H中定义,#define WINAPI __stdcall */
- /* HINSTANCE:实例句柄,数字 */
- /* 在32位系统中WinMain的第二个参数总为NULL(定义为0) */
- /* 第三个参数用于运行程序的命令行, */
- /* 某些Windows应用程序使用这个参数在程序启动时将文件加载到内存 */
- /* LPSTR/PSTR:指向字符串的指针,相当于 char * */
- /* 第四个参数指出程序最初显示的方式,正常,最大化,最小化等。 */
- /************************************************************************/
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR lpszCmdLine, int iCmdShow)
- {
- /************************************************************************/
- /* 定义窗口类 */
- /* TCHAR:char */
- /* _T和TEXT宏,功能一致,通常没用,在Unicode系统中, */
- /* 自动把后面的字符串转换为宽字符串 */
- /************************************************************************/
- TCHAR tcClassName[] = TEXT("My Window"); //窗口类名字符串
- /************************************************************************/
- /* WNDCLASS:窗口类结构,定义了窗口的一般特性,可以创建不同的窗口 */
- /* typedef struct */
- /* { */
- /* UINT style ; */
- /* WNDPROC lpfnWndProc ; */
- /* int cbClsExtra ; */
- /* int cbWndExtra ; */
- /* HINSTANCE hInstance ; */
- /* HICON hIcon ; */
- /* HCURSOR hCursor ; */
- /* HBRUSH hbrBackground ; */
- /* LPCTSTR lpszMenuName ; */
- /* LPCTSTR lpszClassName ; */
- /* } */
- /* WNDCLASS, * PWNDCLASS ; */
- /************************************************************************/
- WNDCLASS wc; //窗口类属性描述结构
- wc.lpszClassName = tcClassName; //窗口类名
- wc.lpszMenuName = NULL; //窗口类菜单资源名
- wc.lpfnWndProc = WndProc; //窗口对象的过程处理函数,指向函数的指针
- wc.hInstance = hInstance; //当前进程对象句柄,接收于WinMain参数
- wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); //窗口背景刷子对象
- wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //图标对象
- wc.hCursor = LoadCursor(NULL, IDC_ARROW); //光标对象
- wc.cbClsExtra = 0; //同类窗口对象公共数据区大小
- wc.cbWndExtra = 0; //当前窗口对象私有数据区大小
- wc.style = CS_HREDRAW | CS_VREDRAW; //窗口类风格,水平或垂直尺寸改变后刷新
- if (!RegisterClass(&wc)) //注册窗口类,参数为指向WNDCLASS结构的指针
- {
- /************************************************************************/
- /* 窗口类注册不成功的错误信息 */
- /* MessageBox 消息框 */
- /* 参数一:窗口句柄,如果没有则为NULL */
- /* 参数二:消息框主体显示的字符串 */
- /* 参数三:消息框标题栏上的字符串 */
- /* 参数四:winuser.h中定义的MB_开始的常数组合,消息框风格:按钮,图标 */
- /* 为0,则只有ok按钮 */
- /* 返回值:返回IDOK(1)。 */
- /* 还可以返回IDYES、IDNO、IDCANCEL、IDABORT、IDRETRY、IDIGNORE等 */
- /************************************************************************/
- MessageBox(NULL, TEXT("RegisterClassError!"), TEXT("Error"), MB_ICONERROR);
- return 0; //如果注册失败,返回并终止程序
- }
- /************************************************************************/
- /* 定义窗口对象属性,指定有关窗口的更详细信息 */
- /************************************************************************/
- TCHAR tcWindowCaptionName[] = TEXT("Win32 API"); //窗口对象标题名称
- CREATESTRUCT cs; //窗口对象属性描述结构,定义在WINUSER.H
- cs.lpszClass = tcClassName; //窗口类名
- cs.lpszName = tcWindowCaptionName; //窗口对象标题名称,显示在标题栏
- cs.style = WS_OVERLAPPEDWINDOW; //窗口对象风格
- cs.x = 100; //窗口对象在屏幕上的x坐标
- cs.y = 100; //窗口对象在屏幕上的y坐标
- cs.cx = 400; //窗口对象的宽度
- cs.cy = 300; //窗口对象的高度
- cs.hwndParent = NULL; //窗口对象的父窗口句柄
- cs.hMenu = NULL; //窗口对象的菜单句柄或子窗口编号
- cs.hInstance = hInstance; //当前进程的实例句柄,WinMain参数
- cs.lpCreateParams = NULL; //创建参数指针,可以访问以后想要引用的程序中的数据
- /************************************************************************/
- /* 创建窗口对象 */
- /* 定义窗口句柄hWnd,值为CreateWindows函数的返回值。 */
- /* 即创建成功返回窗口的句柄,否则返回NULL */
- /************************************************************************/
- HWND hWnd = CreateWindow( cs.lpszClass,
- cs.lpszName,
- cs.style,
- cs.x,
- cs.y,
- cs.cx,
- cs.cy,
- cs.hwndParent,
- cs.hMenu,
- cs.hInstance,
- cs.lpCreateParams);
- if (hWnd == NULL) //判断创建是否成功
- {
- /************************************************************************/
- /* 窗口对象创建不成功的错误提示 */
- /************************************************************************/
- MessageBox(NULL, TEXT("CreateWindowError!"), TEXT("Error!"),MB_ICONERROR);
- return 0;
- }
- /************************************************************************/
- /* 显示窗口对象 */
- /* 此时Windows内部已经创建了这个窗口。已经分配内存。 */
- /* 但是要显示在显示器上还需要调用两个函数。 */
- /* ShowWindows(hwnd,iCmdShow) */
- /* 第一个参数是刚刚用CreateWindow创建的窗口的句柄。 */
- /* 第二个参数是传给WinMain的iCmdShow。用来确定最初如何在屏幕上显示窗口。*/
- /* 也可以自定义选择以选项: */
- /* SW_SHOWNORMAL //常规 */
- /* SW_SHOWMAXIMIZED //最大化 */
- /* SW_SHOWMINNOACTIVE //只显示在任务栏 */
- /* UpdateWindow(hWnd) */
- /* 导致客户区域被绘制。通过给窗口过程(Wndproc)发送一个WM_PAINT消息实现 */
- /************************************************************************/
- ShowWindow(hWnd, iCmdShow);
- UpdateWindow(hWnd);//立即刷新窗口对象
- /************************************************************************/
- /* 消息检索,消息循环 */
- /* MSG:消息结构,被定义在WINUSER.H */
- /* 消息循环以GetMessage调用开始,它从消息队列中取出一个消息 */
- /* 这一调用传递给Windows一个指向msg的MSG结构指针。 */
- /* 第二、三、四个参数为NULL或者0表示程序接收自己创建的所有窗口的所有消息*/
- /* Windows用从消息队列中取出的下一个消息填充msg结构的各个域 */
- /* MSG:消息结构: */
- /* typedef struct tagMSG */
- /* { */
- /* HWND hwnd ; //消息发向的窗口的句柄。 */
- /* UINT message ; //消息标识符,一个数值,定义在Window头文件中 */
- /* WPARAM wParam ; //一个32位的消息参数,含义根据消息不同而不同 */
- /* LPARAM lParam ; //同上 */
- /* DWORD time ; //消息放入消息队列时的时间 */
- /* POINT pt ; //消息放入消息队列时的鼠标坐标 */
- /* } */
- /* MSG, * PMSG ; //结构名 */
- /************************************************************************/
- MSG msg;
- while (GetMessage(&msg, NULL, 0, 0))
- {
- /************************************************************************/
- /* 检索消息;当检索到WM_QUIT(其值为0x0012)消息时,从消息循环中退出 */
- /************************************************************************/
- TranslateMessage(&msg);//将msg结构传递给Windows,进行虚拟键盘消息的转换
- DispatchMessage(&msg); //发送消息,由此操作系统调用相应的窗口过程处理消息
- }
- /************************************************************************/
- /* 主窗口返回 */
- /************************************************************************/
- return msg.wParam;
- }
- /************************************************************************/
- /* 窗口对象的过程处理函数 */
- /* 四个参数与MSG结构中的前四个参数相同。 */
- /* 程序通常不直接调用窗口过程,由Windows本身调用。 */
- /* 程序可以通过SendMessage函数调用自己的窗口过程 */
- /************************************************************************/
- LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
- {
- /************************************************************************/
- /* 对消息进行分类处理 */
- /* WINUSER.H为每个消息定义以WM为前缀的标识符 */
- /*一般Windows程序元用switch和case结构来处理,此时必须返回0。 */
- /*窗口过程不处理的其它消息必须传递给DefWindowProc函数, */
- /*窗口过程返回该函数返回值 */
- /************************************************************************/
- switch (iMsg)
- {
- /************************************************************************/
- /* 客户区的绘制消息,窗口客户区域无效时刷新 */
- /************************************************************************/
- case WM_PAINT:
- {
- /************************************************************************/
- /* PAINTSTRUCT:绘图结构,定义在WINUSER.H中 */
- /* RECT:矩形结构 */
- /* HDC:设备描述表句柄 */
- /************************************************************************/
- PAINTSTRUCT ps;
- HDC hDC;
- RECT rect;
- /************************************************************************/
- /* 对于WM_PAINT的处理几乎总是从一个BeginPaint函数开始的: */
- /* hDC = BeginPaint(hWnd, &ps) */
- /* 而已一个EndPaint函数结束 */
- /* EndPaint(hWnd, &ps) */
- /* 两个调用中第一个参数是程序的窗口句柄, */
- /* 第二个参数是指向类型为PAINTSTRUCT的结构指针 */
- /************************************************************************/
- hDC = BeginPaint(hWnd, &ps); //获取显示设备对象及绘制描述属性
- GetClientRect(hWnd, &rect); //获取当前窗口对象客户区矩形
- SetBkMode(hDC,TRANSPARENT); //设置背景方式
- SetTextColor(hDC, RGB(255, 0, 0)); //设置文本颜色
- /************************************************************************/
- /* 绘制文本 */
- /* DrawText函数,第一个参数是从BeginPaint返回的设备描述表句柄 */
- /* 第二个参数是要输出的文本 */
- /* 第三个参数是-1,表示文本串是以字节0终结的。 */
- /* 第四个参数要绘制的矩形区域 */
- /* 最后一个参数是系列标志位,定义在WINDUSER.H中,水平、垂直中央,单行 */
- /************************************************************************/
- DrawText(hDC, TEXT("Hello, Win32!"), -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
- EndPaint(hWnd, &ps); //客户区绘制结束,归还显示设备对象
- return 0;
- }
- case WM_DESTROY: //接收到WM_DEFTROY消息
- {
- /************************************************************************/
- /* 发送WM_QUIT消息,通知线程消息检索循环,清除窗口主程序可以退出 */
- /* PostQuitMessage(0)函数在消息队列里插入一个WM_QUIT消息 */
- /************************************************************************/
- PostQuitMessage(0);
- return 0;
- }
- }
- /************************************************************************/
- /* 程序末处理的消息交给window系统的缺省窗口对象的过程处理函数处理 */
- /************************************************************************/
- return DefWindowProc(hWnd, iMsg, wParam,lParam);
- }