Windows窗口的实现过程

//////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 一个典型的用C和Win32 API写的窗口程序
//  该示例描述了一个Windows窗口的实现过程,是应用Windows API函数进行编程的入门教程
//
//    on_road
//    2006.01.03
//////////////////////////////////////////////////////////////////////////////////////////////////////

#include <windows.h> //windows.h文件中包含应用程序中所需的数据类型和数据结构的定义

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //窗口函数说明

//============================以下初始化窗口类=================================================

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// WinMain入口函数说明
// WinMain函数是所有Windows应用程序的入口,类似C语言中的Main函数,其功能是完成一系列的定义
// 和初始化工作,并产生消息循环。消息循环是整个程序运行的核心。
// WinMain函数实现以下功能:
// 1、注册窗口类,建立窗口及执行其他必要的初始化工作。
// 2、进入消息循环,根据从应用程序消息队列接收的消息,调用相应的处理过程。
// 3、当消息循环检索到WM_QUIT消息时终止程序运行。
// WinMain函数有三个基本的组成部分:函数说明、初始化(即窗口类定义、注册窗口类、创建窗口、显示窗口)和消息循环。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int WINAPI WinMain(HINSTANCE hInstance,  //应用程序当前实例句柄
     HINSTANCE hPrevInstance, //应用程序其他实例句柄
     LPSTR lpCmdLine,  //指向程序命令行参数的指针 
     int nShowCmd)  //应用程序开始执行时窗口显示方式的整数值标识

{
 HWND hwnd;    //定义的窗口句柄
 MSG Msg;    //定义的消息数据类型变量
 WNDCLASS wndclass;   //定义的窗口类
 char lpszClassName[] = "window"; //窗口类名
 char lpszTitle[] = "Hello World!"; //窗口标题名

 //窗口类定义
 wndclass.style = 0;   //窗口类的样式,一般设置为0
 wndclass.lpfnWndProc = WndProc;  //指向窗口函数的指针(窗口处理函数为WndProc)
 wndclass.cbClsExtra = 0;  //分配在窗口类结构后的字节数(窗口类无扩展)
 wndclass.cbWndExtra = 0;  //分配在窗口实例后的字节数(窗口实例无扩展)
 wndclass.hInstance = hInstance;  //定义窗口类的应用程序的实例句柄(当前实例句柄)
 wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //窗口类的图标(窗口的最小化图标为默认图标)
 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);  //窗口类的光标(窗口采用箭头光标)
 wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); //窗口类的背景刷(窗口背景为白色)

 wndclass.lpszMenuName = NULL;  //窗口类菜单资源名(窗口中无菜单 )
 wndclass.lpszClassName = lpszClassName; //窗口类名(“window”)

 //===========================注册窗口类===================================================
 if(!RegisterClass(&wndclass))  //如果注册失败则发出警告声音
 {
  MessageBeep(0);
  return FALSE;
 }

 //===========================创建窗口=======================================================
 //并发出WM_CREATE消息
 hwnd = CreateWindow(lpszClassName, //窗口类名
  lpszTitle,   //窗口实例的标题名
  WS_OVERLAPPEDWINDOW,  //创建窗口的样式
  CW_USEDEFAULT,   //窗口左上角横坐标
  CW_USEDEFAULT,   //窗口左上角纵坐标
  CW_USEDEFAULT,   //窗口宽度
  CW_USEDEFAULT,   //窗口高度
  NULL,    //该窗口的父窗口句柄
  NULL,    //窗口主菜单句柄
  hInstance,   //创建窗口的应用程序当前句柄
  NULL);    //指向一个传递给窗口的参数值的指针

 //显示窗口
 ShowWindow(hwnd, nShowCmd); //hwnd:窗口句柄;nShowCmd:窗口显示的状态
 UpdateWindow(hwnd);  //更新并绘制用户区,并发出PAINT消息
 
 //=============================消息循环===================================================

 //////////////////////////////////////////////////////////////////////////////////////////
 // GetMessage用于从消息队列中读取一条消息,并将消息放在一个MSG结构中,。
 // 原型BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax)
 // LPMSG lpMsg:指向MSG结构的指针
 // HWND hWnd:窗口句柄
 // UINT wMsgFilterMin:用于消息过滤的最小消息号值
 // UINT wMsgFilterMax:用于消息过滤的最大消息号值,如果两个过滤参数都为0,则不过滤消息。
 //////////////////////////////////////////////////////////////////////////////////////////
 while( GetMessage(&Msg, NULL, 0, 0))
 {
  TranslateMessage(&Msg); //将消息的虚拟键转换为字符信息
  DispatchMessage(&Msg);  //将其参数指向的消息传送到指定窗口函数
 }

 return Msg.wParam; //消息循环结束即程序终止时将信息返回系统

}

//========================================窗口函数================================================

//////////////////////////////////////////////////////////////////////////////////////////////////
// 窗口函数定义了应用程序对接收到的不同消息的响应,其中包含了应用程序对各种可能接收到的消息的
// 处理过程,是消息处理分支控制语句的集合。窗口函数是应用程序处理接收到的消息的函数,其中包含
// 了应用程序对各种可能接收到的消息的处理过程。
//////////////////////////////////////////////////////////////////////////////////////////////////

LRESULT CALLBACK WndProc(HWND hwnd,     //窗口句柄
    UINT message,  //代表所处理消息的消息值
    WPARAM wParam, //消息的附加参数
    LPARAM lParam) //消息的附加参数
{
 switch(message)
 {
  case WM_DESTROY:
   PostQuitMessage(0); //调用PostQuitMessage发出WM_QUIT消息,请求退出
  default:
   //DefWindowProc是系统默认的处理过程,以保证所有发送到该窗口的消息均得以处理
   return DefWindowProc(hwnd, message, wParam, lParam);
 }
 return(0);
}

阅读更多

没有更多推荐了,返回首页