当前位置:首页 > Windows程序 > 正文

WINDOWS消息和窗口简介

2021-03-24 Windows程序

一、WINDOWS的消息和窗口简介:
1、什么是windows在这里我就不介绍了,但是作为一个程序员我们要知道WINDOWS最重要的一个也是我们程序员常用的一个东西就是消息。窗口是以消息的形式输入的,窗口也用消息与其它窗口通讯。
2、我们常会说windows给程序发送了一个消息,其实这是指windows调用程序中的一个函数,该函数的参数描述了这个特定消息。这种位于windows程序中的函数称为“窗体消息处理程序”。程序建立的每一个窗体都有相关的窗口消息处理程序。这个窗口消息处理程序是一个函数,既可以在程序中,也可以在动态链接库中。Windows通过调用窗口消息处理程序来给窗体发送消息。窗口消息处理程序根据此消息进行处理,然后将控制传回给windows。
3、在对象导向的程序设计中,对象是程序与数据的组合。窗口是一种对象,其程序是窗口消息处理程序。数据是窗口消息处理程序保存的信息和windows为每个窗口以及系统中那个窗口类别保存的信息。
4、windows程序开始执行后,windows为该程序建立一个“消息队列”。这个消息队列用来存放该程序可能建立的各种不同窗口的消息。程序中有一小段程序代码,叫做“消息循环”,用来从队列中取出消息,并且将它们发送给相应的窗口消息处理程序。有些消息直接发送给窗口消息处理程序,不用放入消息队列中。
二、一个真正的windows程序:

// HELLOWIN.C /*------------------------------------------------------------------------ HELLOWIN.C -- Displays "Hello, Windows 98!" in client area (c) Charles Petzold, 1998 -----------------------------------------------------------------------*/ #include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { // TEXT 宏——UNICODE标识 static TCHAR szAppName[] = TEXT ("HelloWin") ; HWND hwnd ; MSG msg ; WNDCLAS wndclass ; // 窗口类 wndclass.style = CS_HREDRAW | CS_VREDRAW ; // 窗口类风格 wndclass.lpfnWndProc = WndProc ; // 窗口过程 wndclass.cbClsExtra = 0 ; // 在类结构保存的窗口结构中预留一些额外空间 wndclass.cbWndExtra = 0 ; // 在Windows内部保存的窗口结构中预留一些额外空间 wndclass.hInstance = hInstance ; // 程序的实例句柄 wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; // 加载图标资源 wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; // 加载光标资源 wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; // GetStockObject获取(画笔、刷子等)GDI对象 wndclass.lpszMenuName = NULL ; // 指定窗口类菜单 wndclass.lpszClassName = szAppName ; // 指定窗口类名 if (!RegisterClass (&wndclass)) // 注册窗口类 { MessageBox ( NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow( szAppName, // window class name TEXT ("The Hello Program"), // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, // initial x position CW_USEDEFAULT, // initial y position CW_USEDEFAULT, // initial x size CW_USEDEFAULT, // initial y size NULL, // 父窗口句柄 NULL, // 菜单句柄 hInstance, // program instance handle NULL ) ; // creation parameters // 窗口创建成功后,系统将在内存中为其分配一块内存,但是此时窗口并未显示在显示器上,所以需要使用两个调用: ShowWindow (hwnd, iCmdShow) ; // 显示窗口 UpdateWindow (hwnd) ; // 将导致客户区被绘制 // 程序通过执行一个叫做“消息循环”的代码从消息队列中取出消息 // 注意GetMessage(阻塞,若没有消息则不返还控制权)和PeekMessage(非阻塞,若没有消息也会返回)的区别 while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; // 将msg结构传给Windows,进行一些键盘转换 DispatchMessage (&msg) ; // 将msg结构传给Windows,然后Windows将里面的消息发给相应的窗口过程进行处理 } return msg.wParam ; } // CALLBACK类型(供系统调用) LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc ; PAINTSTRUCT ps ; RECT rect ; switch (message) { // 当Windows在处理CreateWindow函数时,窗口过程就会接收到WM_CREATE消息 case WM_CREATE: PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ; return 0 ; // 当窗口客户区域的一部分或全部变成“无效”时,必须进行刷新,WM_PAINT将通知程序 case WM_PAINT: // BeginPaint调用使整个客户区有效,并返回一个“设备环境句柄 hdc = BeginPaint (hwnd, &ps) ; // 当改变窗口大小时,WndProc通过调用GetClientRect来获取变化后的窗口大小,重新绘制客户区 GetClientRect (hwnd, &rect) ; // 在指定的区域内输出格式化的文本 DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint (hwnd, &ps) ; return 0 ; // 当用户点击关闭按钮时发生 case WM_DESTROY: // 调用PostQuitMessage以标准方式响应WM_DESTROY消息; // PostQuitMessage(0); // 该函数在程序的消息队列插入一个WM_QUIT消息。 // GetMessage对于除了WM_QUIT消息之外的从消息队列中取出的所有消息都返回非0值。而当GetMessage取到一个WM_QUIT消息时,返回0 PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/66543.html