精华内容
下载资源
问答
  • 窗口于消息 前面的例子都使用MessageBox来创建窗口 ,单他...另外还有一种类型窗口是对话框,这种窗口可以不带标题栏 还可能包含,按钮,单选按钮,复选框,列表框,滚动条,文本框等。每一个这些对象都被称为

    第三章 窗口于消息

    前面的例子都使用MessageBox来创建窗口 ,单他所创建的窗口灵活性有限。

    3.1 窗口的创建

    只要调用CreateWindow函数即可

    3.1.1 系统结构概述

    一个应用程序窗口可能包含,标题栏,菜单栏,工具栏,滚动条。另外还有一种类型的窗口是对话框,这种窗口可以不带标题栏

    还可能包含,按钮,单选按钮,复选框,列表框,滚动条,文本框等。每一个这些对象都被称为 子窗口,或者 控件窗口


    当用户改变窗口尺寸时,Windows便向应用程序发送一条携带新窗口尺寸相关的信息,接着应用程序对自身内容进行调整以反映出窗口尺寸的变化。


    “Windows向应用程序发送了一条消息”,windows调用了该程序内部的一个函数---这个函数是由你所写,而且是整个程序的核心。此函数的参数描述了由windows

    所发送的由你的程序所接受的特定消息。这个函数被称为“窗口过程”。 windows会调用应用程序的这个函数,这种思路正式windows体系结构的基础。


    应用程序所创建的每一个窗口都有一个与之对应的窗口过程。可以是应用程序中的某一个函数也可以是DLL库中的函数。窗口过程依据这些消息做相应的处理,然后将控制权返回给windows


    更准确的说,窗口总是依赖窗口类来创建。窗口类标示了用于处理传递给窗口的消息的窗口过程。多个窗口可以共享一个窗口类,使用相同的窗口过程。


    当windows程序创建以后,windows首先为该程序创建一个消息队列。该消息队列中存放着应用程序可能创建的所有窗口的消息。windows应用程序中通常都包含一小段消息循环的代码,该代码用于从消息队列中检索信息,并将其分发给窗口过程。


    窗口, 窗口类,窗口过程,消息队列,消息循环以及窗口消息整合到实际应用中的一个例子

    3.1.2 

    需要在工程中加载 Winmm.lib  使用PlaySound API函数, 在VS2015中禁用

    #include <windows.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //window procedure.
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    	PSTR szCmdLine, int iCmdShow)
    {
    	static		TCHAR szAppName[] = TEXT("HelloWin");
    	HWND		hwnd;
    	MSG			msg;
    	WNDCLASS	wndClass;		//The window Class
    
    	wndClass.style			= CS_HREDRAW | CS_VREDRAW;
    	wndClass.lpfnWndProc	= WndProc;// assign the window procedure to windows class.
    	wndClass.cbClsExtra		= 0;
    	wndClass.cbWndExtra		= 0;
    	wndClass.hInstance		= hInstance;
    	wndClass.hIcon			= LoadIcon(NULL, IDI_APPLICATION);
    	wndClass.hCursor		= LoadCursor(NULL, IDC_ARROW);
    	wndClass.hbrBackground	= (HBRUSH) GetStockObject(WHITE_BRUSH);
    	wndClass.lpszMenuName	= NULL;
    	wndClass.lpszClassName	= szAppName;
    
    	//Register the Window Class to the Windows System. 
    	if (!RegisterClass(&wndClass)) 
    	{
    		MessageBox(NULL, TEXT("This program require Windows NT!"),
    			szAppName, MB_ICONERROR);
    		return 0;
    	}
    
    	//This function will generate an WM_CREATE message.
    	hwnd = CreateWindow(szAppName,		//Window class name
    		TEXT("The Hello Program"),		//Window caption
    		WS_OVERLAPPEDWINDOW,			//Window Style
    		CW_USEDEFAULT,					//initial x position
    		CW_USEDEFAULT,					//initial y position
    		CW_USEDEFAULT,					//initial x size
    		CW_USEDEFAULT,					//initial y size
    		NULL,							//parent window handle
    		NULL,							//window menu handle
    		hInstance,						//program instance handle
    		NULL);							//creation parameters
    
    	ShowWindow(hwnd, iCmdShow);
    	UpdateWindow(hwnd);	//This function will generate a WM_PAINT message.
    
    	/* The message loop for this program.
    	if received the WM_QUIT message, the function will return 0.*/
    	while (GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    	return msg.wParam;
    
    }
    
    //define the Window Procedure WndProc
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	HDC			hdc;
    	PAINTSTRUCT	ps;
    	RECT		rect;
    
    	switch (message) //get the message
    	{
    	case WM_CREATE:
    		PlaySound(TEXT("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC);
    		return 0;
    	case WM_PAINT:
    		hdc = BeginPaint(hwnd, &ps);
    
    		GetClientRect(hwnd, &rect);
    
    		DrawText(hdc, TEXT("Hello, Windows 7 x64 Ultimate Sercice Pack 1!"), -1, &rect,
    			DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    		EndPaint(hwnd, &ps);
    		return 0;
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		return 0;
    	}
    	return  DefWindowProc(hwnd, message, wParam, lParam);
    }


    3.1.3 通盘考虑

    实际上任何windows程序的结构都与Hellowin.cpp类似。不需要记住这个框架的所有细节

    该程序包括一个WinMain函数(程序入口) WndProc函数(窗口过程Wind Prock)在hellowin.cpp中并未有任何调用WinProc的代码,但是在WinMain中有一个对WinProc的引用。


    Windows函数调用

    LoadIcon 加载图标,以供程序使用

    LoadCursor 加载光标,以供程序使用

    GetStockObject 获取一个图形对象

    RegisterClass 为应用程序的窗口注册一个窗口类

    MessageBox 显示消息框

    CreateWindow 基于窗口类创建一个窗口

    ShowWindow 在屏幕中显示窗口

    UpdateWindow 指示窗口对其自身进行重绘

    GetMessage 从消息队列获取消息

    TranslateMessage 翻译一些键盘消息

    DispatchMessage 将消息发送给窗口过程(WndProc)

    PlaySound  播放声音文件

    BeginPaint  表明窗口绘制开始

    GetClientRect 获取窗口客户区尺寸

    DrawText 显示一个文本字符串

    EndPaint 结束窗口绘制

    PostQuitMessage 将退出消息插入消息队列

    DefWindowProc 执行默认的消息处理

    一些常用Wnidow定义的下标


    新数据类型

    很多事为了兼容不同windows版本定义的一些typedef 或者#define

    UINT unsigned int

    WPARAM UINT_PTR

     LPARAM LONG_PTR

    LRESULT LONG


    HELLOWIN使用了4种数据结构

    MSG 消息结构

    WNDCLASS  窗口类结构

    PAINTSTRUCT 绘制结构

    RECT 矩形结构

    句柄

    HINSTANCE 实力句柄-程序本身

    HWND 窗口句柄

    HDC 设备环境句柄

    匈牙利标记法

    为了纪念微软程序员Charles Simonyi  变量名以表明该变量数据类型的小写字母开始再加上相应的名字

    3.1.4 窗口类注册

    窗口总是基于窗口类创建,窗口类决定了处理消息的窗口过程(WndProc)

    ASCII 版本


    typedef struct tagWNDCLASSA {
        UINT        style;
        WNDPROC     lpfnWndProc;
        int         cbClsExtra;
        int         cbWndExtra;
        HINSTANCE   hInstance;
        HICON       hIcon;
        HCURSOR     hCursor;
        HBRUSH      hbrBackground;
        LPCSTR      lpszMenuName;
        LPCSTR      lpszClassName;
    } WNDCLASSA, *PWNDCLASSA, NEAR *NPWNDCLASSA, FAR *LPWNDCLASSA;


    使用WNDCLASS 创建一个wndClass的类并初始化个成员,然后调用RegisterClass函数注册

    最重要的是 lpfnWndProc (窗口过程的地址)和 lpszClassName(窗口类的名称,通常与主窗口相同)


    wndClass.style = CS_HREDRAW | CS_VREDRAW;

    指定了无论何时窗口的水平尺寸(CS_HREDRAW)或垂直尺寸(CS_VREDRAW)被改变,所有基于该窗口类的窗口都要被重画


    wndClass.lpfnWndProc  = WndProc;

    将窗口类的过程设定为WndProc函数


    wndClass.cbClsExtra= 0;
    wndClass.cbWndExtra= 0;

    在类结构和Windows内部维护的窗口结构中预留一些额外的空间,该案例没使用到这些功能因此设为0


    wndClass.hInstance = hInstance;

    应用程序的实例句柄

    wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

    为基于该窗口类的窗口设定一个图标

    wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);

    为基于该窗口类的窗口设定一个鼠标指针

    wndClass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);

    为窗口类的客户区设定背景颜色, hbr表示一个画刷的句柄,该例子设定为白色。

    wndClass.lpszMenuName = NULL;

    不带菜单栏

    wndClass.lpszClassName = szAppName;

    窗口类的名称


    GetLastError 可以获取RegisterClass返回错误的原因,各种api文档中有说明是否可以使用GetLastError来获取错误信息。

    一些程序员喜欢检查每个函数调用的返回值判断是否有错误发生,这是有意义的。

    hPrevInstance 表明有没有旧实例在内存中运行。


    3.1.5 窗口创建

    窗口类只定义了窗口的一般特征,使用CreateWindow来创建窗口时候

    hwnd = CreateWindow(szAppName,//Window class name
    TEXT("The Hello Program"),//Window caption
    WS_OVERLAPPEDWINDOW,//Window Style
    CW_USEDEFAULT,//initial x position
    CW_USEDEFAULT,//initial y position
    CW_USEDEFAULT,//initial x size
    CW_USEDEFAULT,//initial y size
    NULL, //parent window handle
    NULL, //window menu handle
    hInstance, //program instance handle
    NULL); //creation parameters



    szAppName 刚才注册的窗口类,通过窗口类名与刚才注册的窗口类建立连接

    当新建窗口为顶级窗口,父句柄参数就应该设置为NULL

    CreateWindow返回创建窗口的句柄 HWND(handle to Window)

    3.1.6 窗口的显示

    当CreateWindow调用返回时,窗口已经在Windows内部创建(分配内存),但是还需要调用ShowWindow(hwnd, iCmdShow) 来显示窗口

    iCmdShow   SW_SHOWNORMAL 正常显示  SW_SHOWMAXIMIZED 最大化  SW_SHOWMINNOACTIVE 最小化到任务栏

    UpdateWindow(hwnd); 使窗口的客户区重绘 像WndProc函数发送一条WM_PAINT消息


    3.1.7消息循环

    在UpdateWindow之后新建窗口在屏幕中完全可见了,此时程序必须能够接受各种来自用户的键盘输入和鼠标输入等操作。Windows为当前在其运行的每一个Windows程序都维护了一个消息队列,当输入事件发生后,windows会自动将这些事件转换为“消息”。


    while (GetMessage(&msg, NULL, 0, 0))
    {
    	TranslateMessage(&msg);
    	DispatchMessage(&msg);
    }
    


    消息循环

    typedef struct tagMSG {
        HWND        hwnd; //消息所指向窗口的句柄
        UINT        message; //消息标识符
        WPARAM      wParam; //32bit 消息参数,取决于具体消息
        LPARAM      lParam; //另一个32bit消息参数,同样取决于具体消息
        DWORD       time; //消息进入消息队列的时间
        POINT       pt; //消息进入消息队列时鼠标指针的位置坐标
    #ifdef _MAC
        DWORD       lPrivate;
    #endif
    } MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;


    如果消息队列中捕获的消息非WM_QUIT ,  GetMessage返回值非0,否则返回0

    TranslateMessage(&msg) 将消息还给windows进行某些键盘消息的转换,如果应用程序不支持键盘输入可以去掉此函数。

    DispatchMessage(&msg)将消息再次返回给Windows,接下来Windows会把这条消息发给合适的窗口来处理。这里是WndProc


    3.1.8 窗口过程

    注册窗口类,创建窗口,在屏幕中显示窗口,程序进入消息循环,从消息队列中检索消息。

    真正有意义的事情发生在窗口过程中。

    一个windows程序可以包含多个窗口过程,单一个窗口过程总是与一个通过RegisterClass注册的特定窗口类相关联。

    CreateWindow创建基于特定窗口类的窗口,一个窗口类可以创建多个窗口


    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

    hwnd 接收消息的窗口句柄


    message 消息类型

    wParam, lParam 扩展消息

    如果需要调用窗口函数可以使用SendMessage函数

    3.1.9消息处理

    使用switch-case结构,处理完返回0, 窗口过程不处理的消息需要传递给DefWindowProc处理并返回值返回给当前窗口过程

    用DefWindowProc处理消息非常重要,否则应用程序的其他正常功能都无法进行


    3.1.10 声音文件播放

    调用CreateWindow函数以后,windows完成必要的操作以后,Windows对WndProc进行调用,将其第一参数设为当前窗口句柄,第二参数设为WM_CREATE,

    接着WndProc对WM_CREATE消息进行处理,并将控制权返回给Windows。然后Windows从CreateWindow调用返回到HELLOWin中

    通常WM_CREATE中对窗口进行一次性初始化,该例子播放wav文件调用PlaySound函数


    3.1.11 WM_PAINT消息

    当客户区域部分或全部无效必须更新时,应用程序将得到此通知,也就意味着窗口需要被重绘。

    第一条WM_PAINT消息是WinMain中的UpdateWindow发送的。

    改变窗口尺寸,或者最小化回复以后都会重绘客户区域。或者窗口覆盖

    对WM_PAINT消息处理几乎总是以调用BegnPaint函数开始

    hdc = BeginPaint(hwnd, &ps);


    GetClientRect(hwnd, &rect);//获得客户区域的RECT


    DrawText(hdc, TEXT("Hello, Windows 7 x64 Ultimate Sercice Pack 1!"), -1, &rect,
    DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    EndPaint(hwnd, &ps);


    设备环境指物理输出设备以及其设备驱动程序

    EndPaint 释放设备环境句柄,使其无效。

    DrawText 绘制文本,尽管DrawText看起来类似GDI函数,但是他属于相当高层的模块

     最后一个参数设置了绘制文本的一些排版参数


    3.1.12 WM_DESTROY消息

    表明Windows正处在依照用户命令的销毁窗口的过程中

    标准响应方法是 调用 PostQuitMessage(0); 会将一个WM_QUIT插入消息队列,然后GetMessage 接收到WM_QUIT消息返回0 ,退出消息循环。然后程序返回

    return msg.wParam;


    3.2 windows编程中的若干难点

    虽然进行了注册窗口类,创建窗口,显示窗口,更新窗口,消息循环。但是真正有意义的处理都在窗口过程中

    3.2.1 究竟谁调用谁

    windows程序中,操作系统可以调用用户的函数WndProc

    WndProc在类似的场景下被调用,新建窗口时,窗口被销毁时,窗口尺寸发送变化或者被移动最小化等,用户用鼠标在窗口中执行单击或者双击操作时。用键盘输入文字时,用户从菜单选取某个选项时,客户区需要重绘时等等。

    所有对WndProc的调用都是通过消息形式出现。然后WndProc处理相应的消息或者交给DefWindowsProc处理

    3.2.1 队列消息和非队列消息

    队列消息是指由Windows放入程序的消息队列中的消息然后被程序的消息循环检索并调用窗口函数 Post 线程异步

    非队列消息是由对窗口函数直接调用产生的。Send 线程同步

    无论是否是队列窗口过程都会处理,窗口过程实际是窗口的“消息中心”

    队列消息主要由用户输入产生,主要是按键,鼠标等操作,还有定时器消息,重绘消息,退出消息等。

    非队列消息由特定的windows函数引起如CreateWindow(WM_CREATE), ShowWindow(WM_SIZE, WM_SHOWWINDOW), UpdateWindow(WM_PAINT)

    每个线程的消息队列仅为那些窗口过程在该线程内执行的窗口进行消息处理。消息队列和窗口过程不是并发的,等窗口过程返回以后DispatchMessage函数才会返回。

    窗口过程可以调用为其发送其他消息的函数。窗口过程是可重入的


    展开全文
  • 窗口类有三种: **系统窗口类**中一部分是系统内部使用的,而另一部分是可以供系统所有进程使用的,这些窗口类就是基本的控件窗口类。 应用程序全局窗口类,就是注册窗口类是以CS_GLOBALCLASS标志注册的窗口类,这...

    在这里插入图片描述

    窗口类

    窗口类WNDCLASS是Windows中用于创建窗口的模板。每一个窗口类都有一个窗口过程(WndProc),负责处理发送该类窗口的所有消息。一个应用程序在创建某个类型的窗口前,必须首先注册“窗口类”(注意,这里不是C++类的类)。窗口类有三种:

    • **系统窗口类**中一部分是系统内部使用的,而另一部分是可以供系统所有进程使用的,这些窗口类就是基本的控件窗口类。
    • 应用程序全局窗口类,就是注册窗口类是以CS_GLOBALCLASS标志注册的窗口类,这个窗口类在这个进程中,所有模块都可以使用。模块一般是dll模块。我们知道的程序的皮肤库,很多都是以这种形式实现的,dll中注册的应用程序全局窗口类,我们程序就可以直接使用这些漂亮的皮肤库提供的控件了。
    • **应用程序局部窗口类**则是没有CS_GLOBALCLASS标志注册的窗口类,这个窗口类只在模块范围内使用。我们的EXE如果加载了其他的dll模块,此时EXE的主线程注册的应用程序局部窗口类对于dll来说,是看不见的,也就不能使用这个局部窗口类来创建窗口。
      WNDCLASS结构体包含一个窗口类的全部信息,定义一个窗口类确定窗口的属性:
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lMaIL7DQ-1611733261690)(C:\Users\xiong\AppData\Roaming\Typora\typora-user-images\image-20210126145303609.png)]
      在这里插入图片描述

    注册窗口类

    使用RegisterClass函数注册一个窗口类。
    在这里插入图片描述
    在这里插入图片描述

    创建窗口

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    显示窗口

    在这里插入图片描述

    更新窗口

    在这里插入图片描述

    窗口过程WNDPROC

    在这里插入图片描述

    默认窗口函数

    在这里插入图片描述

    自定义窗口过程函数

    在这里插入图片描述

    消息循环

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    课程代码

    在这里插入图片描述
    我的第一个窗口程序开发:

    #include<Windows.h>
    
    // 自定义的窗口过程
    LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT Msg,
    	WPARAM wParam, LPARAM lParam){
    	switch(Msg){
    	case WM_DESTROY:
    		// 发送退出消息
    		PostQuitMessage(0);
    		return 0;
    	default:
    		return DefWindowProc(hWnd, Msg, wParam, lParam);
    	}
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    	LPSTR lpCmdLine, int nShowCmd){
    		// 1.注册窗口类
    		WNDCLASSW wnd;
    		wnd.cbClsExtra = 0;
    		wnd.cbWndExtra = 0;
    
    		// 背景画刷
    		wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));
    		// 光标
    		wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
    		// 图标
    		wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    		// 默认窗口过程函数,用于处理消息
    		//wnd.lpfnWndProc = DefWindowProc;
    		// 使用自定义窗口过程函数处理消息
    		wnd.lpfnWndProc = MyWindowProc;
    		// 窗口类名
    		wnd.lpszClassName = L"MrHuang";
    		// 菜单资源名称
    		wnd.lpszMenuName = NULL;
    		// 窗口类样式
    		wnd.style = CS_HREDRAW;
    		// 实例句柄
    		wnd.hInstance = hInstance;
    		RegisterClass(&wnd);
    
    		// 创建窗口(返回之前发送WM_CREATE的消息)
    		HWND hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",
    			WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL);
    
    		// 显示窗口
    		ShowWindow(hWnd, nShowCmd);
    
    		// 更新窗口(发送WM_PAINT)
    		UpdateWindow(hWnd);
    
    		// 消息循环
    		MSG msg;
    		while(GetMessage(&msg, NULL, 0, 0)){
    			TranslateMessage(&msg); // 翻译消息
    			DispatchMessage(&msg); // 分发消息
    		}
    }
    
    

    结果:
    在这里插入图片描述

    展开全文
  • 今天和大家介绍一下如何使用VMmare安装一个Windows 2003 Enterprise Edition操作系统 首先小编先下载了一个VMmare 10虚拟软件,将其安装在自己的电脑上。 然后打开VMmare软件,在窗口的菜单栏里点击“文件”-->...

    今天和大家介绍一下如何使用VMmare安装一个Windows 2003 Enterprise Edition操作系统

    首先小编先下载了一个VMmare 10虚拟软件,将其安装在自己的电脑上。

    然后打开VMmare软件,在窗口的菜单栏里点击“文件”-->“新建虚拟机”

     

     

    这边让我们选择安装的类型,小编选择了“自定义”,新手可以选择“典型”,点击“下一步”按钮

     

     

    选择虚拟机硬件兼容性,这里我们安装的是VMmare 10,所以小编选择了“Workstation 10.0”,点击“下一步”按钮

     

     

    为了简易安装,我们选择浏览在我们的电脑上找到Windows 2003 Enterprise Edition的映像文件,点击“下一步”按钮

     

     

    这边让我们输入Windows产品密钥(密钥上网搜一下即可),再设置虚拟机的用户密码(123456,可任意),点击“下一步”按钮

     

     

    编写虚拟机的名称,选择虚拟机存放的位置,点击“下一步”按钮

     

     

    配置虚拟机的处理器参数(不要超过宿主机的配置即可),点击“下一步”按钮

     

     

    配置虚拟机的内存(同样不要超过宿主机的配置),点击“下一步”按钮

     

     

    选择网络类型,小便选择了桥接网络模式(便于与外界互相通信),也可以选择使用NAT模式或者仅主机模式网络,然后点击“下一步”按钮

     

     

    选择I/O控制器类型(默认)点击“下一步”按钮

     

     

    选择“创建的磁盘类型”(默认)点击“下一步”按钮

     

     

    选择哪个磁盘(选择“新建创建虚拟磁盘”),点击“下一步”按钮

     

     

    选择磁盘大小(不要超过宿主机的磁盘大小即可),点击“下一步”按钮

     

     

    选择磁盘文件存储位置(根据自己的喜好,但是最好不要装在C盘下),点击“下一步”按钮

     

     

    已经创好了虚拟机,如果还需要更改硬件配置的话,可以点击“自定义硬件”进行配置哦

     

     

    具体的硬件配置框,里面很重要的两个硬件:CD/DVD和网络适配器,安装完后具体讲

     

     

    修改好硬件配置后,点击“完成”按钮

     

     

    根据Windows系统的提示进行操作

     

     

     

     

    这边会提示你输入姓名及单位(正式or任意填写即可,没有什么影响)点击“下一步”按钮

     

    显示Windows正在启动

     

    显示正在设置个人配置

     

     

    Windows自动弹出VMmare Tools软件安装(VMmare Tools主要用来共享虚拟机和宿主机的文件)

     

     

     

    输入之前设置的密码(123456)登入Window

    刚装好的系统里面桌面没有“我的电脑”等图标,为了方便使用,我们手动添加这些图标

    右击桌面-->“属性”--“桌面”-->“自定义桌面”,添加你常用的服务

     

     

     

     

    接下来给大家介绍一下虚拟机和宿主机之间的文件共享方法

    1、如果在安装完Windows 2003操作系统后没有自动安装VMmare Tools,我们可以点击VMmare软件菜单栏“虚拟机”-->“安装VMmare Tools”(这个工具可以实现虚拟机与宿主机之间的文件共享)

    注:如果安装完VMware Tools后还是不可以实现虚拟机与宿主机之间的文件共享,可以选择重新安装VMware Tools

     

    2、还可以在“虚拟机”-->“设置”-->“选项”-->“共享文件夹”-->“总是启用”-->“在Windows客户机中映射为网络驱动器”-->“添加”文件夹

     

     

     

     

    点击“下一步”按钮

     

     

    点击“浏览”选择我们宿主机里要共享给虚拟机的文件,小编以共享桌面为例

     

     

    勾选“启用次共享”,点击“完成”按钮

     

     

    打开我的电脑,进入vmware-host 网络驱动器

     

     

     

    可以看到宿主机里的桌面已经被我们共享到虚拟机上了

     

     

    虚拟机连接网络的三种模式:

    1、桥接模式(Bridged)

    2、网络地址转换模式(NAT)

    3、主机模式(Host-only)

     

    我们家庭网络拓扑结构一般有两种:

    1、主机通过拨号直接连接Internet

    2、主机处于局域网中、通过路由拨号连接Internet

    当我们的宿主机(安装虚拟机的电脑)属于第一种网络环境时,由于是ISP(信息服务提供商)分配给你的公网IP,则不能使用桥接模式化,因为桥接模式需要你拥有属于你机器相同网段内的另一个IP地址。这种情况下可以使用NAT或Host-only。

    而当我们的宿主机属于第二种网络环境,则三种模式可以任意调用。

     

    一、桥接模式

    桥接模式是三种模式中最简单的一种,VMware安装的时候默认就使用这种配置方式。在这种模式下,虚拟机相当于局域网中的一台独立机器,和主机处于同一个网段,公用同一个网关。桥接模式使用的是虚拟机的VMnet0网卡,一般情况下,在虚拟机中将网络设置成自动获取IP就能直接联网。示意图如下:

    在桥接模式下,虚拟机和主机可以互相ping通,虚拟机可以访问Internet,虚拟机上的服务也可以通过虚拟机IP地址在本机直接访问,如果有任何问题,可以按下面的步骤检查各个配置:

    1、检查本地连接的属性里,是否勾选了VMware Bridge Protocol,如果没勾选上,则虚拟机和本机不能互相ping通,如下图:

    2、检查虚拟机的IP地址,看是否和本机处于同一个网段内,如果不是,可以手工设置下IP地址,网关和DNS服务器配置可以参考本机,和本机一样即可。

    3、检查本机防火墙和虚拟机防火墙。如果防火墙是开启的,手动关闭。

     

    二、NAT模式

    上面也说了,如果你不在局域网内,只有一个IP,那么NAT模式正适合你。当然如果你在局域网内,NAT模式也未尝不可,不过使用NAT模式后,主机就变成了双网卡:本身的网卡连接Internet或连接拨号的路由器,另一个虚拟网卡VMnet8连接由虚拟机组成的一个虚拟网络。从外部网络来看,无法直接访问这个虚拟网络。虚拟网络则通过本机上的NAT虚拟服务器进行转发访问Internet。示意图如下:

    NAT模式是让虚拟机实现访问Internet最快的方式,几乎不用任何配置,只要主机能上网,那么虚拟机也就肯定能上网。如果有任何问题,可以通过下面的步骤进行排查:

    1、检查主机上VMware的NAT服务和DHCP服务是否开启,如下图:

    2、检查虚拟机的IP地址,是否和虚拟机NAT配置的Subnet Address在同一个网段内,选择Edit -> Virtual Network Editor可以看到NAT的配置信息

    3、检查主机和虚拟机的防火墙设置 默认情况下,NAT配置好之后,主机和虚拟机之间应该可以互相访问,虚拟机也可以借助主机上的NAT访问Internet,但是外部网络无法访问虚拟机上的服务。

     

    三、Host-only模式

    Host-only模式和NAT一样,也相当于主机双网卡,网络拓扑和NAT也是一样,只是主机不提供NAT功能了,所以虚拟网络只能和主机访问,不能访问Internet。如果需要一个完全隔离的网络环境,则Host-only最合适不过。Host-only相当于使用双绞线直接连接虚拟机和主机,这是最原始的网络结构,当然也是最灵活的。这种情况下虚拟机就不能访问Internet了吗?局域网下的其他机器就不能访问虚拟机上的服务了吗?当然不是。如果我们自己在主机上搭建起我们自己的NAT服务和DHCP服务,那么Host-only其实和NAT是一样的。从下面的示意图也可以看出,Host-only和NAT的唯一区别就在于,主机上少了NAT这个部分。

    类似于NAT,具体的配置这里略过。下面通过Windows上的ICS服务(Internet Connection Sharing,Internet连接共享)来实现Host-only模式的虚拟机访问Internet。ICS是Windows上的一种共享网络访问的服务,类似于mini版NAT,提供了NAT地址转换和DHCP的功能,但不支持端口转发(Port Forwarding)。 首先在网络连接里找到当前正在使用的连接,选择属性 -> 共享,选中“允许其他网络用户通过此计算机的Internet连接来连接”,然后在网络连接下拉框中选择Host-only对应的虚拟网卡(这里是VMnet1),如下图:

    在确定的时候,可能会弹出对话框提示错误:“Internet连接共享访问被启用时,出现了一个错误(null)”,这时去服务中找到Windows Firewall,启动即可。 ICS配置好之后,Host-only就和NAT一样了,在虚拟机中设置自动获取IP或手工设置IP,保证和VMnet1处于同一个网段内,如果一切顺利,就可以在虚拟机中访问Internet了。

    转载于:https://www.cnblogs.com/Ceslie-zhang/p/8511248.html

    展开全文
  • windows消息类型

    千次阅读 2011-05-13 22:53:00
    <br />MFC 消息类型:三种     1、命令消息(WM_COMMAND)  所有派生自 CCmdTarget 的类都有资格接受WM_COMMAND。  <br />2、Window消息(WM_xxx)  所有派生自 CWnd 的类都有...

    MFC 消息类型:三种
      
     
    1、命令消息(WM_COMMAND)  
    所有派生自 CCmdTarget 的类都有资格接受WM_COMMAND。  

    2、Window消息(WM_xxx)  
    所有派生自 CWnd 的类都有资格接受 WM_xxx。  

    3、控件消息(WM_NOTIFY)  
    控件向其父窗口通知消息。  

    消息处理:


    1、WM_xxx 消息处理  
    窗口类(自身)处理→基类处理→CWnd∷DefWindowProc()处理;  
    其所对应的宏一般为在消息 WM_ 前面加上 ON_。  

    2、命令消息处理  
    命令消息来自命令用户界面对象(菜单加速键或工具栏按钮)发出的WM_COMMAND消息;  
    ㈠、WM_COMMAND消息  
    其所包含的类型和对应的宏如下:  
    ①、ON_COMMAND(ID,pfn)  
    标准的命令消息;  

    ②、ON_COMMAND_EX(ID,pfn)  
    多个对象对同一个命令 ID 的处理;  
    其函数的原型如下:  
    afx_msg BOOL pfn(UINT nID)  
    说明:  
    当返回 TRUE 时表示已经处理,不用在消息处理链中继续处理该命令;为 FALSE 时表示继续在消息处理链中处理该命令。  
    注意:  
    其一:在多对象处理中一定要使用该宏;  
    其二:pfn(UINT nID)(消息处理函数)返回值将其类型void改成BOOL,而且必须为FALSE;  
    其三:多个对象的处理是由高层向低层的过程:即视图类→主框架窗口类→应用程序类;  

    ③、ON_COMMAND_RANGE(nID,nLastID,pfn)  
    多个命令 ID 提供相同的处理;  
    注意:  
    其一:确保nID、nLastID的值在 Resource.h 中是连续的。  
    其二:一般在函数 pfn(UINT nID) 中加入参数,用来确定那一个按钮点击。  

    ㈡、CN_UPDATE_COMMAND_UI消息  
    当菜单项、工具栏按钮等[命令用户接口对象]要更新其状态时所对应的消息,它所包含的类型和对应的宏如下:  
    ①、ON_UPDATE_COMMAND_UI(ID,pfn)  
    其中函数的原型如下:  
    afx_msg void pfn(CCmdUI* pCmdUI)  

    ②、ON_UPDATE_COMMAND_UI_RANGE(nID,nLastID,pfn)  
    该函数可以处理一组[命令用户接口对象]的外观;  
    其中函数的原型如下:  
    afx_msg void pfn(CCmdUI* pCmdUI)  
    重要:  
    CCmdUI 中的 m_nID 成员表示不同的 ID,因此可以利用它来进行区别处理。  

    3、控件的通知消息 


    从控件和子窗口发送到父窗口的WM_COMMAND通知消息(即在发送命令消息中加入控件的通知码)。  
    注意:在 Window9x 新控件中不再传送WM_COMMAND通知消息,而是发送 WM_NOTIFY 消息,但为了兼容,旧有的控件还是传送WM_COMMAND消息。  
    例如:  
    CEdit控件向父窗口发送 EN_CHANGE 通知代码的WM_COMMAND消息。  
    注意:框架像传送其它 WM_ 消息一样传送通知消息,但有一个例外,即由 [按钮] 控件发送的 BN_CLICKED 通知消息,被作为命令消息特别处理。  
    ㈠、WM_COMMAND 其所对应的宏如下:  
    ①、ON_CONTROL(通知码, nID,fn)  
    ②、ON_CONTROL_RANGE(通知码, nFirstID,nEndID,fn)  
    注意:  
    这两个宏的应用和 ON_COMMAND、ON_COMMAND_RANGE相同,所不同的是在宏前面加入[通知码]。  
    注意:可以根据不同的控件的[通知码]派生出特定的宏,其所派生的宏一般为在 [通知码] 前面加上 ON_。 


    ㈡、WM_NOTIFY 其所对应的宏如下:  
    ①、ON_NOTIFY(通知码, nID,fn)  
    其中函数的原型如下:  
    afx_msg void fn(NMHDR* pNotifyStruct,LRESULT* result)  
    其中结构:  
    typedef struct tagNMHDR {   
    HWND hwndFrom; //发送通知消息的控件的句柄;  
    UINT idFrom; //发送通知消息的控件的 ID;  
    UINT code; //通知码;  
    } NMHDR;   

    ②、ON_NOTIFY_EX(通知码, nID,fn)  
    表示一个消息在多个对象的成员函数中进行处理。  
    其中函数的原型如下:  
    afx_msg BOOL fn(UINT nID,NMHDR* pNotifyStruct,LRESULT* result)  
    说明:  
    它必须返回 BOOL 类型的数值,其意义和 ON_COMMAND_EX 相同。  

    ③、ON_NOTIFY_RANGE(通知码, nFirstID,nEnd,fn)  
    表示多个控件的通知消息在同一个函数中进行处理。  
    其中函数的原型如下:  
    afx_msg void fn(UINT nID,NMHDR* pNotifyStruct,LRESULT* result)  
    说明:  
    其意义和ON_COMMAND_RANGE相同。  

    4、反射消息处理  
    父窗口在处理控件窗口的通知消息WM_CTLCOLOR、WM_COMMAND、WM_NOTIFY时,会把该消息转化为反射消息,并转交给控件子窗口处理,只有在控件子窗体不处理该消息时,父窗口才有机会处理。  
    注意:在类的属性对话框中的消息页面可查反射消息(前面有"="标志)  
    ①、WM_CTLCOLOR_REFLECT反射消息  
    其所对应的宏如下:  
    ON_WM_CTLCOLOR_REFLECT()  
    反射消息函数的原型:  
    HBRUSH class_name∷CtlColor(CDC* pDC,UINT nCtlColor)  
    {  
    return NULL;  
    }  
    该函数用来重置控件的顔色;注意:必须 return CBrush才有效。  


    5、自定义的窗口消息  
    自定义窗口消息的消息标志都大于WM_USER(至少是WM_USER+100,因为许多控件都使用这一范围的WM_USER消息)  
    使用自定义的消息分为二步:  
    ①、在 Resource.h 中定义消息标记  
    #define WM_MYMSG (WM_USER+1000)  

    ②、在消息映射表中加入消息映射宏  
    BEGIN_MESSAGE_MAP()  

    ON_MESSAGE(WM_MYMSG,fn)  
    END_MESSAGE_MAP()  
    说明:  
    其对应的宏为 ON_MESSAGE(),其成员函数的原型为:  
    afx_msg LRESULT fn(WPARAM,LPARAM)  

    6、登记消息  
    ①、在系统中注册并获取一个登记消息的消息标记  
    UINT RegisterWindowMessage(LPCTSTR)  
    说明:  
    通过 API 函数来注册消息标记,其中 LPCTSTR 为用户的任意字符串。例如:  
    UINT WM_MYMSG=RegisterWindowMessage("MYMSG");  
    其中 WM_MYMSG 是自定义无符号整型的消息标记。  

    ②、在消息映射表中加入消息映射宏  
    BEGIN_MESSAGE_MAP()  

    ON_REGISTERED_MESSAGE(WM_MYMSG,fn)  
    END_MESSAGE_MAP()  
    说明:  
    其对应的宏为 ON_REGISTERED_MESSAGE(),其成员函数的原型为:  
    afx_msg LRESULT fn(WPARAM,LPARAM)  
    注意:登记消息可以实现跨进程的数据通讯。  

    7、线程消息  
    只有继承自CWinThread类才能允许处理线程消息。  
    ①、定义线程的消息标记  
    有两种方法:  
    (1)、使用自定义的消息标记,即:WM_USER;  
    (2)、使用登记的消息标记,即:RegisterWindowMessage;  

    ②、在CWinThread继承类的消息映射表中添加宏  
    ON_THREAD_MESSAGE(消息标记,fn) //自定义的消息;  
    ON_REGISTERED_THREAD_MESSAGE(消息标记,fn) //登记的 //消息  
    ③、其函数的原型如下:  
    afx_msg void fn(WPARAM wPARAM,LPARAM lParam)  

    ④、引发线程消息  
    线程消息的引发必须调用 CWinThread 类的PostThreadMessage将消息投递到线程消息队列中。  
    注意:可以通过 AfxGetApp() 函数获取一个全局的应用对象。  
    PostThreadMessage(UINT,WPARAM,LPARAM)  

    8、WM_COPYDATA  
    操作系统维护一块内存来管理 WM_COPYDATA 消息,该消息主要用于跨进程传递数据,传递的数据量达到 232。  
    ①、定义一个 COPYDATASTRUCT 数据结构  
    typedef struct tagCOPYDATASTRUCT {   
    DWORD dwData; //自定义的特殊数据;  
    DWORD cbData; //以字节为单位的 lpData 的大小;  
    PVOID lpData; //传送的数据内存块的指针;  
    } COPYDATASTRUCT;   

    ②、其所对应的宏  
    ON_WM_COPYDATA()  

    ③、其所对应的函数的原型  
    afx_msg BOOL OnCopyData(CWnd*,COPYDATASTRUCT*)  
    说明:  
    CWnd*:发送该消息的窗口的指针;  


    9、投递和发送消息  
    通过向一个窗体投递或发送消息,可以间接地驱动窗体的消息过程。  
    投递(PostMessage):将消息放到线程的消息队列中,然后不等线程处理该消息就直接返回到调用方。  
    发送(SendMessage):当一个线程向目标线程发送消息时,该线程要一直等待,直到目标线程处理了该消息为止。  
    ①、投递消息  
    BOOL CWnd∷PostMessage(UINT,WPARAM=0,LPARAM=0)  
    说明:  
    CWnd:目标窗口;  
    该函数将一条消息放入到应用程序的消息队列,然后不等窗口处理就直接返回。  

    ②、发送消息  
    LRESULT CWnd∷SendMessage(UINT,WPARAM=0,LPARAM=0)  
    说明:  
    CWnd:目标窗口;  
    该函数将一条消息放入到应用程序的消息队列,等待窗口处理后才返回。  
    为了避免线程陷入永久等待状态,可以用SendMessageTimeout代替SendMessage:  
    LRESULT SendMessageTimeout(HWND,UINT,WPARAM,LPARAM,UINT,UINT,PDWORD_PTR)  
    说明:  
    HWND:窗口句柄;  
    UINT:消息发送的选项,为SMTO_BLOCK时,可以防止线程无 限等待,即根据一定的超时值返回。  
    UINT:超时,以毫秒为单位;  
    PDWORD_PTR:返回值;  
    注意:CWnd没有对该函数的包装。  

    ③、投递和发送消息  
    BOOL CWnd∷SendNotifyMessage(UINT,WPARAM,LPARAM)  
    说明:  
    CWnd:目标窗口;  
    该消息具有SendMessage和PostMessage两种功能:  
    当目标窗口和发送窗口为同一个线程时,则相当于SendMessage的功能;否则当不为同一个线程时,则为PostMessage的功能。  

    6-1、投递和发送 WM_XXX 消息  
    在发送标准的 WINDOW 消息时,只要将该消息的 ID、wParam、lParam参数放在 SendMessage()和PostMessage()函数的相应位置即可。  

    6-2、投递和发送命令消息和控件的通知消息  
    在投递和发送命令消息时,消息的 ID为 WM_COMMADN,而对于不同的菜单项、加速键、控件则wParam、lParam的取值不同。  
    wParam分成低、高两部分,低部分为菜单项、加速键、控件的ID。高部分则:  
    菜单项:0;加速键:1;控件:通知码  
    lParam:当控件时是控件的句柄,否则为 NULL。  

    对于wParam参数可以采用自定义宏:  
    WPARAM MAKEWPARAM(WORD wLow,WORD wHigh)  

    6-3、投递和发送自定义的窗口消息  
    在投递和发送自定义的窗口消息时,参数 wParam、lParam 没有特别的涵义,只和普通函数的形参一样进行数据的传递。  
    注意:  
    PostMessage 和 SendMessage 是不同的,前者投递后就返回,而后者必须等到消息处理后再返回;所以在参数是 [局部] 或 [临时]时,使用PostMessage函数会引发错误(除非参数使用 指针,则可避免错误),而必须使用SendMessage函数。  
    6-4、投递和发送注册的窗口消息  
    和 6-3 基本一样,但它要特别注意的问题是:在跨进程的处理消息时,如果将消息PostMessage、SendMessage到某个进程 A,则必须在进程 B 中获取进程 A 的窗口类名,并通过窗口类名获取窗口的指针,最后再根据指针调用 PostMessage、SendMessage 函数。  
    注意:在获取窗口的指针时,可以根据窗口类名或窗口的标题。  


    6-5、投递和发送WM_COPYDATA消息  
    SendMessage(消息标记,WPARAM,LPARAM)  
    其中:  
    消息标记:WM_COPYDATA;  
    WPARAM:发送该消息的窗口句柄;  
    LPARAM:COPYDATASTRUCT结构的指针,先通过(LPVOID)进行转换,再通过(LPARAM)进行转换,如下形式:  
    (LPARAM)(LPVOID)&cds  

     

    BM 按钮控制消息
    CB组合框控制消息
    DM 默认下压式按钮控制消息
    EM 编辑控制消息
    LB 列表框控制消息
    SBM 滚动条控制消息
    WM窗口消息

     

    WM_COMMAND 消息控制函数

    ON_COMMAND(<ID>,<FUN>) afx_msg void FUN();

    ON_COMMAND_EX(<ID>,<FUN>) afx_msg bool FUN(UINT);

     

    子窗口通知消息控制函数: 普通和特殊两部分

     

    一般的控制通知代码

    ON_CONTROL(<WNotifyCode>,<ID>,<FUN>) afx_msg void FUN();

    ON_NOTIFY(<WNotifyCode>,<ID>,<FUN>) afx_msg void FUN();

     

    用户按钮通知代码

    ON_BN_CLICKED(<ID>,<FUN>) afx_msg void FUN();

    ON_BN_DISABLE(<ID>,<FUN>) afx_msg void FUN();

    ON_BN_DOUBLECLICKED(<ID>,<FUN>) afx_msg void FUN();

    ON_BN_HILITE(<ID>,<FUN>) afx_msg void FUN();

    ON_BN_PAINT(<ID>,<FUN>) afx_msg void FUN();

    ON_BN_ONHILITE(<ID>,<FUN>) afx_msg void FUN();

     

    组合框通知代码

    ON_CBN_CLOSEUP(<ID>,<FUN>) afx_msg void FUN();

    ON_CBN_DBLCLK(<ID>,<FUN>) afx_msg void FUN();

    ON_CBN_DROPDOWN(<ID>,<FUN>) afx_msg void FUN();

    ON_CBN_EDITUPDATE(<ID>,<FUN>) afx_msg void FUN();

    ON_CBN_ERRSPACE(<ID>,<FUN>) afx_msg void FUN();

    ON_CBN_KILLFOCUS(<ID>,<FUN>) afx_msg void FUN();

    ON_CBN_SELCHANGE(<ID>,<FUN>) afx_msg void FUN();

    ON_CBN_SELENDCANCEL(<ID>,<FUN>) afx_msg void FUN();

    ON_CBN_SELENDOK(<ID>,<FUN>) afx_msg void FUN();

    ON_CBN_SETFOCUS(<ID>,<FUN>) afx_msg void FUN();

     

    编辑框通知代码

    ON_EN_CHANGE(<ID>,<FUN>) afx_msg void FUN();

    ON_EN_ERRSPACE(<ID>,<FUN>) afx_msg void FUN();

    ON_EN_HSCROLL(<ID>,<FUN>) afx_msg void FUN();

    ON_EN_KILLFOCUS(<ID>,<FUN>) afx_msg void FUN();

    ON_EN_MAXTEXT(<ID>,<FUN>) afx_msg void FUN();

    ON_EN_SETFOCUS(<ID>,<FUN>) afx_msg void FUN();

    ON_EN_UPDATE(<ID>,<FUN>) afx_msg void FUN();

    ON_EN_VSCROLL(<ID>,<FUN>) afx_msg void FUN();

     

    列表框通知代码

    ON_LBN_DBLCLK(<ID>,<FUN>) afx_msg void FUN();

    ON_LBN_ERRSPACE(<ID>,<FUN>) afx_msg void FUN();

    ON_LBN_KILLFOCUS(<ID>,<FUN>) afx_msg void FUN();

    ON_LBN_SELCHANGE(<ID>,<FUN>) afx_msg void FUN();

    ON_LBN_SETFOCUS(<ID>,<FUN>) afx_msg void FUN();

     

    列表视图通知代码

    ON_LVN_BEGINDRAG(<ID>,<FUN>) afx_msg void FUN();

    ON_LVN_BEGINLABLEEDIT(<ID>,<FUN>) afx_msg void FUN();

    ON_LVN_BEGINRDRAG(<ID>,<FUN>) afx_msg void FUN();

    ON_LVN_COLUMNCLICK(<ID>,<FUN>) afx_msg void FUN();

    ON_LVN_DELETEALLITEMS(<ID>,<FUN>) afx_msg void FUN();

    ON_LVN_DELETEITEM(<ID>,<FUN>) afx_msg void FUN();

    ON_LVN_ENDLABLEEDIT(<ID>,<FUN>) afx_msg void FUN();

    ON_LVN_GETDISPINFOR(<ID>,<FUN>) afx_msg void FUN();

    ON_LVN_INSERTITEM(<ID>,<FUN>) afx_msg void FUN();

    ON_LVN_ITEMCHANGED(<ID>,<FUN>) afx_msg void FUN();

    ON_LVN_KEYDOWN(<ID>,<FUN>) afx_msg void FUN();

    ON_LVN_PEN(<ID>,<FUN>) afx_msg void FUN();

    ON_LVN_SETDISPINFO(<ID>,<FUN>) afx_msg void FUN();

     

    树视图通知代码

    ON_TVN_BEGINDRAG(<ID>,<FUN>) afx_msg void FUN();

    ON_TVN_BEGINLABLEEDIT(<ID>,<FUN>) afx_msg void FUN();

    ON_TVN_BEGINRDRAG(<ID>,<FUN>) afx_msg void FUN();

    ON_TVN_DELETEITEM(<ID>,<FUN>) afx_msg void FUN();

    ON_TVN_ENDLABLEEDIT(<ID>,<FUN>) afx_msg void FUN();

    ON_TVN_GETDISPINFOR(<ID>,<FUN>) afx_msg void FUN();

    ON_TVN_ITEMEXPENDED(<ID>,<FUN>) afx_msg void FUN();

    ON_TVN_KEYDOWN(<ID>,<FUN>) afx_msg void FUN();

    ON_TVN_SELCHANGED(<ID>,<FUN>) afx_msg void FUN();

    ON_TVN_SELCHANGING(<ID>,<FUN>) afx_msg void FUN();

     

    列表控件通知代码

    ON_TCN_KEYDOWN(<ID>,<FUN>) afx_msg void FUN();

    ON_TCN_SELCHANGED(<ID>,<FUN>) afx_msg void FUN();

    ON_TCN_SELCHANGING(<ID>,<FUN>) afx_msg void FUN();

     

     静态控件通知代码

    ON_STN_CLICKED(<id>, <memberFxn>) afx_msg void memberFxn();

    ON_STN_DBLCLK(<id>, <memberFxn>) afx_msg void memberFxn();

    ON_STN_DISABLE(<id>, <memberFxn>) afx_msg void memberFxn();

    ON_STN_ENABLE(<id>, <memberFxn>) afx_msg void memberFxn();

     

    WINDOWS通知消息控制函数

    ON_WM_ACTIVATE() afx_msg void OnActivate(UINT,CWnd*,bool);

    ON_WM_ACTIVATEAPP() afx_msg void ONActivateApp(bool,HANDLB);

    ON_WM_ASKBFORMATNAME() afx_msg void OnAskCbFormatName(UINT,LPSTR);

    ON_WM_CANCELMODE() afx_msg void OnCancelmode();

    ON_WM_CHANGECBCHAIN() afx_msg void OnChangeCbChain(HWND,HWND);

    ON_WM_CHAR() afx_msg void OnChar(UINT,UINT,UINT);

    ON_WM_CHARTOITEM() afx_msg int  OnCharToItem(UINT,CWnd*,UINT);

    ON_WM_CHILDACTIVATE() afx_msg void OnChildActivate();

    ON_WM_CLOSE() afx_msg void OnClose();

    ON_WM_COMPACTING() afx_msg void OnCompacting(UINT);

    ON_WM_COMPAREITEM() afx_msg int  OnCompareItem(LPDELETEITEMSTRUCT);

    ON_WM_CREATE() afx_msg int  OnCreate(LPCREATESTRUCT);

    ON_WM_CTLCOLOR() afx_msg HBRUSH OncTLCOLOR(CDC*,CWnd*,UINT);

    ON_WM_DEADCHAR() afx_msg void OnDeadChar(UINT,UINT,UINT);

    ON_WM_DELETEITEM() afx_msg void OnDeleteItem(LPDELETEITEMSTRUCT);

    ON_WM_DESTROY() afx_msg void OnDestroy();

    ON_WM_DESTROYCLIPBOARD() afx_msg void OnDestroyClipboard();

    ON_WM_DEVMODE_CHANGE() afx_msg void OnDevModeChande(LPSTR);

    ON_WM_DRAWCLIPBOARD() afx_msg void OnDrawClipboard();

    ON_WM_DRAWITEM() afx_msg void OnDrawItem(LPDRAWITEMSTRUCT);

    ON_WM_DROPFILES() afx_msg void OnDropFiles(HANDLE);

    ON_WM_ENABLE() afx_msg void OnEnable(bool);

    ON_WM_ENDSESSION() afx_msg void OnEndSession(bool);

    ON_WM_ENTERIDLE() afx_msg void OnEnterIdle(UINT,CWnd*);

    ON_WM_ERASEBKGND() afx_msg bool OnEraseBkgnd(CDC*);

    ON_WM_FONTCHANGE() afx_msg void OnFontChange();

    ON_WM_GETDLGCODE() afx_msg UINT OnGetDlgCode();

    ON_WM_GETMINMAXINFO() afx_msg void OnGetMinMaxInfo(LPPOINT);

    ON_WM_HSCROLL() afx_msg void OnHScroll(UINT,UINT,CWnd*);

    ON_WM_HSCROLLCLIPBOARD() afx_msg void OnHScrollClipboard(CWnd*,UINT,UINT);

    ON_WM_ICONERASEBKGND() afx_msg void OnIconEraseBkgnd(CDC*);

    ON_WM_INITMENU() afx_msg void OnInitMenu(CMenu*);

    ON_WM_INITMENUPOPUP() afx_msg void OnInitMenuPopup(CMenu*,UINT,UINT);

    ON_WM_KEYDOWN() afx_msg void OnKeyDown(UINT,UINT,UINT);

    ON_WM_KEYUP() afx_msg void OnKeyUp(UINT,UINT,UINT);

    ON_WM_KILLFOCUS() afx_msg void OnKillFocus(CWnd*);

    ON_WM_LBUTTONDBLCLK() afx_msg void OnLBottonDBlclk(UINT,CPoit);

    ON_WM_LBUTTONDOWN() afx_msg void OnLBottonDown(UINT,CPoit);

    ON_WM_LBUTTONUP() afx_msg void OnLBottonUp(UINT,CPoit);

    ON_WM_MBUTTONDBLCLK() afx_msg void OnMBottonDBlclk(UINT,CPoit);

    ON_WM_MBUTTONDOWN() afx_msg void OnMBottonDown(UINT,CPoit);

    ON_WM_MBUTTONUP() afx_msg void OnMBottonUp(UINT,CPoit);

    ON_WM_RBUTTONDBLCLK() afx_msg void OnRBottonDBlclk(UINT,CPoit);

    ON_WM_RBUTTONDOWN() afx_msg void OnRBottonDown(UINT,CPoit);

    ON_WM_RBUTTONUP() afx_msg void OnRBottonUp(UINT,CPoit);

    ON_WM_MDIACTIVTE() afx_msg void OnMDIActivate(bool,CWnd*,CWnd*);

    ON_WM_MEASUREITEM() afx_msg void OnMeasureItem(LPMEASUREITEMSTRUCT);

    ON_WM_MENUCHAR() afx_msg LONG OnMenuChar(UINT,UINT,CMenu*);

    ON_WM_MENUSELECT() afx_msg void OnMenuSelect(UINT,UINT,HMENU);

    ON_WM_MOUSEACTIVATE() afx_msg void OnMouseActivate(CWnd*,UINT,UINT);

    ON_WM_MOUSEMOVE() afx_msg void OnMouseMove(UINT,CPoint);

    ON_WM_MOVE() afx_msg void OnMove(int,int);

    ON_WM_NCATIVATE() afx_msg bool OnNcAtivate(bool);

    ON_WM_NCCALCSIZE() afx_msg void OnNcCalcSize(LPRECT);

    ON_WM_NCCREATE() afx_msg void OnNcCreate(LPCREATESTRUCT);

    ON_WM_NCDESTROY() afx_msg void OnNcDestroy();

    ON_WM_NCHITTEST() afx_msg UINT OnNcHitTest(CPoint);

    ON_WM_NCPAINT() afx_msg void OnNcPaint();

    ON_WM_NCLBUTTONDBLCLK() afx_msg void OnNcLBottonDBlclk(UINT,CPoit);

    ON_WM_NCLBUTTONDOWN() afx_msg void OnNcLBottonDown(UINT,CPoit);

    ON_WM_NCLBUTTONUP() afx_msg void OnNcLBottonUp(UINT,CPoit);

    ON_WM_NCMBUTTONDBLCLK() afx_msg void OnNcMBottonDBlclk(UINT,CPoit);

    ON_WM_NCMBUTTONDOWN() afx_msg void OnNcMBottonDown(UINT,CPoit);

    ON_WM_NCMBUTTONUP() afx_msg void OnNcMBottonUp(UINT,CPoit);

    ON_WM_NCRBUTTONDBLCLK() afx_msg void OnNcRBottonDBlclk(UINT,CPoit);

    ON_WM_NCRBUTTONDOWN() afx_msg void OnNcRBottonDown(UINT,CPoit);

    ON_WM_NCRBUTTONUP() afx_msg void OnNcRBottonUp(UINT,CPoit);

    ON_WM_PAINT() afx_msg void OnPaint();

    ON_WM_PAINTCLIPBOARD() afx_mag void OnPaintClipboard(CWnd*,HANDLE);

    ON_WM_PALETTECHANGED() afx_mag void OnPaletteChanged(CWnd*);

    ON_WM_PALETTECHANGING() afx_mag void OnPaletteChanging(CWnd*);

    ON_WM_PARENTNOTIFY() afx_mag void OnParentNotify(UINT,LONG);

    ON_WM_QUERYDRAGICON() afx_msg HCURSOR OnQueryDragIcon();

    ON_WM_QUERYDRAGPALETTE() afx_msg bool OnQueryDragPalette();

    ON_WM_QUERYENDSESSION() afx_msg bool OnQueryEndSesion();

    ON_WM_QUERYOPEN() afx_msg bool OnQueryOpen();

    ON_WM_RENDERALLFORMATS() afx_msg void OnRenderAllFormats();

    ON_WM_RENDERFORMAT() afx_msg void OnRenderFormat(UINT);

    ON_WM_SETFOCUS() afx_msg void OnSetFocus(CWnd*);

    ON_WM_SHOWWINDOW() afx_msg void OnShowWindow(bool,UINT);

    ON_WM_SIZE() afx_msg void OnSize(UINT,int,int);

    ON_WM_SIZECLIPBOARD() afx_msg void OnSizeClipboard(CWnd*,HANDLE);

    ON_WM_SPOOLERSTATUS() afx_msg void OnSpoolerStatus(UINT,UINT);

    ON_WM_SYSCHAR() afx_msg void OnSysChar(UINT,UINT,UINT);

    ON_WM_SYSCOLORCHANGE() afx_msg void OnSysColorChange();

    ON_WM_SYSDEADCHAR() afx_msg void OnSysDeadChar(UINT,UINT,UINT);

    ON_WM_SYSKEYDOWN() afx_msg void OnSysKeyDown(UINT,UINT,UINT);

    ON_WM_SYSKEYUP() afx_msg void OnSysKeyUp(UINT,UINT,UINT);

    ON_WM_TIMECHANGE() afx_msg void OnTimeChange();

    ON_WM_VKEYTOITEM() afx_msg void OnVKeyToItem(UINT,CWnd*,UINT);

    ON_WM_TIMER() afx_msg void OnTimer(UINT);

    ON_WM_VSCROLL() afx_msg void OnVScroll(UINT,UINT,CWnd*);

    ON_WM_VSCROLLCLIPBOARD() afx_msg void OnVScrollClipboard(CWnd*,UINT,UINT);

    ON_WM_WINDOWPOSCHANGED() afx_msg void OnWindowPosChanged(WINDOWPOS FAR *);

    ON_WM_WINDOWPOSCHANGING() afx_msg void OnWindowPosChanging(WINDOWPOS FAR *);

    ON_WM_WININICHANGE() afx_msg void OnWinIniChange(LPSTR);

     

    用户自定义消息代码

    ON_MESSAGE(<message>,<FUN>) afx_msg LONG FUN(UINT wparam,LONG lparam);

    ON_REGISTERED_MESSAGE(<nMessageVariable>,<FUN>) afx_msg LONG FUN(UINT wparam,LONG lparam);

    展开全文
  • //8字符消息类型 虚拟键码 字符 lParam信息(重复计数、OEM扫描码、扩充键旗标、内容代码、键的先前状态、转换状态、位移状态) //每一个键按下,都会产生WM_KEYDOWN、WM_CHAR、WM_KEYUP个按键消息 /*--------...
  • 窗口与物主窗口

    2014-09-24 11:39:10
    windows形形色色的窗口家族中,每个窗口也只能是三种基本类型之一: 1. 重叠窗口(Overlapped) 2. 弹出窗口(Pupup) 3. 子窗口 (Child) 当调用CWnd的Create/CreateEx或是CDialog的Create创建一个基于...
  • Callback的本质是设置一个函数指针进去,然后在需要需要触发某个事件时调用该方法, 比如Windows窗口消息处理函数就是这种类型。 比如下面的示例代码,我们在Download完成时需要触发一个通知外面的事件: typedef ...
  • 第一方法: 第一步: 先看报错窗口 2003 can’t connect to MySQL server on ‘127.0.0.1’(10038). 第二步: 原因是:远程3306端口未对外开放操作。 第步: 首先远程连接服务器,点击”开始”–> “管理...
  • 窗口与物主窗口_(小经验总结)

    千次阅读 2010-09-28 13:20:00
    窗口与物主窗口     在windows形形色色的窗口家族中,每个窗口也只能是三种基本类型之一: 1. 重叠窗口(Overlapped) 2. 弹出窗口(Pupup) 3. 子窗口 (Child)...
  • 1、是一NoSQL(NotonlySQL)数据库,即非关系型数据库。 2、存储键值对。 3、Windows版本下载链接:Redis Windows版 二、Redis可视化工具 自带的 redis-cli.exe只有一个黑漆漆的命令窗口,有时候感觉不是很...
  • 隐藏系统窗口

    2013-06-05 10:16:32
    2.选择隐藏自定义窗口后,下面会有两个选项:浏览器和网页窗口Windows资源管理器窗口,选中的话将同时隐藏它们。浏览器窗口只支持IE和360浏览器,要添加更多的话可以编辑自定义规则。 3.新建规则窗口有一个选项为...
  • 三种类型及方法如下: 一:Windows窗口 handle=driver.windows_handles#获取句柄,得到的是一个列表 driver.switch_to.windows(handle[-1])#切换至最新句柄 此类窗口就是常说的句柄,点击某个连接会产生新的句柄,...
  • windows 程序设计

    2011-07-24 21:16:30
    Windows虚拟化了显示硬件,使为Windows编写的程序可使用任何具有Windows设备驱动程序的视频卡或打印机,而程序无需确定系统相连的设备类型。 对Windows开发者来说,将与设备无关的图形接口输出到IBM PC上不是件轻松...
  • 01、前言前面讲了时间 Time 的概念和实际解决问题后,本篇来看下经常搭配使用的另一个关键工具:窗口 Window。窗口也有三种类型可供选择使用:Tumbling Windows:滚动...
  • 一般说到selenium中的弹窗包括以下三种类型类型一:窗口柄 这种窗口常说的就是窗口句柄,其实并不能算弹窗,应该属于窗口切换 类型二:web弹窗 使用如下命令导致的: browser = webdriver.Firefox() browser....
  • 1.Windows编程基础

    2019-10-01 13:06:24
    三种应用程序的对比 3.Windows开发工具和库 4.Windows库和头文件 5.HelloWorld程序的相关函数 6.编译、链接和执行 7.编写第一个窗口程序(HelloWorld版) 8.资源的使用 9.NMAKE 和 Makefile 10.Makefile的语法...
  • 【转】minigui的窗口

    2010-12-20 16:38:00
    minigui中的Windows  图形编程中,窗口是一个重要的概念,窗口其实是一个矩形框... 在MiniGui中有三种窗口类型:主窗口,对话框和控件窗口。主窗口作为应用程序的主界面或开始界面。子窗口通常是控件窗口
  • 服务是一程序类型,它在后台运行,服务程序通常可以在本地和通过网络为用户提供一些功能。服务程序可能是EXE程序,具有其单独的进程,也有可能是DLL文件依附于某个进程,更有可能是SYS文件而处于系统的内核之中。 ...
  • windows消息机制

    2017-03-24 16:30:37
    MFC 消息类型:三种     1、命令消息(WM_COMMAND)  所有派生自 CCmdTarget 的类都有资格接受WM_COMMAND。  2、Window消息(WM_xxx)  所有派生自 CWnd 的类都有资格接受 WM_xxx。  3、控件消息(WM_...
  • Windows 消息机制

    2012-06-29 09:10:26
    三种类型的消息 Default Window-Message Processing[缺省的窗口消息处理] [url]http://www.cnblogs.com/shanzy/articles/1401098.html[/url] Messages and Message Queues [url]...
  • Windows API函数大全

    热门讨论 2010-02-04 09:04:57
    4. API之打印函数 AbortDoc 取消一份文档的打印 AbortPrinter 删除与一台打印机关联...用VC 6.0实现串行通信的三种方法 windows运行命令详解 Windows API函数大全四 Windows API函数大全三 Windows API函数大全二
  • Windows 10登录对话框出现之前,会显示三种类型的锁屏图片之一;且在登录界面中,背景默认也会以图片的形式显示。但有的用户因误将某张不喜欢的图片设置为锁屏图片,不知该如何删除;还有的用户更喜欢纯色的登录...
  • 从上面的启动过程我们可以看出,Mysql集群启动命令较复杂,容易造成cmd窗口因误操作关闭而导致的...首先,Mysql集群分为管理节点、数据节点、访问节点三种类型,每一种都可以注册为Windows服务,下面一一举例作为...
  • Window Server中的Events(事件)被应用程序获取并处理。类似于微软Windows操作系统中的消息,事件通常源于用户...事件类型Symbian OS 中的Window server有三种事件类型,通用事件、重画事件及优先键事件,它们分别封装
  • 8.2 计时器的使用:三种方法 8.2.1 方法一 8.2.2 方法二 8.2.3 方法三 8.3 计时器用于时钟 8.3.1 构造数字时钟 8.3.2 获取当前时间 8.3.3 显示数字和冒号 8.3.4 国际化 8.3.5 构造模拟...
  • 从上面的启动过程我们可以看出,Mysql集群启动命令较复杂,容易造成cmd窗口因误操作关闭而...首先,Mysql集群分为管理节点、数据节点、访问节点三种类型,每一种都可以注册为Windows服务,下面一一举例作为示范:...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 265
精华内容 106
关键字:

windows三种窗口类型