VC中WM_CLOSE、WM_DESTROY、WM_QUIT消息出现顺序及调用方式

合集下载

VC定义全局变量和消息机制

VC定义全局变量和消息机制

全局变量一般这样定义:1。

在一类的.cpp中定义int myInt;然后再在要用到的地方的.cpp里extern int myInt;这样就可以用了。

2。

在stdafx.cpp中加入:int myInt;然后在stdafx.h中加入:extern int myInt这样定义以后无论在什么文件中都是可见的.3。

比较规范的是,先定义一个Glbs.h,把所有的全局变量原始定义放进去。

然后定义一个Externs.h,把你先前定义在Glbs.h中的变量都加上extern。

注意:如果你在Glbs.h中设置了初值,那么在Externs.h中就不要加值了。

然后调用时,第一次调用的#i nclude <Glbs.h>,以后调用的#i nclude <Externs.h>另:问:如何在VC++中使用全局变量,以使文档中的所有类都能访问。

答:把该变量放到该应用程序类的头文件中的attribute处。

然后,在程序的任何地方,你都可以用下面的方法来访问该变量:CMyApp *app=(CMyApp*)AfxGet-App();app->MyGlobalVariable=…用这个方法,不但可以定义全局变量,也可以定义全局对象。

例如:MyClass MyObject;CMyApp*app=(CMyApp*)AfxGet-App();app->MyObject.MyFunction();VC中使用全局变量的2种办法及防错措施1. 对于全局变量存在和函数一样的问题,为了在其他CPP文件中能够访问这些变量,必须在主文件的H 文件中加上extern声明,格式如下:extern varibletype var; (声明)在主文件的CPP文件中定义varibletype var; (定义)例子:AppWizard建立一个Test工程那么在Test.h中声明extern CString cs;在Test.app定义CString cs;如果要定义整个工程的全局变量,在任何一个CPP 文件中进行定义,然后在需要引用这个变量的文件中进行声明。

VC6.0 显示,关闭,销毁模态与非模态对话框技巧

VC6.0 显示,关闭,销毁模态与非模态对话框技巧

VC6.0 显示,关闭,销毁模态与非模态对话框技巧一、显示对话框:1.显示模式对话框:CDialogDemo dlg;dlg.DoModal();2.显示非模式对话框:CDialogDemo *dlg=new CDialogDemo(this);dlg->Create(IDD_GENERAL_CONTROL);dlg->ShowWindow(SW_SHOW);二、关闭对话框:1.CDialog::OnOK();2.CDialog::DestoryWindow();3.CDialog::EndDialog(0);注:CDialog::CloseWindow(); 仅仅是最小化对话框PostMessage(WM_CLOSE)相关函数详解:CloseWindow函数功能:该函数最小化指定的窗口,但并不销毁该窗口。

函数原型:BOOL CloseWindow(HWND hWnd);参数:hWnd:将要最小化的窗口的句柄。

返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。

若想获得更多错误信息,请调用GetLastError函数。

备注:窗口尺寸被最小化成一个图标,并移动到屏幕的图标区域。

系统显示窗口的图标而不显示窗口,并在图标下显示窗口标题。

应用程序必须使用DestroyWindow函数销毁窗口。

DestroyWindow函数功能:销毁指定的窗口。

这个函数通过发送WM_DESTROY 消息和WM_NCDESTROY 消息使窗口无效并移除其键盘焦点。

这个函数还销毁窗口的菜单,清空线程的消息队列,销毁与窗口过程相关的定时器,解除窗口对剪贴板的拥有权,打断剪贴板器的查看链。

函数原型:BOOL DestroyWindow( HWND hWnd // handle to window to destroy);hWnd :将被销毁的窗口的句柄。

返回值:如果函数成功,返回值为非零:如果函数失败,返回值为零。

WM_CLOSE、WM_DESTROY、WM_QUIT及各种消息投递函数详解

WM_CLOSE、WM_DESTROY、WM_QUIT及各种消息投递函数详解

WM_CLOSE、WM_DESTROY、WM_QUIT及各种消息投递函数详解本⽂对WM_CLOSE、WM_DESTROY、WM_QUIT及各种消息投递函数的功能及区别做出了分析⽐对,有助于读者更好的对消息投递函数加以理解。

详情如下:⼀、WM_CLOSE、WM_DESTROY、WM_QUIT区别WM_CLOSE:关闭应⽤程序窗⼝WM_DESTROY:关闭应⽤程序WM_QUIT:关闭消息循环只有关闭了消息循环,应⽤程序的进程才真正退出(在任务管理器⾥消失)。

win32应⽤程序的完整退出过程:点击窗⼝右上⾓的关闭按钮,发送WM_CLOSE消息。

此消息处理中调⽤DestroyWindow函数,发送WM_DESTROY消息。

此消息处理中调⽤PostQuitMessage(0)函数,发送WM_QUIT消息到消息队列中。

GetMessage捕获到WM_QUIT,返回0,退出循环(应⽤程序真正退出)。

注意:按照上述正常流程,WM_QUIT是不会到达窗⼝过程的。

(因为在GetMessage截获了WM_QUIT消息之后,程序已经彻底退出了!)MFC应⽤程序的完整退出过程:点击窗⼝右上⾓的关闭按钮,或选择【File/Close】,发出 WM_CLOSE消息。

CMyFrameWnd 并没有设置WM_CLOSE 处理常式,于是交给预设之处理常式。

预设函数对于WM_CLOSE 的处理⽅式是呼叫 ::DestroyWindow,并因⽽发出WM_DESTROY。

预设之WM_DESTROY 处理⽅式是呼叫::PostQuitMessage,因此发出WM_QUIT。

CWinApp::Run 收到WM_QUIT 后会结束其内部之讯息回路,然后呼叫ExitInstance,这是CWinApp 的⼀个虚拟函数。

如果⾃⼰应⽤程序类CMyWinApp 改写了ExitInstance ,那么CWinApp::Run 所呼叫的就是CMyWinApp::ExitInstance,否则就是 CWinApp::ExitInstance。

[word文档] VC++中的所有WM消息

[word文档] VC++中的所有WM消息

/zh-cn/library/570c36k2%28v=VS.80%29.aspx请查阅MSDN中WM_ Messages的解释windows消息WM_ WM (window message)WM_NULL = $0000;WM_CREA TE = $0001;应用程序创建一个窗口WM_DESTROY = $0002;一个窗口被销毁WM_MOVE = $0003;移动一个窗口WM_SIZE = $0005;改变一个窗口的大小WM_ACTIV A TE = $0006;一个窗口被激活或失去激活状态;WM_SETFOCUS = $0007;获得焦点后WM_KILLFOCUS = $0008;失去焦点WM_ENABLE = $000A;改变enable状态WM_SETREDRA W = $000B;设置窗口是否能重画WM_SETTEXT = $000C;应用程序发送此消息来设置一个窗口的文本WM_GETTEXT = $000D;应用程序发送此消息来复制对应窗口的文本到缓冲区WM_GETTEXTLENGTH = $000E;得到与一个窗口有关的文本的长度(不包含空字符)WM_PAINT = $000F;要求一个窗口重画自己WM_CLOSE = $0010;当一个窗口或应用程序要关闭时发送一个信号WM_QUERYENDSESSION = $0011;当用户选择结束对话框或程序自己调用ExitWindows函数WM_QUIT = $0012;用来结束程序运行或当程序调用postquitmessage函数WM_QUERYOPEN = $0013;当用户窗口恢复以前的大小位置时,把此消息发送给某个图标WM_ERASEBKGND = $0014;当窗口背景必须被擦除时(例在窗口改变大小时)WM_SYSCOLORCHANGE = $0015;当系统颜色改变时,发送此消息给所有顶级窗口WM_ENDSESSION = $0016;当系统进程发出WM_QUERYENDSESSION消息后,此消息发送给应用程序,通知它对话是否结束WM_SYSTEMERROR = $0017;WM_SHOWWINDOW = $0018;当隐藏或显示窗口是发送此消息给这个窗口WM_ACTIV A TEAPP = $001C;发此消息给应用程序哪个窗口是激活的,哪个是非激活的;WM_FONTCHANGE = $001D;当系统的字体资源库变化时发送此消息给所有顶级窗口WM_TIMECHANGE = $001E;当系统的时间变化时发送此消息给所有顶级窗口WM_CANCELMODE = $001F;发送此消息来取消某种正在进行的摸态(操作)WM_SETCURSOR = $0020;如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口WM_MOUSEACTIV A TE = $0021;当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口WM_CHILDACTIV A TE = $0022;发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小WM_QUEUESYNC = $0023;此消息由基于计算机的训练程序发送,通过WH_JOURNALPALYBACK的hook程序分离出用户输入消息WM_GETMINMAXINFO = $0024;此消息发送给窗口当它将要改变大小或位置;WM_PAINTICON = $0026;发送给最小化窗口当它图标将要被重画WM_ICONERASEBKGND = $0027;此消息发送给某个最小化窗口,仅当它在画图标前它的背景必须被重画WM_NEXTDLGCTL = $0028;发送此消息给一个对话框程序去更改焦点位置WM_SPOOLERSTA TUS = $002A;每当打印管理列队增加或减少一条作业时发出此消息WM_DRA WITEM = $002B;当button,combobox,listbox,menu的可视外观改变时发送此消息给这些空件的所有者WM_MEASUREITEM = $002C;当button, combo box, list box, list view control, or menu item 被创建时发送此消息给控件的所有者WM_DELETEITEM = $002D;当the list box 或combo box 被销毁或当某些项被删除通过LB_DELETESTRING, LB_RESETCONTENT, CB_DELETESTRING, orCB_RESETCONTENT 消息WM_VKEYTOITEM = $002E;此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息WM_CHARTOITEM = $002F;此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息WM_SETFONT = $0030;当绘制文本时程序发送此消息得到控件要用的颜色WM_GETFONT = $0031;应用程序发送此消息得到当前控件绘制文本的字体WM_SETHOTKEY = $0032;应用程序发送此消息让一个窗口与一个热键相关连WM_GETHOTKEY = $0033;应用程序发送此消息来判断热键与某个窗口是否有关联WM_QUERYDRAGICON = $0037;此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,应用程序能返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标WM_COMPAREITEM = $0039;发送此消息来判定combobox或listbox新增加的项的相对位置WM_GETOBJECT = $003D;WM_COMPACTING = $0041;显示内存已经很少了WM_WINDOWPOSCHANGING = $0046;发送此消息给那个窗口的大小和位置将要被改变时,来调用setwindowpos函数或其它窗口管理函数WM_WINDOWPOSCHANGED = $0047;发送此消息给那个窗口的大小和位置已经被改变时,来调用setwindowpos函数或其它窗口管理函数WM_POWER = $0048;(适用于16位的windows)当系统将要进入暂停状态时发送此消息WM_COPYDA TA = $004A;当一个应用程序传递数据给另一个应用程序时发送此消息WM_CANCELJOURNAL = $004B;当某个用户取消程序日志激活状态,提交此消息给程序WM_NOTIFY = $004E;当某个控件的某个事件已经发生或这个控件需要得到一些信息时,发送此消息给它的父窗口WM_INPUTLANGCHANGEREQUEST = $0050;当用户选择某种输入语言,或输入语言的热键改变WM_INPUTLANGCHANGE = $0051;当平台现场已经被改变后发送此消息给受影响的最顶级窗口WM_TCARD = $0052;当程序已经初始化windows帮助例程时发送此消息给应用程序WM_HELP = $0053;此消息显示用户按下了F1,如果某个菜单是激活的,就发送此消息个此窗口关联的菜单,否则就发送给有焦点的窗口,如果当前都没有焦点,就把此消息发送给当前激活的窗口WM_USERCHANGED = $0054;当用户已经登入或退出后发送此消息给所有的窗口,当用户登入或退出时系统更新用户的具体设置信息,在用户更新设置时系统马上发送此消息;WM_NOTIFYFORMA T = $0055;公用控件,自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是UNICODE 结构在WM_NOTIFY消息,使用此控件能使某个控件与它的父控件之间进行相互通信WM_CONTEXTMENU = $007B;当用户某个窗口中点击了一下右键就发送此消息给这个窗口WM_STYLECHANGING = $007C;当调用SETWINDOWLONG函数将要改变一个或多个窗口的风格时发送此消息给那个窗口WM_STYLECHANGED = $007D;当调用SETWINDOWLONG函数一个或多个窗口的风格后发送此消息给那个窗口WM_DISPLAYCHANGE = $007E;当显示器的分辨率改变后发送此消息给所有的窗口WM_GETICON = $007F;此消息发送给某个窗口来返回与某个窗口有关连的大图标或小图标的句柄;WM_SETICON = $0080;程序发送此消息让一个新的大图标或小图标与某个窗口关联;WM_NCCREA TE = $0081;当某个窗口第一次被创建时,此消息在WM_CREA TE消息发送前发送;WM_NCDESTROY = $0082;此消息通知某个窗口,非客户区正在销毁WM_NCCALCSIZE = $0083;当某个窗口的客户区域必须被核算时发送此消息WM_NCHITTEST = $0084;//移动鼠标,按住或释放鼠标时发生WM_NCPAINT = $0085;程序发送此消息给某个窗口当它(窗口)的框架必须被绘制时;WM_NCACTIV A TE = $0086;此消息发送给某个窗口仅当它的非客户区需要被改变来显示是激活还是非激活状态;WM_GETDLGCODE = $0087;发送此消息给某个与对话框程序关联的控件,widdows控制方位键和TAB键使输入进入此控件通过响应WM_GETDLGCODE消息,应用程序可以把他当成一个特殊的输入控件并能处理它WM_NCMOUSEMOVE = $00A0;当光标在一个窗口的非客户区内移动时发送此消息给这个窗口//非客户区为:窗体的标题栏及窗的边框体WM_NCLBUTTONDOWN = $00A1;当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息WM_NCLBUTTONUP = $00A2;当用户释放鼠标左键同时光标某个窗口在非客户区十发送此消息;WM_NCLBUTTONDBLCLK = $00A3;当用户双击鼠标左键同时光标某个窗口在非客户区十发送此消息WM_NCRBUTTONDOWN = $00A4;当用户按下鼠标右键同时光标又在窗口的非客户区时发送此消息WM_NCRBUTTONUP = $00A5;当用户释放鼠标右键同时光标又在窗口的非客户区时发送此消息1 windows消息大全三WM_NCLBUTTONDOWN = $00A1;当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息WM_NCLBUTTONUP = $00A2;当用户释放鼠标左键同时光标某个窗口在非客户区十发送此消息;WM_NCLBUTTONDBLCLK = $00A3;当用户双击鼠标左键同时光标某个窗口在非客户区十发送此消息WM_NCRBUTTONDOWN = $00A4;当用户按下鼠标右键同时光标又在窗口的非客户区时发送此消息WM_NCRBUTTONUP = $00A5;当用户释放鼠标右键同时光标又在窗口的非客户区时发送此消息WM_NCRBUTTONDBLCLK = $00A6;当用户双击鼠标右键同时光标某个窗口在非客户区十发送此消息WM_NCMBUTTONDOWN = $00A7;当用户按下鼠标中键同时光标又在窗口的非客户区时发送此消息WM_NCMBUTTONUP = $00A8;当用户释放鼠标中键同时光标又在窗口的非客户区时发送此消息WM_NCMBUTTONDBLCLK = $00A9;当用户双击鼠标中键同时光标又在窗口的非客户区时发送此消息WM_KEYFIRST = $0100;WM_KEYDOWN = $0100;//按下一个键WM_KEYUP = $0101;//释放一个键WM_CHAR = $0102;//按下某键,并已发出WM_KEYDOWN,WM_KEYUP消息WM_DEADCHAR = $0103;当用translatemessage函数翻译WM_KEYUP消息时发送此消息给拥有焦点的窗口WM_SYSKEYDOWN = $0104;当用户按住ALT键同时按下其它键时提交此消息给拥有焦点的窗口;WM_SYSKEYUP = $0105;当用户释放一个键同时ALT 键还按着时提交此消息给拥有焦点的窗口WM_SYSCHAR = $0106;当WM_SYSKEYDOWN消息被TRANSLA TEMESSAGE函数翻译后提交此消息给拥有焦点的窗口WM_SYSDEADCHAR = $0107;当WM_SYSKEYDOWN消息被TRANSLA TEMESSAGE函数翻译后发送此消息给拥有焦点的窗口WM_KEYLAST = $0108;WM_INITDIALOG = $0110;在一个对话框程序被显示前发送此消息给它,通常用此消息初始化控件和执行其它任务WM_COMMAND = $0111;当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个快捷键被翻译WM_SYSCOMMAND = $0112;当用户选择窗口菜单的一条命令或当用户选择最大化或最小化时那个窗口会收到此消息WM_TIMER = $0113; //发生了定时器事件WM_HSCROLL = $0114;当一个窗口标准水平滚动条产生一个滚动事件时发送此消息给那个窗口,也发送给拥有它的控件WM_VSCROLL = $0115;当一个窗口标准垂直滚动条产生一个滚动事件时发送此消息给那个窗口也,发送给拥有它的控件WM_INITMENU = $0116;当一个菜单将要被激活时发送此消息,它发生在用户菜单条中的某项或按下某个菜单键,它允许程序在显示前更改菜单WM_INITMENUPOPUP = $0117;当一个下拉菜单或子菜单将要被激活时发送此消息,它允许程序在它显示前更改菜单,而不要改变全部WM_MENUSELECT = $011F;当用户选择一条菜单项时发送此消息给菜单的所有者(一般是窗口)WM_MENUCHAR = $0120;当菜单已被激活用户按下了某个键(不同于加速键),发送此消息给菜单的所有者;WM_ENTERIDLE = $0121;当一个模态对话框或菜单进入空载状态时发送此消息给它的所有者,一个模态对话框或菜单进入空载状态就是在处理完一条或几条先前的消息后没有消息它的列队中等待WM_MENURBUTTONUP = $0122;WM_MENUDRAG = $0123;WM_MENUGETOBJECT = $0124;WM_UNINITMENUPOPUP = $0125;WM_MENUCOMMAND = $0126;2 windows消息大全三WM_CHANGEUISTA TE = $0127;WM_UPDA TEUISTA TE = $0128;WM_QUERYUISTA TE = $0129;WM_CTLCOLORMSGBOX = $0132;在windows绘制消息框前发送此消息给消息框的所有者窗口,通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色WM_CTLCOLOREDIT = $0133;当一个编辑型控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置编辑框的文本和背景颜色WM_CTLCOLORLISTBOX = $0134;当一个列表框控件将要被绘制前发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置列表框的文本和背景颜色WM_CTLCOLORBTN = $0135;当一个按钮控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置按纽的文本和背景颜色WM_CTLCOLORDLG = $0136;当一个对话框控件将要被绘制前发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置对话框的文本背景颜色WM_CTLCOLORSCROLLBAR= $0137;当一个滚动条控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置滚动条的背景颜色WM_CTLCOLORSTA TIC = $0138;当一个静态控件将要被绘制时发送此消息给它的父窗口;通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置静态控件的文本和背景颜色WM_MOUSEFIRST = $0200;WM_MOUSEMOVE = $0200;// 移动鼠标WM_LBUTTONDOWN = $0201;//按下鼠标左键WM_LBUTTONUP = $0202;//释放鼠标左键WM_LBUTTONDBLCLK = $0203;//双击鼠标左键WM_RBUTTONDOWN = $0204;//按下鼠标右键WM_RBUTTONUP = $0205;//释放鼠标右键WM_RBUTTONDBLCLK = $0206;//双击鼠标右键WM_MBUTTONDOWN = $0207;//按下鼠标中键WM_MBUTTONUP = $0208;//释放鼠标中键WM_MBUTTONDBLCLK = $0209;//双击鼠标中键WM_MOUSEWHEEL = $020A;当鼠标轮子转动时发送此消息个当前有焦点的控件WM_MOUSELAST = $020A;WM_PARENTNOTIFY = $0210;当MDI子窗口被创建或被销毁,或用户按了一下鼠标键而光标在子窗口上时发送此消息给它的父窗口WM_IME_STARTCOMPOSITION = $010D;WM_IME_ENDCOMPOSITION = $010E;WM_IME_COMPOSITION = $010F;WM_IME_KEYLAST = $010F;WM_IME_SETCONTEXT = $0281;WM_IME_NOTIFY = $0282;WM_IME_CONTROL = $0283;WM_IME_COMPOSITIONFULL = $0284;WM_IME_SELECT = $0285;WM_IME_CHAR = $0286;WM_IME_REQUEST = $0288;WM_IME_KEYDOWN = $0290;WM_IME_KEYUP = $0291;WM_MDICREA TE = $0220;应用程序发送此消息给多文档的客户窗口来创建一个MDI 子窗口WM_MDIDESTROY = $0221;应用程序发送此消息给多文档的客户窗口来关闭一个MDI 子窗口WM_MDIACTIV A TE = $0222;应用程序发送此消息给多文档的客户窗口通知客户窗口激活另一个MDI子窗口,当客户窗口收到此消息后,它发出WM_MDIACTIVE消息给MDI子窗口(未激活)激活它;WM_MDIRESTORE = $0223;程序发送此消息给MDI客户窗口让子窗口从最大最小化恢复到原来大小WM_MDINEXT = $0224;程序发送此消息给MDI客户窗口激活下一个或前一个窗口WM_MDIMAXIMIZE = $0225;程序发送此消息给MDI客户窗口来最大化一个MDI子窗口;WM_MDITILE = $0226;程序发送此消息给MDI客户窗口以平铺方式重新排列所有MDI子窗口WM_MDICASCADE = $0227;程序发送此消息给MDI客户窗口以层叠方式重新排列所有MDI子窗口WM_MDIICONARRANGE = $0228;程序发送此消息给MDI客户窗口重新排列所有最小化的MDI子窗口WM_MDIGETACTIVE = $0229;程序发送此消息给MDI客户窗口来找到激活的子窗口的句柄WM_MDISETMENU = $0230;程序发送此消息给MDI客户窗口用MDI菜单代替子窗口的菜单WM_ENTERSIZEMOVE = $0231;WM_EXITSIZEMOVE = $0232;WM_DROPFILES = $0233;WM_MDIREFRESHMENU = $0234;WM_MOUSEHOVER = $02A1;WM_MOUSELEA VE = $02A3;WM_CUT = $0300;程序发送此消息给一个编辑框或combobox来删除当前选择的文本WM_COPY = $0301;程序发送此消息给一个编辑框或combobox来复制当前选择的文本到剪贴板WM_PASTE = $0302;程序发送此消息给editcontrol或combobox从剪贴板中得到数据WM_CLEAR = $0303;程序发送此消息给editcontrol或combobox清除当前选择的内容;WM_UNDO = $0304;程序发送此消息给editcontrol或combobox撤消最后一次操作WM_RENDERFORMA T = $0305;WM_RENDERALLFORMA TS = $0306;WM_DESTROYCLIPBOARD = $0307;当调用ENPTYCLIPBOARD函数时发送此消息给剪贴板的所有者WM_DRA WCLIPBOARD = $0308;当剪贴板的内容变化时发送此消息给剪贴板观察链的第一个窗口;它允许用剪贴板观察窗口来显示剪贴板的新内容;WM_PAINTCLIPBOARD = $0309;当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区需要重画;WM_VSCROLLCLIPBOARD = $030A;WM_SIZECLIPBOARD = $030B;当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区域的大小已经改变是此消息通过剪贴板观察窗口发送给剪贴板的所有者;WM_ASKCBFORMA TNAME = $030C;通过剪贴板观察窗口发送此消息给剪贴板的所有者来请求一个CF_OWNERDISPLAY格式的剪贴板的名字WM_CHANGECBCHAIN = $030D;当一个窗口从剪贴板观察链中移去时发送此消息给剪贴板观察链的第一个窗口;WM_HSCROLLCLIPBOARD = $030E;此消息通过一个剪贴板观察窗口发送给剪贴板的所有者;它发生在当剪贴板包含CFOWNERDISPALY格式的数据并且有个事件在剪贴板观察窗的水平滚动条上;所有者应滚动剪贴板图象并更新滚动条的值;WM_QUERYNEWPALETTE = $030F;此消息发送给将要收到焦点的窗口,此消息能使窗口在收到焦点时同时有机会实现他的逻辑调色板WM_PALETTEISCHANGING= $0310;当一个应用程序正要实现它的逻辑调色板时发此消息通知所有的应用程序WM_PALETTECHANGED = $0311;此消息在一个拥有焦点的窗口实现它的逻辑调色板后发送此消息给所有顶级并重叠的窗口,以此来改变系统调色板WM_HOTKEY = $0312;当用户按下由REGISTERHOTKEY函数注册的热键时提交此消息WM_PRINT = 791;应用程序发送此消息仅当WINDOWS或其它应用程序发出一个请求要求绘制一个应用程序的一部分;WM_PRINTCLIENT = 792;WM_HANDHELDFIRST = 856;WM_HANDHELDLAST = 863;WM_PENWINFIRST = $0380;WM_PENWINLAST = $038F;WM_COALESCE_FIRST = $0390;WM_COALESCE_LAST = $039F;WM_DDE_FIRST = $03E0;WM_DDE_INITIA TE = WM_DDE_FIRST + 0;一个DDE客户程序提交此消息开始一个与服务器程序的会话来响应那个指定的程序和主题名;WM_DDE_TERMINA TE = WM_DDE_FIRST + 1;一个DDE应用程序(无论是客户还是服务器)提交此消息来终止一个会话;WM_DDE_ADVISE = WM_DDE_FIRST + 2;一个DDE客户程序提交此消息给一个DDE服务程序来请求服务器每当数据项改变时更新它WM_DDE_UNADVISE = WM_DDE_FIRST + 3;一个DDE客户程序通过此消息通知一个DDE服务程序不更新指定的项或一个特殊的剪贴板格式的项WM_DDE_ACK = WM_DDE_FIRST + 4;此消息通知一个DDE(动态数据交换)程序已收到并正在处理WM_DDE_POKE, WM_DDE_EXECUTE, WM_DDE_DA TA, WM_DDE_ADVISE,WM_DDE_UNADVISE, or WM_DDE_INITIA T消息WM_DDE_DA TA = WM_DDE_FIRST + 5;一个DDE服务程序提交此消息给DDE客户程序来传递个一数据项给客户或通知客户的一条可用数据项WM_DDE_REQUEST = WM_DDE_FIRST + 6;一个DDE客户程序提交此消息给一个DDE服务程序来请求一个数据项的值;WM_DDE_POKE = WM_DDE_FIRST + 7;一个DDE客户程序提交此消息给一个DDE服务程序,客户使用此消息来请求服务器接收一个未经同意的数据项;服务器通过答复WM_DDE_ACK消息提示是否它接收这个数据项;WM_DDE_EXECUTE = WM_DDE_FIRST + 8;一个DDE客户程序提交此消息给一个DDE服务程序来发送一个字符串给服务器让它象串行命令一样被处理,服务器通过提交WM_DDE_ACK消息来作回应;WM_DDE_LAST = WM_DDE_FIRST + 8;WM_APP = $8000;WM_USER = $0400;此消息能帮助应用程序自定义私有消息;/////////////////////////////////////////////////////////////////////通知消息(Notification message)是指这样一种消息,一个窗口内的子控件发生了一些事情,需要通知父窗口。

VC中WM_CREATE、WM_INITDIALOG消息出现顺序及调用方式

VC中WM_CREATE、WM_INITDIALOG消息出现顺序及调用方式

VC中WM_CREATE、WM_INITDIALOG消息出现顺序及调用方式wxleasyland@2012.7wxleasyland试验:VC建的标准WIN32-HELLO WORLD程序中:1.在CreateWindow()前面加上语句WinExec("cmd /k echo now call CreateWindow()",SW_SHOW); Sleep(5000);2.在CreateWindow()后面加上语句WinExec("cmd /k echo CreateWindow() RETURN",SW_SHOW);3.在WndProc()中加上case WM_CREATE:WinExec("cmd /k echo WndProc(): WM_CREATE: appear!",SW_SHOW);Sleep(5000);break;4.运行,发现,先出现now call CreateWindow()、再WndProc(): WM_CREATE: appear!、最后CreateWindow() RETURN。

结论:CreateWindow()是在运行后、返回前,发送消息WM_CREATE,并阻塞!WM_CREATE消息直接发给消息处理函数WndProc()执行!而不是通过消息队列(GetMessage、DispatchMessage等)!!其实就是CreateWindow()直接拿消息WM_CREATE去调用WndProc()!!!!!如果WndProc()返回0,CreateWindow()正常返回hWnd。

如果WndProc()返回-1,CreateWindow()销毁窗口,并返回NULL。

所以WM_CREATE时,CreateWindow()内部已经创建好窗口了,但还没有返回,还没有hWnd!即窗口真正还没有创建结束。

这时这里不能有对窗口上的控件操作的函数,不然就会“程序执行了非法操作”。

MFC程序中消息以及函数的处理顺序简介

MFC程序中消息以及函数的处理顺序简介

MFC程序中消息以及函数的处理顺序简介MFC应用程序中处理消息的顺序1.AfxWndProc()该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc2.AfxCallWndProc() 该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数3.WindowProc()该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数4.OnWndMsg()该函数的功能首先按字节对消息进行排序,对于WM_COMMAND消息,调用OnCommand()消息响应函数,对于WM_NOTIFY消息调用OnNotify()消息响应函数。

任何被遗漏的消息将是一个窗口消息。

OnWndMsg()函数搜索类的消息映像,以找到一个能处理任何窗口消息的处理函数。

如果OnWndMsg()函数不能找到这样的处理函数的话,则把消息返回到WindowProc()函数,由它将消息发送给DefWindowProc()函数5.OnCommand()该函数查看这是不是一个控件通知(lParam参数不为NULL,如果lParam参数为空的话,说明该消息不是控件通知),如果它是,OnCommand()函数会试图将消息映射到制造通知的控件;如果他不是一个控件通知(或者如果控件拒绝映射的消息)OnCommand()就会调用OnCmdMsg()函数6.OnCmdMsg()根据接收消息的类,OnCmdMsg()函数将在一个称为命令传递(Command Routing)的过程中潜在的传递命令消息和控件通知。

例如:如果拥有该窗口的类是一个框架类,则命令和通知消息也被传递到视图和文档类,并为该类寻找一个消息处理函数MFC应用程序创建窗口的过程1.PreCreateWindow()该函数是一个重载函数,在窗口被创建前,可以在该重载函数中改变创建参数(可以设置窗口风格等等)2.PreSubclassWindow() 这也是一个重载函数,允许首先子分类一个窗口3.OnGetMinMaxInfo()该函数为消息响应函数,响应的是WM_GETMINMAXINFO消息,允许设置窗口的最大或者最小尺寸4.OnNcCreate()该函数也是一个消息响应函数,响应WM_NCCREATE消息,发送消息以告诉窗口的客户区即将被创建5.OnNcCalcSize()该函数也是消息响应函数,响应WM_NCCALCSIZE消息,作用是允许改变窗口客户区大小6.OnCreate()该函数也是一个消息响应函数,响应WM_CREATE消息,发送消息告诉一个窗口已经被创建7.OnSize()该函数也是一个消息响应函数,响应WM_SIZE消息,发送该消息以告诉该窗口大小已经发生变化8.OnMove()消息响应函数,响应WM_MOVE消息,发送此消息说明窗口在移动9.OnChildNotify()该函数为重载函数,作为部分消息映射被调用,告诉父窗口即将被告知一个窗口刚刚被创建MFC应用程序关闭窗口的顺序(非模态窗口)1.OnClose()消息响应函数,响应窗口的WM_CLOSE消息,当关闭按钮被单击的时候发送此消息2.OnDestroy()消息响应函数,响应窗口的WM_DESTROY消息,当一个窗口将被销毁时,发送此消息3.OnNcDestroy()消息响应函数,响应窗口的WM_NCDESTROY消息,当一个窗口被销毁后发送此消息4.PostNcDestroy() 重载函数,作为处理OnNcDestroy()函数的最后动作,被CWnd调用MFC应用程序中打开模式对话框的函数调用顺序1.DoModal()重载函数,重载DoModal()成员函数2.PreSubclassWindow()重载函数,允许首先子分类一个窗口3.OnCreate()消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建4.OnSize()消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化5.OnMove()消息响应函数,响应WM_MOVE消息,发送此消息,以告诉窗口正在移动6.OnSetFont()消息响应函数,响应WM_SETFONT消息,发送此消息,以允许改变对话框中控件的字体7.OnInitDialog()消息响应函数,响应WM_INITDIALOG消息,发送此消息以允许初始化对话框中的控件,或者是创建新控件8.OnShowWindow()消息响应函数,响应WM_SHOWWINDOW消息,该函数被ShowWindow()函数调用9.OnCtlColor()消息响应函数,响应WM_CTLCOLOR消息,被父窗口发送已改变对话框或对话框上面控件的颜色10. OnChildNotify()重载函数,作为WM_CTLCOLOR消息的结果发送MFC应用程序中关闭模式对话框的顺序1.OnClose()消息响应函数,响应WM_CLOSE消息,当"关闭"按钮被单击的时候,该函数被调用2.OnKillFocus()消息响应函数,响应WM_KILLFOCUS消息,当一个窗口即将失去键盘输入焦点以前被发送3.OnDestroy()消息响应函数,响应WM_DESTROY消息,当一个窗口即将被销毁时,被发送4.OnNcDestroy()消息响应函数,响应WM_NCDESTROY消息,当一个窗口被销毁以后被发送5.PostNcDestroy() 重载函数,作为处理OnNcDestroy()函数的最后动作被CWnd调用打开无模式对话框的顺序1.PreSubclassWindow()重载函数,允许用户首先子分类一个窗口2.OnCreate()消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建3.OnSize()消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化4.OnMove()消息响应函数,响应WM_MOVE消息,发送此消息以告诉窗口正在移动5.OnSetFont()消息响应函数,响应WM_SETFONT消息,发送此消息以允许改变对话框中控件的字体。

OnClose和OnDestroy()

OnClose和OnDestroy()

OnClose()和OnDestroy()
OnClose():消息响应函数,响应WM_CLOSE消息,当"关闭"按钮被单击的时候(而不是我们眼睛所见的对话框从屏幕上消失时),该函数被调用,用户在响应OnOk()或者OnCancel()函数之后,不会发送WM_CLOSE消息
OnDestroy():消息响应函数,响应WM_DESTROY消息,当一个窗口即将被销毁时,被发送
在单视图程序中,根据<<深入浅出MFC>>所讲,程序退出时执行的操作顺序为
(1)用户点击退出按钮,发送了WM_CLOSE消息
(2)在WM_CLOSE消息的处理函数中,调用DestroyWindow()
(3)在DestroyWindow()中发送了WM_DESTROY消息
(4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUIT消息,结束消息循环
综上,程序先调用OnClose()(也可能不调用),然后调用OnDestroy()(必调用),所以,如果要进行程序结束时的清理工作,应该在OnDestroy()中,而不是在OnClose(),否则就有可能会出现内存泄漏的危险了!。

VC显示关闭销毁模态与非模态对话框技巧

VC显示关闭销毁模态与非模态对话框技巧

VC显示关闭销毁模态与非模态对话框技巧VC++是一种用于Windows平台开发应用程序的集成开发环境,用于构建图形用户界面和控制应用程序的行为。

在VC++中,对话框是一种常用的用户界面元素,可以用于显示和获取用户输入。

在使用对话框时,要注意对话框的显示、关闭和销毁。

1.显示对话框在VC++中,显示一个对话框可以通过以下几种方式实现:a. 使用DoModal函数DoModal函数是CDialog类的一个成员函数,用于显示对话框,并返回对话框的返回值。

例如,可以使用下面的代码显示一个对话框:CMyDialog dlg;dlg.DoModal(;b. 使用Create函数Create函数是CDialog类的另一个成员函数,用于创建对话框,并显示它。

使用Create函数时,需要先调用Create函数创建对话框,然后调用ShowWindow函数显示对话框。

以下是使用Create函数显示对话框的示例代码:CMyDialog dlg;dlg.Create(IDD_MYDIALOG);dlg.ShowWindow(SW_SHOW);c.使用模态对话框模态对话框是一种阻塞式对话框,显示模态对话框时,在对话框关闭之前,用户无法与其他应用程序进行交互。

要显示一个模态对话框,可以通过调用DoModal函数,并传递对话框的资源ID来实现。

以下是使用模态对话框的示例代码:CMyDialog dlg;INT_PTR nResponse = dlg.DoModal(;2.关闭对话框在VC++中,可以使用以下几种方式关闭对话框:a. 使用EndDialog函数EndDialog函数是CDialog类的一个成员函数,用于关闭对话框,并返回对话框的返回值。

以下是使用EndDialog函数关闭对话框的示例代码:OnOKEndDialog(IDOK);b.使用DestroyWindow函数DestroyWindow函数是CWnd类的一个成员函数,用于销毁窗口,并关闭对话框。

VC中窗口的销毁

VC中窗口的销毁

VC中窗口的销毁一个窗口包括两部分:窗口资源HWND和窗口对象CWnd,销毁时首先释放资源HWND,然后销毁对象CWnd。

例如:自定义的对话框类型CMyDlg,使用时用new在堆上分配了一个新的对话框对象,该对象调用CWnd::Create()时会为该对象分配一个窗口对象。

销毁时应该首先使用CWnd::DestroyWindow()或者::DestroyWindow(HWND hWnd)销毁资源,然后使用delete pDlg删除在对上为该对话框分配的空间。

但是,由于CWnd::DestroyWindow()和::DestroyWindow(HWND hWnd)都会在最后调用CWnd的PostNcDestroy(),因此我们也可以在PostNcDestroy()中调用delete this来删除堆上分配的空间。

这样就不用显示的使用delete pDlg例子:创建窗口:CTestDlg*pDlg=new CTestDlg();pDlg-&gt;Create(IDD_DLG,this);pDlg-&gt;ShowWindow(SW_SHOW);销毁:pDlg-&gt;DestroyWindow();或者::DestroyWindow(pDlg-&gt;m_hWnd);delete pDlg;或者void CTestDlg::PostNcDestroy(){CDialog::PostNcDestroy();delete this;}这样,在销毁时,只需要pDlg-&gt;DestroyWindow();或者::DestroyWindow(pDlg-&gt;m_hWnd);参考资料:考虑单窗口情况:假设自己通过new创建了一个窗口对象pWnd,然后pWnd-&gt;Create。

则销毁窗口的调用次序:1.手工调用pWnd-&gt;DestroyWindow();2.DestroyWindow会发送WM_DESTROY;3.WM_DESTROY对应的消息处理函数是OnDestroy();4.DestroyWindow会发送WM_NCDESTROY;5.WM_NCDESTROY对应的消息处理函数是OnNcDestroy;6.OnNcDestroy最后会调用PostNcDestroy;7.PostNcDestroy经常被用户重载以提供释放内存操作。

WM_CLOSE、WM_DESTROY、WM_QUIT

WM_CLOSE、WM_DESTROY、WM_QUIT

以下说明程序是如何退出的:使用者选按【File/Close】,于是发出WM_CLOSE。

CMyFrameWnd 并没有设置WM_CLOSE 处理常式,于是交给预设之处理常式。

预设函数对于WM_CLOSE 的处理方式是呼叫::DestroyWindow,并因而发出WM _DESTROY。

预设之WM_DESTROY 处理方式是呼叫::PostQuitMessage,因此发出WM_QUIT。

CWinApp::Run 收到WM_QUIT 后会结束其内部之讯息回路,然后呼叫ExitInstance,这是CWinApp 的㆒个虚拟函数。

如果CMyWinApp 改写了ExitInstance ,那么CWinApp::Run 所呼叫的就是CMy WinApp::ExitInstance,否则就是CWinApp::ExitInstance。

最后回到AfxWinMain,执行AfxWinTerm,结束程序。

WM_CLOSE,调用DestroyWindow()DestroyWindow()又发送WM_DESTROY响应WM_DESTROY,调用WM_QUITGetMessage()发现WM_QUIT,退出程序特别注意:如果想手动发送WM_QUIT只能使用postmessage函数,而不能使用se ndmessage函数---//主函数中进入消息循环的代码片断while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg); //将消息进行处理一下DispatchMessage(&msg); //再将消息变量msg传给windows,让windows来调用消息处理函数}//消息处理函数LRESULT CALLBACK MyProc(HWND hwnd,UINT uMsg,WPARAM wParam, LPARAM lParam){switch(uMsg){case WM_CLOSE:if(IDOK==MessageBox(hwnd,"真的想退出程序吗?","退出程序就没机会了",MB_YESNO)){DestroyWindow(hwnd); //WM_CLOSE默认是调用这个处理函数}break;case WM_DESTROY:PostQuitMessage(0);break;}return DefWindowProc(hwnd,uMsg,wParam,lParam);}---WM_CLOSE消息:在系统菜单里选择了“关闭”或者点击了窗口右上角的“X”按钮时产生,它的默认响应函数是直接调用DestroyWindow(hwnd); DestroyWindow(hwnd); 是销毁窗口(但没有不是退出消息循环),然后销毁过程中会产生WM_DESTROY消息放入消息队列,(当调用DestroyWindow函数后,操作系统就会进行一系列的删除动作,先发送W M_DESTROY消息,接着发送WM_NCDESTROY消息。

VC选择题填空题

VC选择题填空题

Visual C++选择题1.有关句柄(handle)的说法,下列不正确的是( C )A) 句柄是一个4字节长的整数值B) 句柄用来标识应用程序中不同的对象或同类对象中的不同实例C) 消息是句柄的一种D) 画笔的句柄类型是HPEN,画刷的句柄类型是HBRUSH2.在Windows基本应用程序中,( B )消息使得如下的消息循环退出运行,从而终止应用程序的运行。

while( GetMessage(&Msg, NULL, 0, 0)){ TranslateMessage(&Msg);DispatchMessage(&Msg) ; }A) WM_DESTROY B) WM_QUITC) WM_CLOSE D) WM_CREATE3.Windows应用程序是以(A)为基本操作单元,提供应用程序与用户之间交互的接口环境;采用事件驱动的编程方法,使用(B)描述事件发生的信息,使用(C)标识应用程序中不同对象及同类对象的不同实例。

A) 窗口B) 消息C) 句柄D) 指针4.Windows API函数RegisterClass的作用是( A )A) 注册一个窗口类B) 窗口的显示C) 创建一个窗口类的实例D) 窗口类的定义5.关于Windows API编程时窗口函数(WndProc)的不正确说法是( D )A) 它是一个回调函数B) 它内部的switch…case分支判断用于不同类型消息的处理C) 它有四个入口参数,其意义和消息结构体MSG的意义相同D) 如果使用全空的窗口函数(内部没有代码), Windows也会负责按照缺省方法处理消息6.下列关于Windows应用程序对键盘响应的说法,正确的是( D )A) 键盘的扫描码不依赖于具体设备B) Windows 应用程序不使用消息来处理键盘响应C) 按下键盘上的一个键,不可能同时产生按键消息和字符消息D) WinMain函数的消息循环中的TranslateMessage函数用于把按键消息转换为字符消息7.下列关于Windows应用程序对鼠标响应的说法,正确的是( B )A) 只有活动窗口才能接受鼠标事件B) 可以调用函数SetCapture()实现对鼠标的捕捉,且捕捉鼠标后系统的键盘功能暂时失效C) 用户只能调用系统定义的鼠标的光标形状,不能自定义光标D) 可以通过相应单一类型的鼠标消息来响应鼠标的拖动事件8.MFC程序设计时,( D )不是加载菜单的工作。

南京师范大学VC++期末考题

南京师范大学VC++期末考题

1.DLL的主要类别和各自功能KERNEL32.DLL (用来处理存储器低层功能,任务和资源管理等Windows 核心服务)GDI32.DLL(用来提供图形设备接口,管理用户界面和图形绘制等Windows 元文件,位图,设备描述表和字体等)USER32.DLL(负责窗口的管理,包括消息,菜单,光标,计时器以及其他与控制窗口显示相关的一些功能)2.VC++工程生成各种扩展名的文件意义(p133_5.1.2)英语好的同学直接读每个VC++工程里面的Read Me.txt,见最后附录。

C++中介绍过的基本的:编辑:当使用上面的工具按照c++语法规则编写完成后,保存生成的文件就是.cpp文件编译:使用系统提供的编译器检查员程序在语法和逻辑结构上的错误。

若发现错误,则显示错误的类型和位置;若检测通过,则将编译好的c++源程序转换为目标文件,即生成文件的目标代码,扩展名是.obj链接: 将用户程序生成得多个目标代码文件(.obj)和系统提供的库文件(.lib)中的某些代码连结在一起,生成一个可执行文件,扩展名是.exe。

执行:把生成的可执行文件运行,在屏幕上显示运行结果。

VC++中的:扩展名为dsw的文件类型, VC中是级别最高的, 称为Workspace文件。

在Workspace 文件中可以包含多个Project, 由Workspace文件对它们进行统一的协调和管理。

与dsw类型的Workspace文件相配合的一个重要的文件类型是以opt为扩展名的文件, 这个文件中包含的是在Workspace文件中要用到的本地计算机的有关配置信息, 所以这个文件不能在不同的计算机上共享, 当我们打开一个Workspace文件时, 如果系统找不到需要的opt类型文件, 就会自动地创建一个与之配合的包含本地计算机信息的opt文件。

在VC中, 应用程序是以Project的形式存在的, Project文件以.dsp扩展名, 这个文件中存放的是一个特定的工程, 也就是特定的应用程序的有关信息, 每个工程都对应有一个dsp 类型的文件。

vc对话框按位置显示

vc对话框按位置显示

vc 对话框按位置显示vc对话框按位置显示2010-07-11 10:35我在MFC单文档中的菜单上弄了个按钮,目的是按下的时候弹出对话框,已新建了对话框资源(IDD_TextDlg),我用DoModal()显示的时候好象老是居中显示,怎样才能把对话框靠右上角或者其他的位置显示出来呢?方法1.在设计对话框时调出属性窗口去掉里面的居中显示属性把X和Y值设为你想要的坐标方法2.在OnInitDialog事件中调用SetWindowPos函数来设置当前对话框的位置方法3.在OnInitDialog事件中调用MoveWindow函数来设置当前对话框的位置SetWindowPos函数功能:该函数改变一个子窗口,弹出式窗口式顶层窗口的尺寸,位置和Z序。

子窗口,弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序、顶层窗口设置的级别最高,并且被设置为Z序的第一个窗口。

函数原型:BOOL SetWindowPosHWND hWnd,HWND hWndlnsertAfter,int X,int Y,int cx,int cy,UNIT.Flags);hWnd:窗口句柄。

hWndlnsertAfter:在z序中的位于被置位的窗口前的窗口句柄。

该参数必须为一个窗口句柄,或下列值之一:HWND_BOTTOM:将窗口置于Z序的底部。

如果参数hWnd标识了一个顶层窗口,则窗口失去顶级位置,并且被置在其他窗口的底部。

HWND_NOTOPMOST:将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后)。

如果窗口已经是非顶层窗口则该标志不起作用。

HWND_TOP:将窗口置于Z序的顶部。

HWND_TOPMOST:将窗口置于所有非顶层窗口之上。

即使窗口未被激活窗口也将保持顶级位置。

x:以客户坐标指定窗口新位置的左边界。

Y:以客户坐标指定窗口新位置的顶边界。

cx:以像素指定窗口的新的宽度。

cy:以像素指定窗口的新的高度。

uFlags:窗口尺寸和定位的标志。

系统+WM_+消息列表及说明

系统+WM_+消息列表及说明
WM_WINDOWPOSCHANGED=$0047; 发送此消息给那个窗口的大小和位置已经被改变时,来调用setwindowpos函数或其它窗口管理函数
WM_POWER=$0048; (适用于16位的windows)当系统将要进入暂停状态时发送此消息
WM_COPYDATA=$004A; 当一个应用程序传递数据给另一个应用程序时发送此消息
WM_KEYLAST=$0108;
WM_INITDIALOG=$0110; 在一个对话框程序被显示前发送此消息给它,通常用此消息初始化控件和执行其它任务
WM_COMMAND=$0111; 当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个
WM_SETFOCUS=$0007; 获得焦点后
WM_KILLFOCUS=$0008; 失去焦点
WM_ENABLE=$000A; 改变enable状态
WM_SETREDRAW=$000B; 设置窗口是否能重画
WM_SETTEXT=$000C; 应用程序发送此消息来设置一个窗口的文本
WM_GETTEXT=$000D; 应用程序发送此消息来复制对应窗口的文本到缓冲区
WM_INPUTLANGCHANGE=$0051; 当平台现场已经被改变后发送此消息给受影响的最顶级窗口
WM_TCARD=$0052; 当程序已经初始化windows帮助例程时发送此消息给应用程序
WM_HELP=$0053; 此消息显示用户按下了F1,如果某个菜单是激活的,就发送此消息个此窗口关联的菜单,否则就发送给有焦点的窗口,如果当前都没有焦点,就把此消息发送给当前激活的窗口
WM_CANCELJOURNAL=$004B; 当某个用户取消程序日志激活状态,提交此消息给程序

C#各种结束进程的方法详细介绍

C#各种结束进程的方法详细介绍

C#各种结束进程的方法详细介绍1、Process类的CloseMainWindow, Kill, Close(1)Process类的CloseMainWindow方法Process.CloseMainWindow是GUI程序的最友好结束方式,从名字上就可以看出来它是通过结束主窗体,相当于用户点击窗体的关闭按钮或者按Alt + F4。

它的本质就是向主窗体发送WM_CLOSE 消息(Process.MainWindowsHandle可以返回主窗体的句柄)。

这个可以在.NET Framework源代码中看出来:public bool CloseMainWindow(){IntPtr mainWindowHandle = this.MainWindowHandle;//句柄是否为0if (mainWindowHandle == IntPtr.Zero){return false;}//GetWindowLong是否成功执行if ((NativeMethods.GetWindowLong(newHandleRef(this, mainWindowHandle), -16) &0x8000000) !=0){return false;}//0x10 是 WM_CLOSE消息//向主窗体发送WM_CLOSE,注意是PostMessage而不是SendMessageNativeMethods.PostMessage(newHandleRef(this, mainWindowHandle), 0x10, IntPtr.Zero, IntPtr.Zero);return true;}•1•2•3•4•5•6•7•8•9•10•11•12•13•14•15•16•17•18CloseMainWindow方法使用PostMessage(不是SendMessage,所以消息会加在消息队列的最后)方法向主窗体发送一个WM_CLOSE消息,这样等主窗体处理完所有消息后,等遇到WM_CLOSE便开始执行退出动作。

c++wm_的语法

c++wm_的语法

c++wm_的语法**C WM_的语法**C WM_是Windows系统中的一个非常重要的函数,它的主要作用是实现对文件和目录的读写操作。

在Windows系统中,我们经常需要操作文件和目录,例如创建、删除、修改等,而这些操作都需要使用到C WM_函数。

一、C WM_函数的语法结构C WM_函数的语法结构比较简单,一般形式如下:C WM_消息名(窗口句柄, 消息参数)其中,C WM_消息名是函数名称,窗口句柄是指向窗口结构的指针,消息参数是用来传递具体信息的变量。

二、C WM_函数的使用方法在使用C WM_函数之前,我们需要先了解一些基本的Windows API 函数和结构体,例如:CreateWindow、SetWindowPos、SendMessage 等。

在使用这些函数和结构体时,我们需要根据具体的操作需求来编写代码。

下面是一个简单的示例代码,演示如何使用C WM_函数来创建和修改一个文件:```c++// 创建窗口HWND hWnd = CreateWindow(L"MyWindowClass", L"File Operations", WS_OVERLAPPEDWINDOW, 100, 100, 640, 480, NULL, NULL, NULL, NULL);// 打开文件对话框OPENFILENAME ofn;ZeroMemory(&ofn, sizeof(OPENFILENAME));ofn.lStructSize = sizeof(OPENFILENAME);ofn.hwndOwner = hWnd;ofn.lpstrFile = L"*.txt"; // 文件类型过滤ofn.nMaxFile = MAX_PATH;ofn.lpstrFilter = L"Text File\0*.txt\0*.*\0"; // 文件过滤器ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;if (!GetOpenFileName(&ofn)) // 打开文件对话框{return;}// 获取文件路径TCHAR szFilePath[MAX_PATH];GetFilePath(ofn.lpstrFile, szFilePath);// 写入文件内容TCHAR szContent[] = "This is a text file.";WriteFile(szFilePath, szContent, strlen(szContent), NULL, NULL);```以上代码中,首先创建了一个窗口,并打开了文件对话框。

[转]VC中如何让子对话框响应最大化、最小化、关闭等系统消息

[转]VC中如何让子对话框响应最大化、最小化、关闭等系统消息

[转]VC中如何让⼦对话框响应最⼤化、最⼩化、关闭等系统消息我们知道实现捕获最⼤化、最⼩化、关闭、⼤⼩变化等系统消息主要有如下两种⽅法:1、重写PreTranslateMessage函数BOOL CSuperSpeedDlg::PreTranslateMessage(MSG* pMsg){// TODO: Add your specialized code here and/or call the base classif ( pMsg->message == WM_SYSCOMMAND ){if ( ( pMsg->wParam & 0xFFF0) == SC_MINIMIZE ){AfxMessageBox(_T("捕获到窗⼝最⼩化消息"));}else if ( ( pMsg->wParam & 0xFFF0) == SC_MAXIMIZE ){AfxMessageBox(_T("捕获到窗⼝最⼤化消息"));}else if ( ( pMsg->wParam & 0xFFF0) == SC_CLOSE ){AfxMessageBox(_T("捕获到窗⼝关闭消息"));}}return CDialog::PreTranslateMessage(pMsg);}注:此⽅法⽆法捕获对话框程序程序中的系统按钮消息2、响应WM_SIZE消息(OnSize函数)void CSuperSpeedDlg::OnSize(UINT nType, int cx, int cy){CDialogEx::OnSize(nType, cx, cy);switch( nType){case SIZE_RESTORED:AfxMessageBox( L"捕获到窗⼝还原消息" );break;case SIZE_MINIMIZED:AfxMessageBox( L"捕获到窗⼝最⼩化消息" );break;case SIZE_MAXIMIZED:AfxMessageBox( L"捕获到窗⼝最⼤化消息" );break;}}注:此⽅法不但可以捕获对话框程序程序中的系统按钮消息,同时还可以获取客户区⾼度与宽度。

VC中窗口的销毁

VC中窗口的销毁

VC中窗口的销毁一个窗口包括两部分:窗口资源HWND和窗口对象CWnd,销毁时首先释放资源HWND,然后销毁对象CWnd。

例如:自定义的对话框类型CMyDlg,使用时用new在堆上分配了一个新的对话框对象,该对象调用CWnd::Create()时会为该对象分配一个窗口对象。

销毁时应该首先使用CWnd::DestroyWindow()或者::DestroyWindow(HWND hWnd)销毁资源,然后使用delete pDlg删除在对上为该对话框分配的空间。

但是,由于CWnd::DestroyWindow()和::DestroyWindow(HWND hWnd)都会在最后调用CWnd的PostNcDestroy(),因此我们也可以在PostNcDestroy()中调用delete this来删除堆上分配的空间。

这样就不用显示的使用delete pDlg例子:创建窗口:CTestDlg*pDlg=new CTestDlg();pDlg-&gt;Create(IDD_DLG,this);pDlg-&gt;ShowWindow(SW_SHOW);销毁:pDlg-&gt;DestroyWindow();或者::DestroyWindow(pDlg-&gt;m_hWnd);delete pDlg;或者void CTestDlg::PostNcDestroy(){CDialog::PostNcDestroy();delete this;}这样,在销毁时,只需要pDlg-&gt;DestroyWindow();或者::DestroyWindow(pDlg-&gt;m_hWnd);参考资料:考虑单窗口情况:假设自己通过new创建了一个窗口对象pWnd,然后pWnd-&gt;Create。

则销毁窗口的调用次序:1.手工调用pWnd-&gt;DestroyWindow();2.DestroyWindow会发送WM_DESTROY;3.WM_DESTROY对应的消息处理函数是OnDestroy();4.DestroyWindow会发送WM_NCDESTROY;5.WM_NCDESTROY对应的消息处理函数是OnNcDestroy;6.OnNcDestroy最后会调用PostNcDestroy;7.PostNcDestroy经常被用户重载以提供释放内存操作。

HelloWin详解

HelloWin详解

HelloWin详解(注意:遇到程序在弄懂之后⼀定要⾃⼰去敲,⼀定要⾃⼰去敲,⼀定要⾃⼰去敲)(注意:遇到程序在弄懂之后⼀定要⾃⼰去敲,⼀定要⾃⼰去敲,⼀定要⾃⼰去敲)(注意:遇到程序在弄懂之后⼀定要⾃⼰去敲,⼀定要⾃⼰去敲,⼀定要⾃⼰去敲)代码如下:#include<windows.h>#include<mmsystem.h>#pragma comment(lib,"WINMM.LIB")LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){static TCHAR szAppName[] = TEXT("HelloWin");HWND hwnd;MSG msg;WNDCLASS wndclass; // 窗⼝类wndclass.style = CS_HREDRAW | CS_VREDRAW; // 窗⼝类型的样式wndclass.lpfnWndProc = WndProc; // 窗⼝处理函数wndclass.cbClsExtra = 0; // 窗⼝扩展wndclass.cbWndExtra = 0; // 窗⼝实例扩展wndclass.hInstance = hInstance; // 实例句柄wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); // LoadIcon() 加载图标wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); // LoadCursor() 加载⿏标光标wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 窗⼝背景⾊ // GetStockObject() 获取⼀个图形对象 wndclass.lpszMenuName = NULL; // 窗⼝菜单wndclass.lpszClassName = szAppName; // 窗⼝类名if (!RegisterClass(&wndclass)) // RegisterClass() 为应⽤程序的窗⼝注册⼀个窗⼝类{MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR); // 显⽰消息框return 0;}hwnd = CreateWindow(szAppName, TEXT("The Hello Program"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, CW_U SEDEFAULT, NULL, NULL, hInstance, NULL); // CreateWindow() 基于窗⼝类创建⼀个窗⼝ ShowWindow(hwnd, iCmdShow); // 显⽰窗⼝UpdateWindow(hwnd); // 指⽰窗⼝对其⾃⾝进⾏重绘while (GetMessage(&msg, NULL, 0, 0)) // 从消息队列获取消息{TranslateMessage(&msg); // 翻译键盘消息DispatchMessage(&msg); // 将消息发送给窗⼝过程 (即 WndProc()函数 )}system("pause");return msg.wParam;}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){HDC hdc;PAINTSTRUCT ps;RECT rect;switch (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 98"), -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); // 返回默认的消息处理的结果}看起来似乎第⼆⾏就懵逼吧!哈哈哈!因为在程序中使⽤PlaySound函数时需要在 #include<windows.h> 后⾯加上 (不能在前⾯加 ):#include <mmsystem.h>#pragma comment(lib, "WINMM.LIB")LRESULT是⼀个数据类型,指的是从窗⼝程序或者返回的32位值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC中WM_CLOSE、WM_DESTROY、WM_QUIT消息出现顺序及调用方式wxleasyland@2012.7wxleasyland试验:一、VC建的标准WIN32-HELLO WORLD程序中,case WM_DESTROY://PostQuitMessage(0);将这行屏蔽则,点关闭,窗口关闭了,但是程序进程还在!要在任务管理器中中止。

二、VC建的标准WIN32-HELLO WORLD程序中,1. 在WndProc()中加上case WM_CLOSE:WinExec("cmd /k echo WM_CLOSE: ",SW_SHOW);break;2. 按右上角的X、点图标\关闭、或者按ALT+F4,都只出现cmd窗,不会关闭程序。

因为原来是执行default: return DefWindowProc(hWnd, message, wParam, lParam); 即DefWindowProc来处理WM_CLOSE消息。

现在被case WM_CLOSE:拦截了。

3. 点菜单里的FILE\EXIT,则就是执行case WM_COMMAND: 里的case IDM_EXIT:DestroyWindow(hWnd); 了。

不会执行case WM_CLOSE:!!!DestroyWindow(hWnd); 会销毁窗口,同时发送WM_DESTROY消息直接让WndProc()处理(不经过消息队列)。

三、VC建的标准WIN32-HELLO WORLD程序中,1. 在WndProc()中加上case WM_CLOSE:WinExec("cmd /k echo WM_CLOSE: ",SW_SHOW);return DefWindowProc(hWnd, message, wParam, lParam);break;case WM_DESTROY:WinExec("cmd /k echo WM_DESTROY: ",SW_SHOW);PostQuitMessage(0);break;2. 按右上角的X、点图标\关闭、或者按ALT+F4,会先出现WM_CLOSE,再出现WM_DESTROY。

3. 点菜单里的FILE\EXIT,则只出现WM_DESTROY。

四、VC建的标准WIN32-HELLO WORLD程序中,如果用PostQuitMessage(0); 则不出现WM_CLOSE。

也不会出现WM_DESTROY!!!!!!!窗口会关闭,程序退出。

这应该是正常的,WM_QUIT让GetMessage()为0,从而WinMain()退出,然后操作系统会自动去销毁窗口。

主程序已经没了,所以即使WM_DESTROY出现了也没用。

经试,在PostQuitMessage(0);后面的语句会继续执行到完。

PostQuitMessage只是产生一个WM_QUIT 消息到消息队列中并马上返回。

所以标准WIN32程序是:按右上角的X->出现WM_CLOSE退出菜单点EXIT->出现运行五、在MFC对话框程序中,试验,是:1. 先WM_CLOSE(这时窗口仍在显示)->再WM_DESTROY(窗口已经消失)->OnDestroy()执行完后,程序完全退出2. WM_CLOSE不一定会出现。

WM_CLOSE 点右上角的X,点图标\关闭,或者按ALT+F4,会出现。

点OK按钮、或者Cancle按钮,或者用任务管理器强行中止,都不会出现。

3. WM_DESTROY 点右上角的X,点OK按钮、或者Cancle按钮,都会出现。

而且晚于WM_CLOSE 出现。

用任务管理器强行中止,则不会出现。

4. 如果在程序中按一个按钮,里有PostQuitMessage(0); 则不出现WM_CLOSE,但会出现WM_DESTROY,窗口会关闭,程序退出。

经试,按钮函数里,在PostQuitMessage(0);后面的语句会继续执行到完。

PostQuitMessage只是产生一个WM_QUIT消息到消息队列中并马上返回。

5. 如果在程序中按一个按钮,里有PostMessage(WM_DESTROY); 则不出现WM_CLOSE,但会出现WM_DESTROY。

窗口不会关闭,还能正常用。

所以MFC对话框程序是:按右上角的X->出现WM_CLOSE->产生WM_DESTROY ->OnDestroy()执行完后程序退出点确认或取消按钮运行==================================h p://m s d n.m i c ro s o .co m/e n-us/l i b rary/w i n d ow s/d es ktop/m s632617(v=vs.85).a s pxWM_CLOSE messageSent as a signal that a window or an application should terminate.A window receives this message through its WindowProc function. 窗口通过WindowProc函数来接收这个消息!An application can prompt the user for confirmation, prior to destroying a window, by processing the WM_CLOSE message and calling the DestroyWindow function only if the user confirms the choice. 程序中可以让用户确认是否真的要退出。

By default, the DefWindowProc function calls the DestroyWindow function to destroy the window.WM_DESTROY messageSent when a window is being destroyed.It is sent to the window procedure of the window being destroyed after the window is removed from the screen. 当窗口被从屏幕上删除掉之后,这个消息才被发送给窗口程序。

This message is sent first to the window being destroyed and then to the child windows (if any) as they are destroyed. During the processing of the message, it can be assumed that all child windows still exist. 在处理消息的过程中,所有子窗仍然存在。

A window receives this message through its WindowProc function. 窗口通过WindowProc函数来接收这个消息!If the window being destroyed is part of the clipboard viewer chain (set by calling the SetClipboardViewer function), the window must remove itself from the chain by processing the ChangeClipboardChain function before returning from the WM_DESTROY message.WM_NCDESTROY messageNotifies a window that its nonclient area is being destroyed.The DestroyWindow function sends the WM_NCDESTROY message to the window following the WM_DESTROY message. WM_NCDESTROY是在WM_DESTROY消息之后。

WM_DESTROY is used to free the allocated memory object associated with the window.The WM_NCDESTROY message is sent after the child windows have been destroyed. In contrast, WM_DESTROY is sent before the child windows are destroyed.A window receives this message through its WindowProc function. 窗口通过WindowProc函数来接收这个消息!This message frees any memory internally allocated for the window.WM_QUIT messageIndicates a request to terminate an application, and is generated when the application calls the PostQuitMessage function. This message causes the GetMessage function to return zero.The WM_QUIT message is not associated with a window and therefore will never be received through a window's window procedure. WM_QUIT消息与窗口没有关联,所以窗口处理程序收不到这个消息。

It is retrieved only by the GetMessage or PeekMessage functions.Do not post the WM_QUIT message using the PostMessage function; use PostQuitMessage.PostQuitMessage functionIndicates to the system that a thread has made a request to terminate (quit). It is typically used in response to a WM_DESTROY message.The PostQuitMessage function posts a WM_QUIT message to the thread's message queue and returns immediately; PostQuitMessage只是产生一个WM_QUIT消息到线程的消息队列中并马上返回。

相关文档
最新文档