当前位置: 首页 > news >正文

阿里云网站建设c 网站开发需要学什么软件有哪些

阿里云网站建设,c 网站开发需要学什么软件有哪些,重庆市安全建设工程信息,360网站弹窗推广怎么做的Windows是一个消息#xff08;Message#xff09;驱动系统。Windows的消息提供了应用程序之间、应用程序与Windows系统之间进行通信的手段。应用程序想要实现的功能由消息来触发#xff0c;并且靠对消息的响应和处理来完成。必须注意的是#xff0c;消息并非是抢占性的Message驱动系统。Windows的消息提供了应用程序之间、应用程序与Windows系统之间进行通信的手段。应用程序想要实现的功能由消息来触发并且靠对消息的响应和处理来完成。必须注意的是消息并非是抢占性的无论事件的缓急总是按照到达的先后派对依次处理一些系统消息除外这样可能使一些实时外部事件得不到及时处理。       Windows的应用程序一般包含窗口Window它主要为用户提供一种可视化的交互方式窗口是总是在某个线程Thread内创建的。Windows系统通过消息机制来管理交互消息Message被发送保存处理一个线程会维护自己的一套消息队列Message Queue以保持线程间的独占性。队列的特点无非是先进先出这种机制可以实现一种异步的需求响应过程。   目录 1、消息 2  、消息类型 3 、消息队列(Message Queues) 4 、队列消息(Queued Messages)和非队列消息(Non-Queued Messages) 5 、PostMessage(PostThreadMessage), SendMessage 6 、GetMessage, PeekMessage 7 、TranslateMessage, TranslateAccelerator 8、(消息死锁( Message Deadlocks) 9、BroadcastSystemMessage 10、消息的处理 11、MFC的消息映射 12、消息反射机制   1、消息     消息系统对于一个win32程序来说十分重要它是一个程序运行的动力源泉。一个消息是系统定义的一个32位的值他唯一的定义了一个事件向Windows发出一个通知告诉应用程序某个事情发生了。例如单击鼠标、改变窗口尺寸、按下键盘上的一个键 都会使Windows发送一个消息给应用程序。     消息本身是作为一个记录传递给应用程序的这个记录中包含了消息的类型以及其他信息。例如对于单击鼠标所产生的消息来 说这个记录中包含了单击鼠标时的坐标。这个记录类型叫做MSGMSG含有来自windows应用程序消息队列的消息信息它在 Windows中声明如下  typedef struct tagMsg  {  HWND hwnd;          // 接受该消息的窗口句柄  UINT message;         // 消息常量标识符也就是我们通常所说的消息号  WPARAM wParam;     // 32位消息的特定附加信息确切含义依赖于消息值  LPARAM lParam;       // 32位消息的特定附加信息确切含义依赖于消息值  DWORD time;         // 消息创建时的时间  POINT pt;             // 消息创建时的鼠标/光标在屏幕坐标系中的位置  }MSG;      消息可以由系统或者应用程序产生。系统在发生输入事件时产生消息。举个例子, 当用户敲键, 移动鼠标或者单击控件。系统也产生消息以响应由应用程序带来的变化, 比如应用程序改变系统字体改变窗体大小。应用程序可以产生消息使窗体执行任务或者与其他应用程序中的窗口通讯。 2、消息类型 1) 系统定义消息(System-Defined Messages)         在SDK中事先定义好的消息非用户定义的其范围在[0x0000, 0x03ff]之间 可以分为以下三类  1 窗口消息(Windows Message)        与窗口的内部运作有关如创建窗口绘制窗口销毁窗口等。可以是一般的窗口也可以是Dialog,控件等。  如WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL...  2 命令消息(Command Message)         与处理用户请求有关 如单击菜单项或工具栏或控件时 就会产生命令消息。  WM_COMMAND, LOWORD(wParam)表示菜单项工具栏按钮或控件的ID。如果是控件, HIWORD(wParam)表示控件消息类型  3 控件通知(Notify Message)         控件通知消息 这是最灵活的消息格式 其Message, wParam, lParam分别为WM_NOTIFY, 控件ID指向NMHDR的指针。NMHDR包含控件通知的内容 可以任意扩展。  2) 程序定义消息(Application-Defined Messages)         用户自定义的消息 对于其范围有如下规定  WM_USER: 0x0400-0x7FFF      (ex. WM_USER10)  WM_APP(winver 4.0): 0x8000-0xBFFF (ex.WM_APP4)  RegisterWindowMessage: 0xC000-0xFFFF 3、消息队列(Message Queues)  Windows中有两种类型的消息队列  1) 系统消息队列(System Message Queue)         这是一个系统唯一的Queue设备驱动(mouse, keyboard)会把操作输入转化成消息存在系统队列中然后系统会把此消息放到目标窗口所在的线程的消息队列(thread-specific message queue)中等待处理  2) 线程消息队列(Thread-specific Message Queue)         每一个GUI线程都会维护这样一个线程消息队列。(这个队列只有在线程调用GDI函数时才会创建默认不创建)。然后线程消息队列中的消息会被送到相应的窗口过程(WndProc)处理.  注意 线程消息队列中WM_PAINTWM_TIMER只有在Queue中没有其他消息的时候才会被处理WM_PAINT消息还会被合并以提高效率。其他所有消息以先进先出FIFO的方式被处理。 4、队列消息(Queued Messages)和非队列消息(Non-Queued Messages) 1)队列消息(Queued Messages)         消息会先保存在消息队列中消息循环会从此队列中取消息并分发到各窗口处理  、如鼠标键盘消息。  2) 非队列消息(NonQueued Messages)         消息会绕过系统消息队列和线程消息队列直接发送到窗口过程被处理  如 WM_ACTIVATE, WM_SETFOCUS, WM_SETCURSOR WM_WINDOWPOSCHANGED  注意: postMessage发送的消息是队列消息它会把消息Post到消息队列中 SendMessage发送的消息是非队列消息 被直接送到窗口过程处理. 队列消息和非队列消息的区别         从消息的发送途径来看消息可以分成2种队列消息和非队列消息。消息队列由可以分成系统消息队列和线程消息队列。系统消息队列由Windows维护线程消息队列则由每个GUI线程自己进行维护为避免给non-GUI现成创建消息队列所有线程产生时并没有消息队列仅当线程第一次调用GDI函数时系统才给线程创建一个消息队列。队列消息送到系统消息队列然后到线程消息队列非队列消息直接送给目的窗口过程。      对于队列消息最常见的是鼠标和键盘触发的消息例如WM_MOUSERMOVE,WM_CHAR等消息还有一些其它的消息例如WM_PAINT、 WM_TIMER和WM_QUIT。当鼠标、键盘事件被触发后相应的鼠标或键盘驱动程序就会把这些事件转换成相应的消息然后输送到系统消息队列由 Windows系统去进行处理。Windows系统则在适当的时机从系统消息队列中取出一个消息根据前面我们所说的MSG消息结构确定消息是要被送往那个窗口然后把取出的消息送往创建窗口的线程的相应队列下面的事情就该由线程消息队列操心了Windows开始忙自己的事情去了。线程看到自己的消息队列中有消息就从队列中取出来通过操作系统发送到合适的窗口过程去处理。      一般来讲系统总是将消息Post在消息队列的末尾。这样保证窗口以先进先出的顺序接受消息。然而,WM_PAINT是一个例外同一个窗口的多个 WM_PAINT被合并成一个 WM_PAINT 消息, 合并所有的无效区域到一个无效区域。合并WM_PAIN的目的是为了减少刷新窗口的次数。       非队列消息将会绕过系统队列和消息队列直接将消息发送到窗口过程。系统发送非队列消息通知窗口系统发送消息通知窗口。例如,当用户激活一个窗口系统发送WM_ACTIVATE, WM_SETFOCUS, and WM_SETCURSOR。这些消息通知窗口它被激活了。非队列消息也可以由当应用程序调用系统函数产生。例如,当程序调用SetWindowPos系统发送WM_WINDOWPOSCHANGED消息。一些函数也发送非队列消息例如下面我们要谈到的函数。 5 、PostMessage(PostThreadMessage), SendMessage         PostMessage:把消息放到指定窗口所在的线程消息队列中后立即返回。 PostThreadMessage把消息放到指定线程的消息队列中后立即返回。          SendMessage直接把消息送到窗口过程处理 处理完了才返回。 PostMessage(异步)和SendMessage(同步)的区别 a、 PostMessage 是异步的SendMessage 是同步的。          PostMessage 只把消息放到队列不管消息是不是被处理就返回消息可能不被处理         SendMessage等待消息被处理完了才返回如果消息不被处理发送消息的线程将一直处于阻塞状态等待消息的返回。 b、 同一个线程内           SendMessage 发送消息时由USER32.DLL模块调用目标窗口的消息处理程序并将结果返回SendMessage 在同一个线程里面发送消息不进入线程消息队列PostMessage 发送的消息要先放到消息队列然后通过消息循环分派到目标窗口DispatchMessage。 c、不同线程              SendMessage 发送消息到目标窗口的消息队列然后发送消息的线程在USER32。DLL模块内监视和等待消息的处理结果直到目标窗口的才处理返回SendMessage在返回之前还需要做许多工作如响应别的线程向它发送的SendMessage().PostMessge() 到别的线程的时候最好使用PostThreadMessage   代替。PostMessage()的HWND 参数可以为NULL相当于PostThreadMessage() GetCrrentThreadId. d、系统处理消息。        系统只处理marshal)系统消息0--WM_USER)发送用户消息用户自己定义时需要用户自己处理。         使用PostMessage,SendNotifyMessage,SendMessageCallback等异步函数发送系统消息时参数不可以使用指针因为发送者不等待消息的处理就返回接收者还没有处理指针就有可能被释放了或则内容变化了。 e、在Windows 2000/XP,每个消息队列最多只能存放一定数量的消息超过的将不会被处理就丢掉。系统默认是10000[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows] USERPostMessageLimit 6 、GetMessage, PeekMessage PeekMessage会立即返回    可以保留消息  GetMessage在有消息时返回  会删除消息 PeekMessage和GetMessage函数的主要区别有         a. GetMessage的主要功能是从消息队列中“取出”消息消息被取出以后就从消息队列中将其删除而PeekMessage的主要功能是“窥视”消息如果有消息就返回true否则返回false。也可以使用PeekMessage从消息队列中取出消息这要用到它的一个参数UINT wRemoveMsg如果设置为PM_REMOVE消息则被取出并从消息队列中删除如果设置为PM_NOREMOVE消息就不会从消息队列中取出。         b. 如果GetMessage从消息队列中取不到消息则线程就会被操作系统挂起等到OS重新调度该线程时两者的性质不同使用GetMessage线程仍会被挂起使用PeekMessage线程会得到CPU的控制权运行一段时间。         c、GetMessage每次都会等待消息直到取到消息才返回而PeekMessage只是查询消息队列没有消息就立即返回从返回值判断是否取到了消息。 我们也可以说PeekMessage是一个具有线程异步行为的函数不管消息队列中是否有消息函数都会立即返回。而GetMessage则是一个具有线程同步行为的函数如果消息队列中没有消息的话函数就会一直等待直到消息队列中至少有一条消息时才返回。 如果消息队列中没有消息PeekMessage总是能返回这就相当于在执行一个循环如果消息队列一直为空 它就进入了一个死循环。GetMessage则不可能因为消息队列为空而进入死循环。 联系         在Windows的内部GetMessage和PeekMessage执行着相同的代码Peekmessage和Getmessage都是向系统的消息队列中取得消息并将其放置在指定的结构。 区别 PeekMessage有消息时返回TRUE没有消息返回FALSE  GetMessage有消息时且消息不为WM_QUIT时返回TRUE如果有消息且为WM_QUIT则返回FALSE没有消息时不返回。 GetMessage取得消息后删除除WM_PAINT消息以外的消息。 PeekMessage取得消息后根据wRemoveMsg参数判断是否删除消息。PM_REMOVE则删除PM_NOREMOVE不删除。 The PeekMessage function normally does not remove WM_PAINT messages from the queue. WM_PAINT messages remain in the queue until they are processed. However, if a WM_PAINT message has a null update region, PeekMessage does remove it from the queue. 不能用PeekMessage从消息队列中删除WM_PAINT消息从队列中删除WM_PAINT消息可以令窗口显示区域的失效区域变得有效刷新窗口如果队列中包含WM_PAINT消息程序就会一直while循环了。 7 、TranslateMessage, TranslateAccelerator          TranslateMessage: 把一个virtual-key消息转化成字符消息(character message)并放到当前线程的消息队列中消息循环下一次取出处理。          TranslateAccelerator: 将快捷键对应到相应的菜单命令。它会把WM_KEYDOWN 或 WM_SYSKEYDOWN转化成快捷键表中相应的WM_COMMAND 或WM_SYSCOMMAND消息 然后把转化后的 WM_COMMAND或WM_SYSCOMMAND直接发送到窗口过程处理 处理完后才会返回。 8、(消息死锁( Message Deadlocks) 假设有线程A和B 现在有以下下步骤          1) 线程A SendMessage给线程B, A等待消息在线程B中处理后返回          2) 线程B收到了线程A发来的消息并进行处理 在处理过程中B也向线程A SendMessgae然后等待从A返回。  因为此时 线程A正等待从线程B返回 无法处理B发来的消息 从而导致了线程A,B相互等待 形成死锁。多个线程也可以形成环形死锁。  可以使用 SendNotifyMessage或SendMessageTimeout来避免出现死锁。 9、BroadcastSystemMessage         我们一般所接触到的消息都是发送给窗口的 其实 消息的接收者可以是多种多样的它可以是应用程序(applications), 可安装驱动(installable drivers), 网络设备(network drivers), 系统级设备驱动(system-level device drivers)等  BroadcastSystemMessage这个API可以对以上系统组件发送消息。 10、消息的处理         接下来我们谈一下消息的处理首先我们来看一下VC中的消息泵 while(GetMessage(msg, NULL, 0, 0)) {        if(!TranslateAccelerator(msg.hWnd, hAccelTable, msg))  {              TranslateMessage(msg);             DispatchMessage(msg);        } } TranslateMessage(转换消息):         用来把虚拟键消息转换为字符消息。由于Windows对所有键盘编码都是采用虚拟键的定义这样当按键按下时并不得字符消息需要键盘映射转换为字符的消息。 TranslateMessage函数         用于将虚拟键消息转换为字符消息。字符消息被投递到调用线程的消息队列中当下一次调用GetMessage函数时被取出。当我们敲击键盘上的某个字符键时系统将产生WM_KEYDOWN和WM_KEYUP消息。这两个消息的附加参数wParam和lParam包含的是虚拟键代码和扫描码等信息而我们在程序中往往需要得到某个字符的ASCII码TranslateMessage这个函数就可以将WM_KEYDOWN和WM_ KEYUP消息的组合转换为一条WM_CHAR消息该消息的wParam附加参数包含了字符的ASCII码并将转换后的新消息投递到调用线程的消息队列中。注意TranslateMessage函数并不会修改原有的消息它只是产生新的消息并投递到消息队列中。 也就是说TranslateMessage会发现消息里是否有字符键的消息如果有字符键的消息就会产生WM_CHAR消息如果没有就会产生什么消息。 DispatchMessage分派消息: 把 TranslateMessage转换的消息发送到窗口的消息处理函数此函数在窗口注册时已经指定。         首先GetMessage从进程的主线程的消息队列中获取一个消息并将它复制到MSG结构如果队列中没有消息则GetMessage函数将等待一个消息的到来以后才返回。如果你将一个窗口句柄作为第二个参数传入GetMessage那么只有指定窗口的的消息可以从队列中获得。GetMessage也可以从消息队列中过滤消息只接受消息队列中落在范围内的消息。这时候就要利用GetMessagePeekMessage指定一个消息过滤器。这个过滤器是一个消息标识符的范围或者是一个窗体句柄或者两者同时指定。当应用程序要查找一个后入消息队列的消息是很有用。WM_KEYFIRST 和 WM_KEYLAST 常量用于接受所有的键盘消息。 WM_MOUSEFIRST 和 WM_MOUSELAST 常量用于接受所有的鼠标消息。 然后TranslateAccelerator判断该消息是不是一个按键消息并且是一个加速键消息如果是则该函数将把几个按键消息转换成一个加速键消息传递给窗口的回调函数。处理了加速键之后函数TranslateMessage将把两个按键消息WM_KEYDOWN和WM_KEYUP转换成一个 WM_CHAR不过需要注意的是消息WM_KEYDOWN,WM_KEYUP仍然将传递给窗口的回调函数。     处理完之后DispatchMessage函数将把此消息发送给该消息指定的窗口中已设定的回调函数。如果消息是WM_QUIT则 GetMessage返回0从而退出循环体。应用程序可以使用PostQuitMessage来结束自己的消息循环。通常在主窗口的 WM_DESTROY消息中调用。 11、MFC的消息映射          使用MFC编程时消息发送和处理的本质和Win32相同但是它对消息处理进行了封装简化了程序员编程时消息处理的复杂性它通过消息映射机制来处理消息程序员不必去设计和实现自己的窗口过程。 说白了MFC中的消息映射机制实质是一张巨大的消息及其处理函数对应表。消息映射基本上分为两大部分 在头文件(.h)中有一个宏DECLARE_MESSAGE_MAP(),它放在类的末尾是一个public属性的与之对应的是在实现部分(.cpp)增加了一个消息映射表内容如下 BEGIN_MASSAGE_MAP(当前类当前类的基类) //{{AFX_MSG_MAP(CMainFrame) 消息的入口项 //}}AFX_MSG_MAP END_MESSAGE_MAP() 但是仅是这两项还不足以完成一条消息要是一个消息工作必须还有以下3个部分去协作 1、在类的定义中加入相应的函数声明 2、在类的消息映射表中加入相应的消息映射入口项 3、在类的实现中加入相应的函数体 消息的添加 1、利用Class Wizard实现自动添加         在菜单中选择View -gt; Class Wizard激活Class Wizard选择Message Map标签从Class name组合框中选取我们想要添加消息的类。在Object IDs列表框中选取类的名称。此时Messages列表框显示该类的可重载成员函数和窗口消息。可重载成员函数显示在列表的上部以实际虚构成员函数的大小写字母来表示。其他为窗口消息以大写字母出现。选中我们要添加的消息单击Add Funtion按钮Class Wizard自动将该消息添加进来。 有时候我们想要添加的消息在Message列表中找不到我们可以利用Class Wizard上Class Info标签以扩展消息列表。在该页中找到Message Filter组合框通过它可以改变首页中Messages列表框中的选项。 2、手动添加消息  如果Messages列表框中确实没有我们想要的消息就需要我们手工添加         1在类的.h文件中添加处理函数的声明紧接着在//}}AFX_MSG行之后加入声明注意一定要以afx_msg开头。 通常添加处理函数声明的最好的地方是源代码中Class Wizard维护的表的下面在它标记其领域的{{ }}括弧外面。这些括弧中的任何东西都有可能会被Class Wizard销毁。         2接着在用户类的.cpp文件中找到//}}AFX_MSG_MAP行紧接在它之后加入消息入口项。同样也放在{{ }}外面。         3)最后在该文件中添加消息处理函数的实体。 对于能够使用Class Wizard添加的消息尽量使用Class Wizard添加以减少我们的工作量对于不能使用Class Wizard添加的消息和自定义消息需要手动添加。总体说来MFC的消息编程对用户来说相对比较简单在此不再使用实例演示。         12、消息反射机制 什么叫消息反射          父窗口将控件发给它的通知消息反射回控件进行处理即让控件处理这个消息这种通知消息让控件自己处理的机制叫做消息反射机制。         通过前面的学习我们知道一般情况下控件向父窗口发送通知消息由父窗口处理这些通知消息。这样父窗口通常是一个对话框会对这些消息进行处理换句话说控件的这些消息处理必须在父窗口类体内每当我们添加子控件的时候就要在父窗口类中复制这些代码。很明显这对代码的维护和移植带来了不便而且明显背离C的对象编程原则。         从4.0版开始MFC提供了一种消息反射机制(Message Reflection)可以把控件通知消息反射回控件。具体地讲对于反射消息如果控件有该消息的处理函数那么就由控件自己处理该消息如果控件不处理该消息则框架会把该消息继续送给父窗口这样父窗口继续处理该消息。可见新的消息反射机制并不破坏原来的通知消息处理机制。 消息反射机制为控件提供了处理通知消息的机会这是很有用的。如果按传统的方法由父窗口来处理这个消息则加重了控件对象对父窗口的依赖程度这显然违背了面向对象的原则。若由控件自己处理消息则使得控件对象具有更大的独立性大大方便了代码的维护和移植。         实例M8简单地演示MFC的消息反射机制。见附带源码 工程M8      开VC 6.0新建一个基于对话框的工程M8。 在该工程中新建一个CMyEdit类基类是CEdit。接着在该类中添加三个变量如下 private: CBrush m_brBkgnd; COLORREF m_clrBkgnd; COLORREF m_clrText; 在CMyEdit::CMyEdit()中给这三个变量赋初值 { m_clrBkgnd RGB( 255, 255, 0 ); m_clrText RGB( 0, 0, 0 ); m_brBkgnd.CreateSolidBrush(RGB( 150, 150, 150) ); } 打开ClassWizard类名为CMyEditMessages处选中“WM_CTLCOLOR”您是否发现WM_CTLCOLOR消息前面有一个等号它表示该消息是反射消息也就是说前面有等号的消息是可以反射的消息。 消息反射函数代码如下 HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor) {     // TODO: Change any attributes of the DC here     pDC-gt;SetTextColor( m_clrText );//设置文本颜色     pDC-gt;SetBkColor( m_clrBkgnd );//设置背景颜色      //请注意在我们改写该函数的内容前函数返回NULL即return NULL;     //函数返回NULL将会执行父窗口的CtlColor函数而不执行控件的CtlColor函数     //所以我们让函数返回背景刷而不返回NULL目的就是为了实现消息反射     return m_brBkgnd; //返回背景刷 } 在IDD_M8_DIALOG对话框中添加一个Edit控件使用ClassWizard给该Edit控件添加一个CMyEdit类型的变量m_edit1把Edit控件和CMyEdit关联起来。 林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka转载于:https://www.cnblogs.com/icooper/p/4574916.html
http://www.pierceye.com/news/180164/

相关文章:

  • 网站灰色 代码深圳的深圳的网站建设公司
  • 做电影采集网站需要多大vps安徽建设新工程信息网站
  • 中小企业网站制作化工厂网站建设
  • 电子政务网站建设出版社百度网页提交入口
  • 专业柳州网站建设哪家便宜淄博桓台网站建设定制
  • 网站建设投标标书企业网站建设销售前景
  • wordpress建站教程凌风wordpress 仪表盘 慢
  • 怎样给网站或者商品做推广关于建网站新闻
  • 上海 微信网站 建站一对一直播app
  • ppt模板免费下载网站哪个好克拉玛依市住房和建设局网站
  • 制作网站得多少钱交互设计留学
  • 理财网站免费建设经典重庆新闻论坛
  • 南京专业网站制作哪家好企业所得税交多少
  • 广西网站建设哪家好常熟做网站的
  • 礼品网站制作辽宁省建设部网站
  • 网站群的建设目标澧县网页设计
  • 邯郸网站建设在哪里网站建设yingkagou
  • 姜堰区网站建设企业公司网站制作
  • 目前做的比较好的法律网站有哪些兰州seo技术优化排名公司
  • wordpress网站接入qqwordpress调用二级分类目录
  • 自建站有哪些站点soho 网站建设
  • cms网站建设如果在网上接网站建设项目
  • 建设网站的重点与难点在于社区网站模版
  • 自己在线制作logo免费网站公司网页设计教程
  • 广西城乡建设网站一家企业如何做网站推广
  • 小程序可以做网站吗wordpress 活动插件
  • 深圳网站建设流程图货代网站制作
  • 建设一个网站需要什么技术人员在线音乐网站开发
  • 做现货黄金看什么网站网络服务商怎么查询
  • 英语作文网站紫色个人网站模板