01windows程序运行机制、代码编写流程与剖析

#include<windows.h>      //win 32 application 需要的头文件
#include<stdio.h>

LRESULT CALLBACK WinNewProc(    //回调函数,用于处理消息
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);

int WINAPI WinMain(
  HINSTANCE hInstance,      // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,          // command line
  int nCmdShow              // show state
)
{ //第一步、创建一个窗口类
 WNDCLASS winClass;      //声明一个WNDCLASS类的变量,下面进行对各成员的赋值
 winClass.cbClsExtra = 0;    //类的扩展风格,没有就设为0
 winClass.cbWndExtra = 0;    //窗口的扩展风格,没有就设为0
 winClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_PEN);  //设定画刷的颜色,设置背景色
 winClass.hCursor = NULL;    //光标的样式
 winClass.hIcon = LoadIcon(hInstance,IDI_ERROR);   //设置应用程序的图标
 winClass.hInstance = hInstance;   //实例句柄
 winClass.lpfnWndProc = WinNewProc;  //回调函数,WinMain函数前有声明,后有定义
 winClass.lpszClassName = "first";  //创建的新类的类名
 winClass.lpszMenuName = NULL;   //无菜单
 winClass.style = CS_HREDRAW | CS_VREDRAW; //样式:水平和垂直拉伸
 //第二步、注册一个类
 RegisterClass(&winClass);    //将该WNDCLASS注册
 HWND hwnd;        //窗口句柄,用于指向创建的窗口
 hwnd = CreateWindow("first",   //已经创建的类名
   "第一个Win32程序",    //窗口标题名
   WS_OVERLAPPEDWINDOW,   //窗口风格,此处包含最小化、最大化、关闭按钮
  300,300,       //初始化窗口被创建的坐标位置
  600,400,       //设定窗口创建时的大小
  NULL,NULL,       //父窗口和菜单句柄,此处无
  hInstance,NULL);     //实例句柄与空指针LPVOID
 ShowWindow(hwnd,SW_SHOWNORMAL);   //将创建的窗口显示出来,显示风格是自然风格
 UpdateWindow(hwnd);      //更新窗口

 MSG msg;        //声明一个消息结构体变量
 while(GetMessage(&msg,NULL,0,0))  //消息循环
 {
  TranslateMessage(&msg);    //转换消息,解释翻译消息
  DispatchMessage(&msg);    //调用回调函数处理消息
 }

 return 0;
}
//全局静态变量,用于记录发生重绘的次数
static int count = 1;      //记录WM_PAINT消息的次数

LRESULT CALLBACK WinNewProc(
  HWND hwnd,      // handle to window 窗口句柄
  UINT uMsg,      // message identifier 消息标识
  WPARAM wParam,  // first message parameter 消息的第一个附加参数,比如记录用户的按键
  LPARAM lParam   // second message parameter 消息的第二个附加参数
)
{
 switch(uMsg)          //选择消息,只处理用户感兴趣的消息
 {//当窗口初始显示、最小化、最大化、窗口尺寸发生改变均发送WM_PAINT消息
 case WM_PAINT:          //重绘消息,当窗口发生尺寸发生改变就需要重绘
  HDC hdc;          //DC句柄
  PAINTSTRUCT ps;         //重绘结构体
  hdc = BeginPaint(hwnd,&ps);      //开始重绘,与EndPaint函数成对使用
  char ch[20];         //存储信息的临时缓冲区
  sprintf(ch,"这是第%d次重绘",count++);   //格式转换函数、包含于stdio.h头文件中
  TextOut(hdc,200,200,ch,strlen(ch));    //TextOut函数将该信息在200,200的坐标位置显示出来
  EndPaint(hwnd,&ps);        //结束重绘
  break;
 case WM_DESTROY:
  PostQuitMessage(0);     //当发生WM_DESTROY消息,发出退出消息,退出消息循环,终止程序
  break;
 case WM_CHAR:       //键盘按下消息
  char szChar[20];
  sprintf(szChar,"您按下的键是%d",wParam);
  MessageBox(hwnd,szChar,"提示",0);  //提示用户按键的ASCII码
  break;
 case WM_LBUTTONDOWN:     //鼠标左键按下消息
  MessageBox(hwnd,"鼠标左键按下","提示",0);
  HDC hDc;
  hDc = GetDC(hwnd);
  TextOut(hDc,0,50,"您按下了鼠标左键",strlen("您按下了鼠标左键"));
  ReleaseDC(hwnd,hDc);    //与GetDC函数成对出现
  break;
 case WM_RBUTTONDOWN:     //鼠标右键按下消息
  HDC hDC;
  hDC = GetDC(hwnd);
  MessageBox(hwnd,"鼠标右键按下","提示",0);
  TextOut(hDC,0,150,"您按下了鼠标右键",strlen("您按下了鼠标右键"));
  ReleaseDC(hwnd,hDC);
  break;
 case WM_CLOSE:        //用户按下关闭时弹出确认对话框
  if(IDYES==MessageBox(hwnd,"确定退出吗?","提示",MB_YESNO))
  {
   DestroyWindow(hwnd);    //如果用户按下确认,则发出WM_DESTROY消息
  }
  break;
 default :         //除此之外的消息,则调用默认的回调函数
  return DefWindowProc(hwnd,uMsg,wParam,lParam);
 }
 return 0;
}
/*附加
1、窗口与句柄
窗口是是屏幕上一块矩形区域,是Windows应用程序与用户进行交互的接口。窗口分为客户区和非客户区。
 在Windows应用程序中,窗口是通过窗口句柄(HWND)来标识的,要对某个窗口进行操作,首先就要得到这个窗口的句柄。
其它各种资源(窗口,图标,光标等),系统在创建这些资源时会为它们分配内存,并返回标识这些资源的标识号,即句柄。
光标句柄(HCURSOR),图标句柄(HICON),窗口句柄(HWND),画刷句柄(HBRUSH)。
2、消息队列与消息循环
消息队列:每当一个Windows应用程序创建后,系统都会为该程序创建一个消息队列,这个消息队列用来存放该程序的窗口的消息,
消息产生后被投递到消息队列中,应用程序通过一个消息循环不断的消息队列中取出消息进行响应。
响应过程由系统向应用程序发送消息,实际就是调用应用程序的消息处理函数即回调函数。
当收到PostQuitMessage消息时,退出消息循环
3、创建一个完整的Win32程序,该程序实现创建一个窗口,其中主要步骤为
A.WinMain函数的定义,主函数类似与控制台程序的main函数
B.创建一个完整的窗口的四个步骤
a.设计窗口类;b:注册窗口类;c:创建窗口,声明一个窗口句柄标识创建的窗口册;d:显示窗口,可选择不同的显示风格
C.进行消息循环,调用回调函数对消息进行处理
D.编写窗口过程函数,处理需要的消息,不需要的消息交给DefWindowProc默认的消息处理函数
4、获取DC使用后要释放DC即GetDC()与ReleaseDC()要成对使用,否则会造成内存泄漏
5、在WM_PAINT重回消息中,BeginPaint()要与EndPaint()成对使用,且只用于重绘消息中
*/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值