怎么做网站vip并且收费,100t空间 做网站,玉山网站建设,深圳网站建设响应式网站一、windows程序基础
1. Windows程序的特点
1#xff09;用户界面统一、友好 2#xff09;支持多任务:允许用户同时运行多个应用程序(窗口) 3#xff09;独立于设备的图形操作 使用图形设备接口( GDI, Graphics Device Interface )屏蔽了不同硬件设备的差异#…一、windows程序基础
1. Windows程序的特点
1用户界面统一、友好 2支持多任务:允许用户同时运行多个应用程序(窗口) 3独立于设备的图形操作 使用图形设备接口( GDI, Graphics Device Interface )屏蔽了不同硬件设备的差异提供了设备无关的图形输出能力 4队列化消息输入,支持队列特征的消息驱动模型 把从键盘、鼠标等输入设备接收的输入信息放入应用程序的队列中; Windows操作系统管理队列;应用程序需要输入信息时,不读硬件端口只读消息队列。 5事件驱动的程序设计 - Windows程序由事件的发展控制,允许程序的用户用各种合理的顺序来安排程序的流程。 6资源共享 -各个应用程序共享系统提供的资源,包括设备上下文、画刷、画笔、字体、对话框、图标、定时器、通信端口。
7程序和资源分开 -菜单、对话框、位图等可视对象被单独分离出来加公的全部资源定义都放在资源文件中通常以.rc为后缀名 8支持应用程序间的数据交换
2. 一个简单的Windows应用程序
#include windows.h
int WINAPI WinMain (HINSTANCE hInstance, HINS TANCE
hPrevInstance, LPSTR IpCmdLine, int nCmdShow)
{
MessageBox (NULL, 你好,我的Visual C世界! , 问候MB_ OKCANCEL);
return 0 ;
}
运行结果 3.事件及事件驱动
●Windows系统也叫事件驱动的系统。当用户按下一个键、移动鼠标或单击鼠标按钮时计算机通知Windows系统已经发生了一一个事件以及事件的种类、发生的时间、发生的位置(如坐标值)。 ●事件通常以下列三种方式产生: -通过输入设备,如键盘和鼠标; -通过屏幕上可视的对象如菜单、工具栏按钮、动条和对话框上的控件; -来自Windows内部,如当一个后面的窗口显示到窗口前面时。
基于事件驱动的程序模型 4.消息 ●当Windows捕获一 条事件后 ,它会编写一条消息将相关信息放入一个数据结构MSG中,然后将包含此数据结构的消息发给需要消息的程序。。 ●消息处理是Windows应用程序的核心。 ●消息是操作系统通知应用程序某件事情已经发生的一种方式。 ●Windows消息是在Windows.h文件中用宏定义的常数。 ●消息常数名常以WM_ 开头格式为WM_XX。
(1)Windows消息来源 Windows应用程序的消息来源于以下四种: (1)输入消息:键盘和鼠标的输入。此类消息先放在系统消息队列中然后由Windows将它们送入应用程序消息队列中由应用程序来处理消息。 (2)控制消息:与Windows的控制对象如列表框、复选框等进行双向通信。这类消息一般不经过应用程序的消息队列而是直接发送到控制对象。 (3)系统消息:对程序化的事件或系统时钟中断作出的一些反应。 (4)用户消息:程序员自己定义并在应用程序中主动发生的一般由应用程序的某一部分内部处理。 VC 存在几种系统定义的消息分类,不同的前缀符号经常用于识别不同的消息类系统定义的消息宏前缀如下: BM :按钮控制消息 CB :组合框控制消息 DM :默认下压式按钮控制消息 EM :编辑控制消息 LB :列表框控制消息 SBM :滚动条控制消息 WM :窗口控制消息
(2)Windows消息数据结构 消息号:由事先定义好的消息名标识 字参数(wParam) :用于提供消息的附加信息 长字参数(IParam) :用于提供消息的附加信息
Windows消息的数据结构
typedef struct tagMSG
{
HWND hwnd; //窗口句柄为nul则可检索所有驻留在消息队交中的消息
UINT message; //消息值,由Windows h头文件中的宏定义标识
WPARAM wParam; //包含有关消息的附加信息不同消息其值不同
LPARAM IParam;
DWORD time; 1指定消息送至队列的时间
POINT p:/消息发送时屏幕光标位置POINT是一个结构体
}MSG;注意字参与长字参是作为消息的附加信息的它与具体消息号的值有关Windows中消息用结构体MSG表示DWORD是32位无符号整型 POINT是一个结构体
typedef struct tagPOINT
{
LONGX;
LONG y;
}POINT,二、消息队列和API
1. Windows消息队列 ●当产生某消息时,该消息进入消息队列操作系统根据消息提供的信息值决定由哪个应用程序来处理; ●应用程序按一定的方式查找应用程序中各个类的消息映射(一组宏,用来确定某个消息及相应的处理程序;的对应关系) ; ●找到处理程序后由处理程序执行相应的操作。 ●消息队列是一一个系统定义的内存块用于临时存储消息或把消息直接发给窗口函数。 ●每个窗口维护自己的消息队列,并从队列中取出消息利用窗口函数进行处理。 2. Windows程序常用消息
( 1 )标准Windows消息(前缀为WM_ ) 分为三类:鼠标消息、键盘消息和窗口消息 (2)控件消息 控件或其他子窗口向父窗口发送WM_ COMMAND消息
(3 )命令消息 菜单项、工具栏按钮、加速键等用户界面对象发送的WM_ COMMAND消息。
●焦点消息: WM_ SETFOCUSWM_ KILLFOCUS ●定时器消息: WM_ TIMER ( 1 )标准Windows消息- -鼠标消息 -WM_ LBUTTONDOWN :单击鼠标左键时产生的消息 -WM_ LBUTTONUP :放开鼠标左键时产生的消息 -WM_ RBUTTONDOWN ;单击鼠标右键时产生的消息 -WM_ RBUTTONUP :放开鼠标右键时产生的消息 -WM_ LBUTTONDBLCLK :双击鼠标左键时产生的消息 -WM_ RBUTTONDBLCLK :双击鼠标右键时产生的 -WM_ MOUSEMOVE :鼠标在窗C中移动时产生的 ( 1 )标准Windows消息- -键盘消息 -WM_KEYDOWN :按下一一个非系统键时产生的消息附加信息参数wParam为按下键的虚拟键码虚拟键码用以标识按下或释放的键, IParam记录按键的重复次数、扫描码等状态信息; - WM_KEYUP :弹起一个非系统键时产生的消息 - WM_CHAR :按下一个非系统键时产生的消息加信息参数wParam为按下键的ASCII码IPare的意思同上; ( 1 )标准Windows消息- -窗口消息 - WM_CREATE : CreateWindows函数产生的消息; -WM_CLOSE :关闭窗口时产生的消息; - WM_DESTROY :消除窗口时由DestroyWindows()发出的消息 - WM_QUIT :退出应用程序时由PostQuitMessage()发出的消息 - WM_ PAINT ; Windows系统需重绘时产生的消息。 - WM_ SIZE - WM_MOVE
3.对象与句柄 ●句柄是代表某些资源的一个4字节长的数值用于标识应用程序中不同的对象和同类对象中不同的实例 ●所有的句柄类型以H开头。常见Windows对象的句柄: 4.关于API ●应用程序是如何通知操作系统执行某个功能的呢? -应用程序要完成某个功能是以函数调用的形式实现; -同样,应用程序也是以函数调用的方式来通知操作系统执行相应的功能的。 ●操作系统把它所能够完成的功能以函数的形式提供给应用程序使用,应用程序对这些函数的调用就叫做系统调用。 ●这些函数的集合就是Windows操作系统提供给应用程序编程的接口(Application Programming Interface),简称Windows API。如CreateWindow()函数。 ●API是大量函数加上数字常量、宏、结构、类型以及其它相关项的集合。 ●大多数API函数定义在Windows.h的文件中,也可以从Windows平台软件开发包( SDK )中得到。 ●根据Windows API函数的功能可以将其分为三类 (1)管理函数:实现窗口的创建、移动和修改功能 (2)图形设备函数:实现与设备无关的图形操作功能 (3)系统服务函数:实现与操作系统有关的多种功能
三、Win32程序结构
1、Win32程序结构-WinMain函数
Win32程序示例 例5-1创建一个如图所示的Windows窗口。 本例的目的在于说明创建Windows应用程序的方法、过程及消息的使用。 注意●LRESULT 选择右键/ Go To Definition可查看定义 ●对于CALLBACK表示函数调用方式_stdcall 与_ cdecl是两种不同的函数调用约定,区别在函数参数入栈的顺序,由调用函数还是被调用函数将参数弹出栈以及产生函数修饰名的方法。
1. WinMain函数
功能: (1)注册窗口类建立窗口及执行其他必要的初始化工作。 (2)进入消息循环,根据从消息队列中接收的消息调用相应的处理过程。 (3)当消息循环检索到WM_ QUIT消息时,终止程序拟 WinMain函数有三个基本的组成部分:函数说明、初始化和消息循环。 1) WinMain函数:函数说明
int WINAPI WinMain
( HINSTANCE hThisInst, ||应用程序当前实例句柄
HINSTANCE hPrevInst, ||应用程序其他实例句柄
LPSTR IpszCmdLine, ||指向程序命令行参数的指针
int nCmdShow ||应用程序开始执行时窗口显示方式的整数值标识如最大化显示或最小化显示或隐藏显示
)2)创建一个完整的窗口需要经过下面四个操作步骤: 初始化--窗口类的定义
typedef struct tagWNDCLASS
{
UINT style; //窗口类的样式一般设置为0
WNDPROC *IpfnWndProc; //定义指向窗口函数的指针
int cbClsExtra; //窗口类变量占用的存储空间
int cbWndExtra; //实例变量占用的存储空间
HINSTANCE hInstance; //该类的应用程序的实例句柄
HICON hIcon; //图标调用Loadlcon
HCURSOR hCursor; //光标调用L oadCursor
HBRUSH hbrBackground; //背景刷调用GetStockObject
LPCTSTR lpszMenuName; //窗口类菜单资源名
LPCTSTR IpszClassName; //窗口类名
}WNDCLASS;案例的窗口类定义代码
//窗口类的定义
WNDCL ASS wndclass ; //窗口类对象
wndclass .style0; //窗口类型为缺省类型
wndclass. lpfnWndProcWndProc; //定 义窗口处理函数名
wndclass.cbClsExtra0; //窗口类无扩展
wndclass.cbWndExtra0; //窗口实例无扩展
wndclass. hInstancehInstance; //当前实例句柄
wndclass.hlconL oadlcon(NULL,IDI_APPLICATION); //窗口的最小化图标为缺省图标
wndclass. hCursorL oadCursor(NULL,IDC_ARROW); //窗口采用箭头光标
wndclass. hbrBackground(HBRUSH)GetStockObject(WHITE_BRUSH); //窗口背景为白色
wndclass.IpszMenuNameNULL; //窗口中无菜单
wndclass. IpszClassNamelpszClassName;//窗类名Loadlcon:在应用程序中加载一个窗口图标。 原型:HICON Loadlcon(HINSTANCE hInstance, LPCTSTR IplconName ) 其中第一个参数HINSTANCE hInstance表示图标资源所在的模块句柄,NULL则使用系统预定义图标第二个参数LPCTSTR IplconName表示图标资源名或系统预定义图标标识名 应用程序调用函数GetStockObject获取系统提供的背景刷HBRUSH GetStockObject(int nBrush) 窗口注册代码
//窗口类的注册
if(!RegisterClass( wndclass)) //如果注册失败则发出警告
{ MessageBeep(0);
return FALSE;
}窗口创建
//创建窗口
HWND hwnd;//窗口句柄
hwnd CreateWindow
(IpszClassName, //窗口类名
IpszTitle, //窗口实例的标题名
WS_ OVERLAPPEDWINDOW, //窗口的风格
CW_ USEDEFAULT, //窗口左 上角坐标为缺省值
CW_ USEDEFAULT,
CW USEDEFAULT, //窗口的高和宽为缺省值
CW USEDEFAULT,
NULL, //此窗口无父窗口
NULL, //此窗口 无主菜单
hInstance, //创建此窗口的应用程序的当前句柄
NULL //不使用该值
),
创建一个窗口类的实例由函数CreateWindow()实现
HWND CreateWindow
(LPCTSTR IpszClassName, ||窗口类名
LPCTSTR IpszTitle, || 窗口标题名
DWORD dwStyle, || 创建窗口的样式,如下页表所示
int x,y, ||窗口左上角坐标
int nWidth,nHeight, ||窗口宽度和高度
HWND hwndParent, ||无父窗口则为NULL
HWENU hMenu, ||窗口主菜单句柄
HINSTANCE hInstance, || 创建窗的应用程序当前句柄
LPVOID IpParam ||创建窗口时指定的额外参数
)
常用窗口样式 运用样式方法#define WS_OVERL APPEDWINDOW(WS OVERL APPED | WS_ CAPTION | WS_ SYSMENUIWS THICKFRAME | WS MINIMIZEBOX | WS MAXIMIZEBOX) 显示窗口
//显示窗口
ShowWindow( hwnd, nCmdShow);
//立即发送WM_ PAINT消息来刷新窗口客户区
UpdateWindow(hwnd);消息循环
//消息循环
MSG Msg;//消息
while( GetMessage(Msg,NULL,0,0))
{ TranslateMessage( Msg); //将虚拟键消息转换为字符消息
DispatchMessage( Msg); //调度一个消息给窗口程序。通常调度从GetMessage取得的消息
return Msg.wParam; //消息循环结束即程序终止时将信息返回
}
整合的窗口代码
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINS TANCE hInstance,HINSTANCE
hPrevInst,LPSTR IpszCmdLine,int nCmdShow)
{ WNDCL ASS wndclass ; //窗口类的定义... //为窗口类结构体中的成员赋值
RegisterClass( wndclass));
CreateWindow(...);
ShowWindow( hwnd, nCmdShow);
UpdateWindow(hwnd);
//消息循环
MSG Msg;//消息
while( GetMessage(Msg,NULL,0,0))
{ TranslateMessage( Msg); //将虚拟键消息转换为字符消息
DispatchMessage( Msg); //调度一个消息给窗口程序。通常调度从GetMessage取得的消息
return Msg.wParam; //消息循环结束即程序终止时将信息返回
}
3) WinMain函数:消息循环 函数GetMessage()返回零值,即检索到WM_QUIT消息程序结束循环并退出
GetMessage
( lpMSG, //指向MSG结构的指针 ,
//它包含有从应用程序消息队列中检索到的一条消息数据
hwnd, //指定为哪个窗口检索消息,若为NULL
//则检索调用该函数的应用程序的所有消息
nMsgFilteMin, /指定检索在Min和Max范围内的消息
nMsgFilterMax
//若这两个参数都为零该函数检索所有的可用的消息
)函数TranslateMessage(Msg)将原始键盘消息WM_KEYDOWN和WM_ KEYUP转化为字符(WM_CHAR)消息
函数DispatchMessage(Msg)将消息传送到指定窗口函数
2.窗口函数WndProc WndProc定义了应用程序对接收到的不同消息的响应它包含了对各种可能接收到的消息的处理过程。 ●WndProc函数由一个或多个switch语句组成。 ●每一条case语句对应一种消息当应用程序接收到一个消息时相应的case语句被激活并执行相应的响应程序模块。
LRESULT CALLBACK WndProc( HWND hwnd, UINT
messgae, WPARAM wParam,LPARAM IParam )
{.
..
switch(message) || message为标识的消息
{ case....break;
..case WM_ DESTROY:PostQuitMessage(0); break; default:return
DefWindowProc(hwnd,message,wParam,IParam); //为未定义处理过程的消息提供缺省处理
}
return(0);
} 在消息处理程序段中一般都有对WM_ DESTROY的处理该消息是关闭窗口时发出的。它向应用程序发出WM_ QUIT消息请求退出处理函数: void PostQuitMessage(int nExitCode) //nExitCode为应用程序的退出代码
案例窗口函数
// 窗口(消息)处理函数
LRESULT CALL BACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM IParam)
{HDC hdc; // 设备描述表的句柄switch (message){case WM_PAINT:PAINTSTRUCT ps;hdc BeginPaint(hWnd, ps);TextOut(hdc, 0, 0, 武汉理工大学理学院, strlen(武汉理工大学理学院));EndPaint(hWnd, ps);break;case WM_CHAR:char szChar[20];sprintf(szChar, char %C is %d, wParam, wParam); // 格式输出内容到szCharMessageBox(hWnd, szChar, 显示, 0);break;case WM_LBUTTONDOWN:MessageBox(hWnd, mouse left clicked, 提示, 0);hdc GetDC(hWnd);TextOut(hdc, 0, 50, 物理系电信科, strlen(物理系电信科));ReleaseDC(hWnd, hdc);break;case WM RBUTTONDOWN:MessageBox(hWnd, mouse right clicked, 提示, 0);hdc GetDC(hWnd);TextOut(hdc,0, 100, 物理系光信科 ,strlen(物理系光信科);ReleaseDC(hWnd, hdc);case WM_CLOSE:if(IDYESMessageBox(hWnd, 是否真的结束?, 关闭提示,MB_YESNOCANCEL))DestroyWindow(hWnd);break;case WM_DESTROY:PostQuitMessage(0); //调用PostQuitMessage发出WM_ QUIT消息break;default: //缺省时采用系统消息缺省处理函数return DefWindowProc(hWnd,message,wParam,lParam);}return (0);
}
Windows程序和消息的基本流程