Windows程序设计__孙鑫C++Lesson1《Windows内部运行原理》

来源:互联网 发布:双模卡写卡软件 编辑:程序博客网 时间:2024/04/27 22:44
 

Windows程序设计__孙鑫C++Lesson1《Windows内部运行原理》

本节要点:

1.Windows操作系统的消息机制

2.窗口产生过程

3,消息循环

采用C++ Win32 Application (注意不要选择了WIN32 Console Application 因为我们编写的窗口的应用程序 而不是控制台)编写一个窗口程序代码如下:

//***********************************************************************************************************************

//WinMain.cpp#include <Windows.h>#include <stdio.h>//回调函数原型声明LRESULT CALLBACK WindowProc(  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 WndCls; WndCls.style=CS_HREDRAW |CS_VREDRAW;    WndCls.lpfnWndProc=WindowProc;    WndCls.cbClsExtra=0;    WndCls.cbWndExtra=0;    WndCls.hInstance=hInstance;    WndCls.hIcon =LoadIcon(NULL,IDI_APPLICATION);    WndCls.hCursor =LoadCursor(NULL,IDC_ARROW);    WndCls.hbrBackground=(HBRUSH)(GetStockObject(DKGRAY_BRUSH));     WndCls.lpszMenuName =NULL;    WndCls.lpszClassName ="qiaoqiao"; //注册窗口类 RegisterClass(&WndCls); //创建窗口类 HWND hWnd; hWnd=CreateWindow("qiaoqiao","Windows运行机制学习",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,  CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL); //显示窗口 ShowWindow(hWnd,SW_SHOWNORMAL); //消息循环 MSG uMsg; while(GetMessage(&uMsg,NULL,0,0)) {    TranslateMessage(&uMsg);    DispatchMessage(&uMsg); }    return 0;}//回调函数的实现LRESULT CALLBACK WindowProc(  HWND hwnd,      // handle to window  UINT uMsg,      // message identifier  WPARAM wParam,  // first message parameter  LPARAM lParam   // second message parameter){      HDC dc;  PAINTSTRUCT ps;  char szch[30];     switch(uMsg)  {     case WM_KEYDOWN :   sprintf(szch,"按键消息 %d",wParam);   MessageBox(hwnd,szch,"提示",MB_OK);   break;  case WM_LBUTTONDOWN:   POINTS pt;   pt=MAKEPOINTS(lParam);//GET_X_LPARAM(lParam);   GET_Y_LPARAM(lParam); 亦可但要加头文件 Windowsx.h            dc=GetDC(hwnd);            sprintf(szch,"左键按下消息 鼠标位置x=%d,y=%d",pt.x,pt.y);   TextOut(dc,50,50,szch,strlen(szch));   ReleaseDC(hwnd,dc);  case WM_PAINT :              dc=BeginPaint(hwnd,&ps);             sprintf(szch,"%s","学习Windows窗口产生及消息循环机制");              TextOut(dc,0,0,szch,strlen(szch));              EndPaint(hwnd,&ps);     break;  case WM_CLOSE:     if(IDYES==MessageBox(hwnd,"确定要退出程序吗?","提示",MB_YESNO|MB_ICONQUESTION))      DestroyWindow(hwnd);     break;  case WM_DESTROY:    PostQuitMessage(0);    break;  default:   return DefWindowProc(hwnd,uMsg,wParam,lParam);  }  return 0;}

//********************************************************************************************************************

程序运行效果如图:

本节小结:

1.掌握HANDLE HWND  MSG 等重要的数据结构.

附加补充一点关于HANDLE的概念和自己的实验。

(1)(来自百度)HANDLE(句柄)是windows操作系统中的一个概念。在window程序中,有各种各样的资源(窗口、图标、光标等),系统在创建这些资源时会为它们分配内存,并返回标示这些资源的标示号,即句柄。句柄指的是一个核心对象在某一个进程中的唯一索引,而不是指针。由于地址空间的限制,句柄所标识的内容对进程是不可见的,只能由操作系统通过进程句柄列表来进行维护。句柄列表: 每个进程都要创建一个句柄列表,这些句柄指向各种系统资源,比如信号量,线程,和文件等,进程中的所有线程都可以访问这些资源

(2)我利用Win32 Console Application做了HANDLEEx的实验,代码如下:

//*********************************************************************************************************************

//HANDLEEx.cpp#include <Windows.h>#include <iostream.h>#include <stdio.h>void main(){ char szch[50]="HANDLEEx.dsw"; HANDLE handle; SYSTEMTIME FileSysTime,FileLocalTime; TIME_ZONE_INFORMATION TimeZoneInfo;    LPWIN32_FIND_DATA fd=new WIN32_FIND_DATAA; memset(fd,0,sizeof(LPWIN32_FIND_DATA)); handle=FindFirstFile(szch,fd); if(INVALID_HANDLE_VALUE!=handle) {  cout<<"file found!"<<endl;  GetTimeZoneInformation(&TimeZoneInfo);    if( FileTimeToSystemTime(&fd->ftCreationTime,&FileSysTime) &&    SystemTimeToTzSpecificLocalTime(&TimeZoneInfo,&FileSysTime,&FileLocalTime) )//获取文件创建的系统时间并转换为本地时间  {   sprintf(szch,"file createtime is %d年%d月%d日,%d:%d:%d",    FileLocalTime.wYear,FileLocalTime.wMonth,FileLocalTime.wDay,    FileLocalTime.wHour,FileLocalTime.wMinute,FileLocalTime.wSecond);      cout<<szch<<endl;  } } else  cout<<"not found!"<<endl; delete fd;} 

//***********************************************************************************************

运行效果如下:

file found!
file createtime is 2012年1月22日,8:49:54

//***********************************************************************************************

2.掌握Windows窗口产生过程:设计窗口----注册窗口---创建窗口----显示窗口

3.掌握消息循环机制 回调函数的特点

补充一点,关于GetMessage与PeekMessage区别:(摘自:http://www.cnblogs.com/faceang/archive/2010/05/25/1743757.html  PeekMessage&GetMessage )

PeekMessage与GetMessage的对比
相同点:
PeekMessage函数与GetMessage函数都用于查看应用程序消息队列,有消息时将队列中

的消息派发出去。

不同点:
无论应用程序消息队列是否有消息,PeekMessage函数都立即返回,程序得以继续执行

后面的语句(无消息则执行其它指令,有消息时一般要将消息派发出去,再执行其它

指令)。
GetMessage函数只有在消息对立中有消息时返回,队列中无消息就会一直等,直至下

一个消息出现时才返回。在等的这段时间,应用程序不能执行任何指令。

4.学会windows的MSDN的使用  查看数据结构、函数定义.

 

 

原创粉丝点击