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的使用 查看数据结构、函数定义.
- Windows程序设计__孙鑫C++Lesson1《Windows内部运行原理》
- Lesson1 Windows程序内部运行原理
- Lesson1 Windows程序内部运行原理 ---孙鑫VC++教程
- Lesson1 Windows程序内部运行原理 ---孙鑫VC++教程
- (孙鑫C++)windows 程序内部运行原理
- Lesson1:Windows程序内部运行机制
- Windows程序设计__孙鑫C++Lesson2《掌握C++》 .
- 孙鑫 Windows程序内部运行原理
- Lesson1: Windows程序运行原理及程序编写流程
- Lesson1: Windows程序运行原理及程序编写流程
- Lesson1: Windows程序运行原理及程序编写流程
- Lesson1: Windows程序运行原理及程序编写流程
- Windows程序设计__孙鑫C++Lesson4《绘图操作》
- Windows程序设计__孙鑫C++Lesson5《文本操作》
- Windows程序设计__孙鑫C++Lesson6《菜单操作》
- Windows程序设计__孙鑫C++Lesson7《对话框操作1》
- Windows程序设计__孙鑫C++Lesson8《对话框操作2》
- Windows程序设计__孙鑫C++Lesson9《应用程序外观修改》
- SPI协议通信
- .NET版的WebGoat
- 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
- zoj 1201 inversion(我真是弱爆了)
- hdu 3343 Legal or Not 拓扑排序(容易题)
- Windows程序设计__孙鑫C++Lesson1《Windows内部运行原理》
- ora-15077,ASM磁盘组不能挂载
- linux HID驱动分析
- Servlet 3.0 新特性详解
- 开发安卓系统Android和码输入法软件的全过程(一)
- 基于visual c++之windows核心编程代码分析(25)检测U盘控制开关机
- HTML5 Canvas实现透明效果
- jquery ui 手风琴效果集锦
- 怎样能防止瞌睡?