*(需补充内容)
Visual C++ 6.0 特点:
可开发Win32环境下运行的程序。
向导工具:MFC AppWizard(创建窗口基本框的,单或多文档格式等),ClassWizard(管理类,对象,消息,控件等)
支持多线程应用程序开发
MFC Resource:
Accelerator(加速键)
Bitmap(位图)
Cursor(鼠标光标)
Dialog(对话框)
HTML,Icon(图标)
Menu(菜单)
String Table(字符串表)
Toolbar(工具栏)
version(版本信息)
不同的操作系统提供的API函数是不用的
windows操作系统是一种图形化工具,So Visual C++通过拖动就可以实现界面设计。
windows程序设计是一种异步的,基于消息驱动的设计模式。
API函数(接口)是为了能使用windows的各项功能函数而产生。
把API函数封装成类就变成了MFC的一部分内容
一.介绍win32的部分内容:
1.窗口
2.句柄
句柄是一种指向结构体的指针,但这种指针指向windows的对象,是全局唯一的,即绝对唯一性。占4个字节。
HINSTANCE 当前实例句柄 HCURSOR 光标句柄
HWND 窗口句柄 HICON 图标句柄
HDC 设备环境句柄 HMENU 菜单句柄
HPEN 画笔句柄 HBRUSH 画刷句柄
HPONT 字体句柄 HBITMAP 位图句柄
3.消息
windows程序是基于消息驱动的。
不是明确地使用函数来获得输入,而是等待系统输入它们。
系统
typedef struct tagMSG {
HWND hwnd;//窗口句柄
UINT message;//消息标识-unsiged int
WPARAM wParam;
//消息的附加信息-win16系统遗留产物16位整数型变量unsigned int
LPARAM lParam;//消息的附加信息-32位整数变量long
DWORD time;//消息的发出时间-消息送至队列的时间
POINT pt;//消息发出时,光标的位置-POINT类对象
DWORD lPrivate;//...扩展内容
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;
typedef struct tagPOINT{
LONG x;
LONG y;
}POINT
其中x,y表示屏幕光标的横坐标和纵坐标。
消息字符串存放于winuser.h文件中,宏定义消息字符串,实际上就是一堆无符号整数。例如:#define WM_LBUTTONDOWN 0x0201
当鼠标按下左击的时候,就会向窗口发出0x0201给消息标识message赋值,从而让窗口知道你按下了左击,而我们打代码的时候,就用一个别名叫:WM_LBUTTONDOWN的名称代表0x0201=鼠标左击事件。
WM_LBUTTONUP 松开鼠标左键产生的消息
WM_LBUTTONDOWN 按下鼠标左键产生的消息
WM_RBUTTONUP 松开鼠标右键产生的消息
WM_RBUTTONDOWN 按下鼠标右键产生的消息
WM_LBUTTONDBLCLK 双击鼠标左键产生的消息
WM_RBUTTONDBLCLK 双击鼠标右键产生的消息
WM_KEYWORD 选择键盘产生的信息
WM_CREATE 创建窗口时产生的信息
WM_CLOSE 关闭窗口时产生的信息
WM_DESTORY 销毁窗口产生的消息
WM_PAINT 重画窗口产生的消息
4.基于消息驱动的程序设计
顺序特性 从上至下执行
同步特性 前语句执行完才可执行下面语句
但!Win32和MFC都不属于这2种驱动方式。
消息映像模式 类似于C语言的switch-case模式。即对号入座方式执行。
我们把每个消息函数看成进程,进程是由程序,数据,PCB组成的,PCB是一个记录该进程数据的,目的是为了防止数据丢失和协调进程之间的协调处理,好吧这个我其实才刚开始学习,多进程处理在日后我会进一步学习。
消息队列:
... ...[消息1]->[消息2]->[消息3]->... ...
先来先服务原则,为空的话系统就会等待,如果在处理某个消息的时候,出现某时间无法满足会进入阻塞队列,下一个消息就还可以继续处理,往往有些消息之间是有联系的,这个跟操作系统的进程其实貌似可能差不多,有个同步协议规则去管理好这些消息,而保证不发生各种因执行循序混乱而产生的错误。现在没接触到Win32多进程处理,好吧!写到这里我突然发现是多线程处理!
线程,我老师说是进程中的那么一部分,我大概把进程理解为一个函数,嵌套另外一个函数,而执行到另外一个函数后,如果它也有嵌套函数,继续进行,这算什么呢?有待思考这些嵌套函数是不是[线程]。
2017/9/24
一.窗口初始化(WinMain相当于main() )
介绍WinMain的成员:
int WINAPI WinMain(
HINSTANCE hInstance, //应用程序当前实例句柄
HINSTANCE hPrevInstance ,//当前实例的前一个实例的句柄(在win32系统没用)
LPSTR lpCmdLine, //程序执行时命令行参数
int nShowCmd; //程序的窗口应该如何显示
)
hInstance 只有当程序在Windows下运行时,它才有相应的值。
一个程序可运行多个实例,每运行一个实例,系统都会给该实例分配一个句柄值,并通过hInstance参数传递给WinMain函数。
WinMain函数如下:
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{... ...}
这样窗口才可以通过句柄去根据你的发出信息和响应消息去改变具体实例。
hPrevInstance在Win32系统没有用
lpCmdLine 其作用与main函数的参数char *argv[]相同 指向字符串的32位指针,就是存放某个命令行的各种参数.
LPSTR常用,其他还有LPTSTR,LPCTSTR,LPCSTR分别是指向字符串的32位指针(用于Unicode),指向字符串常量的32位指针(用于Unicode),指向字符串常量的32位指针。
nCmdShow指定窗口初始显示方式,最大化,最小化,正常,隐藏等。
[1].窗口类成员说明
typedef struct tagWNDCLASSA {
UINT style; //窗口风格,默认为0
WNDPROC lpfnWndProc;//指向窗口过程
int cbClsExtra;//指定紧随在窗口类后分配的字节数
int cbWndExtra;//指定紧随在窗口实例之后分配的字节数
HINSTANCE hInstance; //标识了窗口类当前实例的句柄
HICON hIcon; //图标句柄
HCURSOR hCursor; //光标句柄
HBRUSH hbrBackground;//画笔句柄
LPCSTR lpszMenuName;//窗口菜单名
LPCSTR lpszClassName;//窗口类名
} WNDCLASSA, *PWNDCLASSA, NEAR *NPWNDCLASSA, FAR *LPWNDCLASSA;
[2].初始化并且注册窗口(注册后才可使用)
具体例子参照最下面链接
RegisterClassW(
CONST WNDCLASSW *lpWndClass);
[3].创建窗口(之前要有一个WNDCLASS的变量,即窗口类变量)
HWND CreateWindowA(lpClassName, lpWindowName, dwStyle, x, y,\
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\
lpClassName 窗口类名(可以是各种窗口类名,如:对话框,按钮,静态框等)(补充:这名字用于在创建窗口的时候,实际上是自定义的char[])
lpWindowName 窗口标题名(显示在标题栏,自定义的char[])
dwStyle 创建窗口风格
x,y 窗口左上角坐标
nWidth,nHeight 窗口右下角坐标(宽度和高度)
hWndParent 窗口所属父窗口的句柄
hMenu 窗口的主菜单句柄
hInstance 应用程序当前实例的句柄
IpParam 应用程序的参数
*dyStyle 创建窗口风格 这个与显示窗口风格不同哦
窗口风格标识
WS_BORRED 创建一个单边框的窗口
WS_CAPTION 创建一个有标题框的窗口(包含WS_BORDER风格)
WS_CHILD 创建一个子窗口,这个风格不能与WS_POPUP风格合用
WS_HSCROLL 创建一个有水平滚动条的窗口
WS_MAXIMIZE 创建一个具有最大化按钮的窗口
WS_OVERLAPPED 创建一个具有层叠的窗口
WS_POPUP 创建一个具有弹出式的窗口
WS_SIZEBOX 创建一个具有可调边框的窗口
WS_VISIBLE 创建一个初始状态为可见的窗口
WS_VSCROLL 创建一个具有垂直滚动条的窗口
hMenu菜单句柄 LoadMenu函数用于加在一个菜单,如果没有菜单设置为NULL,LoadMenu函数代码如下:
HMENU LoadMenu(
HINSTANCE hInstance,//当前程序实例句柄
LPCSTR lpMenuName);//资源菜单名
**IpParam指向一个值的指针,该值为窗口WM_CREATE消息的一个参数
当系统调用此函数时就会向窗口发出WM_CREATE消息。*
IpParam我认为是创建窗口时会相应消息队列中的WM_CREATE消息的一个命令行参数,一般来说是默认为NULL,至于怎么将利用这个参数目前不太清楚!
[4].显示窗口
通过ShowWindow(HWND,显示风格)和UpdateWindow(HWND)函数显示
窗口风格标识 | 窗口风格
SW_HIDE 隐藏窗口并激活其他窗口
SW_SHOWMAXIMIZED 激活窗口并将其最大化
SW_SHOWMINIMIZED 激活窗口并将其最小化
SW_SHOW 在窗口原来的位置以原来的尺寸激活和显示窗口
SW_SHOWNA 以窗口原来的状态显示窗口
SW_SHOWNORMAL 激活并显示一个窗口
【5】消息循环
//Main message loop
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) //GetMessage是获取消息队列的消息存放入msg消息结构体内,NULL表示接受任何调用线程的消息.0,0表示接受信息最小值和信息最大值.
{
{
TranslateMessage(&msg);//翻译消息:虚拟键消息(msg)转换为字符消息,送回消息队列等待下一次处理(一般是这样)但是!
DispatchMessage(&msg);//分派消息:把这个已转化为字符的msg消息,给窗口程序并且窗口程序会作相应处理.
}
}
WndProc函数是消息映射函数,又称回调函数.
DefWindowProc函数调用默认的窗口过程来为应用程序没有处理的任何窗口消息提供默认的处理。(确保每一个消息得到处理)
LRESULT 一个整数 CALLBACK回调 由操作系统调用
WndProc的成员:
hWnd表示处理消息作用于hWnd指向的窗口
message 表示字符串消息标识
wParam 命令行参数 -又为消息附带参数
lParam 命令行参数 -又为消息附带参数
Win32的Hello!World模板代码内有部分注释用具体代码理解:
http://blog.csdn.net/qq_39574690/article/details/78079123