1、对话框的 OnOk()函数,除了对应于初始化的确定按钮,还会在很多时候比如?对于 dlg.Modal()都是存在返回值的,要对按下其中的按键这个消息进行处理只需要用 if(dlg.Modal()=IDOK )函数体对话框的 OnCancel 函数自动对应了对话框的关闭按钮。SetWindowText(LPCTSTR)m_windowtext);更改对话框标题的方法。m_controlrichedit.SetWindowText(strText);更改对话框内容的方法编写快捷键的方法:更好地办法是插入 Accelerator 热键资源添加成员 protected: ACCEL m_hAccel;
2、在 OnInitDialog()中m_hAccel = LoadAccelerators(AfxGetResourceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1);BOOL CNotepadDlg:PreTranslateMessage(MSG* pMsg)if (m_hAccelTable) if (:TranslateAccelerator(m_hWnd, m_hAccelTable, pMsg) return(TRUE); return CDialog:PreTranslateMessage(pMsg);法 2方法二: 1 声明热键消息处理函数原型
3、 在.h 中消息映射声明处(AFX_mSG 字样之后)加入如下语句: LRESULT OnHotKey(WPARAM wParam,LPARAM lParam); 2 消息与相应处理函数相关联 在.Cpp 中加入消息映射宏,使消息与相应处理函数发生关系, ON_MESSAGE(WM_HOTKEY,OnHotKey); 3 为方便以后的操作 预先在类中创建一个响应 WM_CREATE 和 WM_DESTROY 消息的函数 OnCreate()与 OnDestroy()的框架 4向系统登记热键 在 OnCreate()函数中加入如下代码以向系统登记热键,本例子的热键设为 CtrlShiftA. R
4、egisterHotKey(m_hWnd,1001,MOD_CONTROL|MOD_SHIFT, A ); RegisterHotKey(m_hWnd,1002,MOD_CONTROL|MOD_SHIFT, a ); 5处理热键 在消息处理函数 OnHotKey()中对热键进行处理,并可加入用户希望运行的程序代码 LRESULT C*:OnHotKey(WPARAM wParam,LPARAM lParam) if(wParam=1001|wParam=1002) CWnd:SetForegroundWindow();/使得被激活窗口出现在前景 MessageBox( “Hello! “);
5、/用户可在此添加代码 return 0; 6程序运行完毕后解除热键 在 OnDestroy()中通过 UnRegisterHotKey()解除热键登记,释放系统资源. UnRegisterHotKey(m_hWnd,1001); UnRegisterHotKey(m_hWnd,1002); 7编译并运行程序法 3(直接检测键盘按键的方法(不插入热键资源)仅用于快捷键比较少的情况If(pMsg- message = WM_KEYDOWN return TRUE; break; case 0x53:if ( ( GetKeyState( VK_CONTROL ) break;case 0x46:
6、/ctrl+f if ( ( GetKeyState( VK_CONTROL ) break;case 0x52:if ( ( GetKeyState( VK_CONTROL ) break;/return CDialog:PreTranslateMessage(pMsg);CaboutDlg 对话框的显示: CAboutDlg caboutdlg;(自动关联你的资源)caboutdlg.DoModal();在初始化的时候,系统其实已经将它自动创建的关于对话框资源和那一段代码关联在一起了,原因是CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMen
7、u != NULL)CString strAboutMenu;strAboutMenu.LoadString(IDAUTHOR);if (!strAboutMenu.IsEmpty()pSysMenu-AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);并且在文件视图当中虽然看不到关于对话框的头文件定义,但其实是有的. 在那个关于对话框中,系统已经定义好了两个文本对话框,如果要修改关于对话框的内容,直接修改那个就可以了.MessageBox(NULL,TEXT(“MessageB
8、oxText(内容)“), TEXT(“Title(标题)“),MB_OK);MB_YESNO等等,使用了这个之后,如果你需要在点击该消息框的按钮后执行某些操作,就需要对按键的消息进行处理;否则的话, 点击按钮就直接退出该消息框,然后执行之后的代码.Int ret=MessageBox(“MessageBoxText(内容)“, “Title(标题 )“,MB_OK|MB_ICONSTOP);If(ret=IDOK)/用这个来处理用户到底点击了什么按键同时显示图标和按键MB_OK,MB_IGNORE?,MB_ABORT?,MB_RETRYCANCEL;他们的返回值为IDOK,IDIGNORE,
9、IDABORT,IDRETRY;能以模态形式弹出一个对话框标题位“Title” ,内容为“MessageBoxText” ,具体内容可以设置。 ;最后一个参数是用来设置图标的(弹出框的作用类别) ;MB_OK 是普通的,MB_ICONSTOP MB_ICONQUSTION 是提问的; MB_ICONSTOP 是禁止的;MB_ICONWARNING 是警告的;1. (Rich Edit 控件的使用)Rich Edit 需要添加变量 m_RichEdit,类型位控制变量,通过调用 SetWindowText(自定义的 CString 变量)来实现把 CString 写到 Rich Edit 的框里
10、面;显示对话框之前调用 AfxInitRichEdit(),可以放在 CLianxiDlg 主类的构造函数的开头,或者 CLianxiDlg.app 类的 InitInstance(初始化函数开头) ,但不能放在 CLianxiDlg 主类的InitInstance 的开头 ;(原因就是必须保证在主对话框定义对象之前调用这个函数,app类是先于基本类被调用的)2. 在 richedit 控件中,去掉默认的 ONOK 和 ONCancel 后,点击回车就木有反应了,但把richedit 的属性改为有返回值,就有反应了3. CDialog:OnInitDialog();这段代码是对对话框的初始化,
11、其他的比如 findandreplace 程序中对 RichEdit 的初始化赋值必须在对话框已经建立后才能调用4. (静态文本控件的使用 )静态文本 ,可以设置为不变的;也可以设置为只要点击该文本,就会触发一个事件,进而改变静态文本中的内容.方式,添加 control 型的对应变量,并且在单击函数上写上你想写的代码. CStaticDlg:OnStatic1() MessageBox(“事件发生!“);m_static1.SetWindowText(“您单击了我!好痛! “);注意:所有静态文本的初始 ID 是一样的,所以如果要设置单击事件消息函数或者为其添加对应变量,必须重新设置 ID.注
12、意:为 static 添加对应变量时,由于编译器的原因,添加 value 型时只能在类向导中添加 CString 类型,但是如果要用其他类型,只需要到具体的代码处去修改,不过不能不通过类向导而直接到代码处添加,因为现在我还不能通过代码把一个变量和一个控件关联起来。当然还有一种方式,就是用指针进行关联CStatic* static1=(CStatic*)GetDlgItem(IDC_STATIC3);CStatic* static2=(CStatic*)GetDlgItem(IDC_STATIC4);CStatic* static3=(CStatic*)GetDlgItem(IDC_STATIC
13、5);UpdateData(TRUE);static1-SetWindowText(m_input);但是要求 m_input 必须是 CString 类型,而不能向以上那样比较随意的用其他类型。把其他类型转化为 CString 类型int a=CString str;str.Format(“%d“, a);5. (编辑框控件的使用 )又称为文本框 ,用于数据的输出.它本身的设置便是可以自由在编辑框内输入,但是为了实现交互,得给编辑框定义 CString 类型的对应变量,再利用UpdateData(TRUE)是把编辑框的内容导入(是剪切型的吗?)到它的对应变量上; UpdateData(FAL
14、SE)是把对应变量上的值导入到编辑框中进行显示如果此时编辑框内已经有数据了,想要改写其中的数据,是不是一定要用UpdateData(TRUE)把编辑框内的内容剪切到对应变量上,然后修改对应变量,最后再用 UpdateData(false)把对应变量的内容写到编辑框内。6. if(dlg.DoModal() != IDOK)指的是以模态方式打开成功时,只有执行 CDialog:OnOK();,才会突破模态,继续运行下一行程序;执行 CDialog:OnCancel();会直接退出模态,并且也不会运行接下来的程序.; 如果以上 2 个函数都没有对调用,则将一直停留在模态阶段,不会进入下面的程序“i
15、f(dlg.DoModal()=IDOK)” 这个语句有两层意义,第一是 dlg.DoModal()作用是弹出CPortDlg 对话框,第二层是 dlg.DoModal()=IDOK 是你点击了对话框上的 OK 按钮。就是说你同时做了上述两件事时就执行 if 语句后面的程序。然而若选择 if(dlg.DoModal() != IDOK)OnOK();,则是代表无论点击哪一个按键都会调用 OnOK();(这段代码实现了在点击取消时能够退出所有窗口)一般的在模态下点击取消只会退出模态窗口,究竟怎样才能退出所有窗口?是不能直接退出所有窗口的.9.静态文本框当初始框设置为空时的显示是不可见的,隐式的;
16、编辑框设置了只读属性时,在显示上还是可见的一条空白框,不会隐式7. /编辑框是可以直接在里面输入数据UpdateData(TRUE);/这个语句把在编辑框中的数据导入到编辑框对应的变量中11. if(m_Name=“ruc” /因为自定义的对话框 Login 的自身没有定义 OnOK 和 OnCancel函数来关闭 Login 对话框和进入对话框。这两个函数的区别仅仅在于返回值不同,OnOK 返回 IDOK,OnCancel 返回 IDCancel所以就可以调用基类的 OnOK 和 OnCancel 函数去关掉该对话框if(dlg.DoModal() != IDOK)/执行 Domodal(相
17、当于进入了一个子函数)的过程中只有在执行OnOK 和 OnCancel 的时候(因为只有它们才能关掉对话框)才会有返回值,才会跳出DoModal 子函数12.单选按钮控制单选按钮只能选一个的方法,就是让这些按钮都对应同一个变量,只要这个变量的值变化了,就会相应的改变选项.控制单选按钮只能选中一个的方法,要让他们 TabOrder 从左到右依次增加分组(比如处理多道单选题)设置控件的 Tab Order单击 Layout 菜单下的 Tab Order 命令,设置控件的 TAB 键顺序(Tab Order) ,保证单选钮的 Tab Order 连续。以 Tab Order 为序,从 Group 属
18、性为真的控件开始(包括该控件) ,到下一个 Group 属性为真的控件结束(不包括该控件) ,所有的这些控件将组成一个组。对于单选钮,同一组内同时只能有一个处于被选中状态。对于由资源编辑器生成的单选按钮控件,在默认情况由Windows 自动处理同组控件之间的互斥关系。13.通过类向导新增的成员变量会自动在构造函数中进行初始化14. 组合框控件结合了编辑框和列表框的特点,既可以进行输入,也可以在列表框组成部分选择一项实质上组合框是一个编辑框、列表框和一个按钮的组合组合框有:简单组合框、下拉组合框和下拉列表框 3 种形式1. AddString(text) /添加项目2. GetCurSel()/
19、获取当前被选项目索引GetLBText( nIndex, text)/把当前索引的项目保存在 text 中为组合框添加项目从编辑框中读取数据再添加到组合框中CString text;UpdateData(true);text=m_text;UpdateData(false);m_cbExample.AddString(text);从组合框的下拉框中选择项目,再显示在编辑框中(信息在两个框中的交互)CString text;int nIndex = m_cbExample.GetCurSel();m_cbExample.GetLBText( nIndex, text);UpdateData(tr
20、ue);m_text=text;UpdateData(false);15 列表控件1. AddString(text) /添加项目2. GetCurSel()/获取当前被选项目索引3. GetText( nIndex, text)/把当前索引的项目保存在 text 中DeleteString(index)16 树视图控件向对话框添加一个树控件,添加成员变量名为:m_MFC_Tree1).添加项目节点(item)HTREEITEM hParent = m_MFC_Tree.InsertItem(“ItemText“,TVI_ROOT);HTREEITEM hChild = m_MFC_Tree.
21、InsertItem(“Child ItemText“,hParent,TVI_LAST); 2)获取当前所选节点信息HTREEITEM hItem = m_MFC_Tree.GetSelectedItem();CString strItemText = m_MFC_Tree.GetItemText(hItem);3)删除当前所需节点HTREEITEM hItem = m_MFC_Tree.GetSelectedItem();m_MFC_Tree.DeleteItem(hItem); 事件处理To Add a handler for Selection Change:Open the clas
22、s wizard Go to the Message maps tabSelect the Tree control on the left side object IDs list box and select TVN_SELCHANGED on the right Messages List box.Click Add function and go to the function.The following sample shows a Message box whenever there occurs a selection change event in the Tree contr
23、ol.当在树状控件上进行选择时,就会触发这个消息void CCoderSourceDlg:OnSelchangedTreectrl(NMHDR* pNMHDR, LRESULT* pResult) NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;/ TODO: Add your control notification handler code hereHTREEITEM hItem = m_MFC_Tree.GetSelectedItem();CString strItemText = m_MFC_Tree.GetItemText(hItem)
24、;MessageBox(strItemText);*pResult = 0;当有两个编辑框时,UpdateData 应该是同时作用于所有的编辑框17.菜单分类:菜单栏(主菜单) 、弹出式子菜单和上下文菜单要想让主对话框与菜单联系起来,光靠建立类向导中是不能的,需要在主对话框中单击右键,进入属性,在菜单一栏中去选择你要关联的菜单每一个子菜单栏都有 2 个消息可以利用 :WM_COMMAND 和 UPDATE_COMMAND_UI 消息前者是定义一个消息函数,当点击一个子菜单栏时,就会触发该消息执行相应的函数。对于后者 OnUpdatemmm(CCmdUI* pCmdUI)pCmdUI-Enabl
25、e(bool 变量);通过设置一个 bool 变量来将该消息( 即这个子菜单栏的是否可用) 与其它函数相连接。当把改按键禁用之后,只是不能让它执行相应的函数,不会(想 XP 系统上)呈现灰色。主对话框与菜单栏的消息函数 WM_CONTEXTMENU。当点击主对话框的右键时,就会弹出该菜单。在类向导添加该消息后,就为其添加函数体部分/加载菜单资源CMenu menu;menu.LoadMenu(IDR_MENU2);/(根具菜单栏的 ID 来决定单击右键时调用哪一个菜单栏)/获取子菜单CMenu* pMenu;pMenu = menu.GetSubMenu(0);/弹出子菜单pMenu-Trac
26、kPopupMenu(TPM_RIGHTBUTTON |TPM_LEFTALIGN,point.x,point.y,this,NULL);/销毁菜单资源menu.DestroyMenu(); 18.工具栏和菜单栏一样,必须插入工具栏的资源 在主窗口对话框类中创建一个工具栏成员变量CToolBar m_ToolBar; 在对话框类的 OnInitDialog()中添加:m_ToolBar.Create(this);m_ToolBar.LoadToolBar(IDR_TOOLBAR1);RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLB
27、AR_LAST,0); 消息处理添加工具栏不会自动连接到对话框?找不到相关代码?菜单栏也是注意:每一个按键都和子菜单栏一样,有 WM_COMMAND 和ON_UPDATE_COMMAND_UI 两个命令,必须先为每一个工具栏按钮设置 ID,才能在类向导中看到他们,才能设置消息函数19.状态栏 在主窗口对话框类中创建一个状态栏控制类成员变量CStatusBarCtrl m_StatusBar;在对话框类的 OnInitDialog()中添加/创建状态栏窗口m_StatusBar.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,1100);/确定状态栏
28、面板的左边界int width=80,220, 300,380,460,32765;/设置状态栏面板m_StatusBar.SetParts(6, width);/设置状态栏面板文本m_StatusBar.SetText(“单位名称: “,0,0);m_StatusBar.SetText(“人民大学 “,1,0);m_StatusBar.SetText(“当前用户: “,2,0);m_StatusBar.SetText(“ruc“,3,0);/获取当前日期CTime ct;ct = CTime:GetCurrentTime();CString strdate;strdate.Format(“%
29、s“,ct.Format(“%y-%m-%d“);m_StatusBar.SetText(“当前日期: “,4,0);m_StatusBar.SetText(strdate,5,0);/重新调整对话框中的控制条控件RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);生成可执行文件.exe 格式有 2 个版本,Debug 和 Release 版本,前者添加了很多调试信息,所以效率比较低,并且传给别人时,如果别人没有 VC 可能无法运行;后者则效率更高,且不受编译器限制。生成 Release 版本的方法:在界面的右上
30、方位置单击右键,点击组建,会弹出一个框,在里面选择 Win32 Release,再在最顶部的工具栏中的组建点击全部重建,便生成了 Release 版本。20. CFindReplaceDialog 类是系统类(即查找替换框类)/我觉得在1. dlg = new CFindReplaceDialog;2. dlg-Create(TRUE,NULL);3. dlg-ShowWindow(SW_SHOW);4. find = TRUE;执行完以上操作后会自动触发一个系统消息 FINDMSGSTRINGvoid SetSel( long nStartChar, long nEndChar );这 一
31、个 函 数 是 由 编 辑 框 或 者 richedit控 件 来 对 从 nStartChar 到 nEndChar 的 部 分 用 黑 色 区 域 选 中 的 函 数 ;但 是 可 以 用 这个 函 数 去 定 位 光 标 的 位 置 ,因 为 如 果 nStartChar 到 nEndChar 的 部 分 长 度 为 0,那 么此 时 就 相 当 于 定 位 了 光 标 .虽 然 弹 出 了 体 统 提 供 的 查 找 替 换 那 个 对 话 框 , 但 是 上 面 的 按 键 都 没 有 定 义 ! !OnFindReplace()函数,其中“”为需要用户编写的查找/替换操作。LONG
32、 CEditTestView:OnFindReplace(WPARAM wParam,LPARAM lParam)CFindReplaceDialog* pDlg = CFindReplaceDialog:GetNotifier(lParam);m_FindString = pDlg-GetFindString(); /查找串m_ReplaceString = pDlg-GetReplaceString(); /替换串if( pDlg-FindNext() ) /查找下一个;if( pDlg-ReplaceCurrent() ) /替换;if( pDlg-ReplaceAll() ) /全部替
33、换;return 0; 21.字体关联建立基于对话框工程:My2、添加控件:静态文本控件:IDC_STATIC1编辑框控件:建立一关联变量 CEdit m_EditControl3、在 OnInitDialog 中添加如下代码:CFont * m_pFont;m_pFont = new CFont;m_pFont-CreateFont(16, / nHeight0, / nWidth0, / nEscapement0, / nOrientationFW_BOLD, / nWeightTRUE, / bItalicFALSE, / bUnderline0, / cStrikeOutANSI_CH
34、ARSET, / nCharSetOUT_DEFAULT_PRECIS, / nOutPrecisionCLIP_DEFAULT_PRECIS, / nClipPrecisionDEFAULT_QUALITY, / nQualityDEFAULT_PITCH | FF_SWISS, / nPitchAndFamily_T(“Arial“); / lpszFacm_EditControl.SetFont(m_pFont,false);m_EditControl.SetWindowText(“Hello!“);GetDlgItem(IDC_STATIC1)-SetFont(m_pFont,fals
35、e);注:1、需要注意的是,这里我们使用的是 CFont 指针,而不是普通的 CFont 局部变量,如果把程序改成下面这样:CFont m_pFont;运行后就得不到想要的效果了,因为 OnInitDialog 函数执行完毕,CFont m_pFont 就会被清除。必须保证 SetFont 设置的字体对象在对话框关闭前一直有效。所以通常是使用指针或类成员的方式来保存所建立的字体对象。2、也可以定义 CMyDlg 类的成员变量:CFont *m_pFont;或 CFont m_Font;3、若编辑框控件 IDC_EDIT1 未定义 CEdit 变量 m_EditControl,可以如下调用:CE
36、dit* m_EditControl = (CEdit*)GetDlgItem(IDC_EIDT1);m_EditControl-SetFont(m_pFont,false);VC 中,CAboutDlg,CDrawApp,CDrawDoc,CDrawView 和 CMainFrame 五个类的关系是怎样的?它们各有什么作用?CAboutDlg 向导自动生成的“关于.“对话框类.相对独立.CDrawApp: CWinApp 派生类, 一般用于完成一些程序的初始化过程,类似于 C 中的 main()函数.CDrawDoc, CDrawView: CDocument 和 CView 派生类, 处理
37、各种文档的操作,如:打开,关闭,重载,更新等.同时和 CView 及其派生类结合紧密,一起完成对不同文档的处理过程.可以简单理解为 CDocument 类进行实际的工作内容,CView 类对 CDocument 类所做的工作进行绘制,并直观的显示在屏幕上.CMainFrame: 窗口框架, 一般做为主窗口出现,用来包含各种窗口,处理菜单和工具栏命令.void CAboutDlg:DoDataExchange 这个函数是用来添加消息映射的,说通俗一点就是让你的消息和消息处理函数之间有机的联系起来。比如说我要按下按钮是执行某个函数,那么就需要把鼠标按下这个消息,和你的函数之见添加映射。更改对话框的
38、标题: SetWindowText(LPCTSTR)m_windowtext);dlg.GetPathName();获取路径拆分路径 例如,拆分“C:Program FilesOpenCVReadme.txt“这个路径 const char* fileName= “C:Program FilesOpenCVReadme.txt“; char drive100;/磁盘名 char dir100;/路径 char fname100;/文件名(无后缀) char ext100; /后缀 _splitpath(fileName, drive, dir, fname, ext); WM_KEYDOWN
39、消息处理函数: .OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) switch (nChar) case VK_ESCAPE : / 你想响应哪个键就把他对应/的键值 函数写下就行了 哈哈break; 具体过程:打开 classwizzard 选中响应 key down 消息的类, 在右面的窗口里找到wm_keydown,双击,然后在 classwizzard 窗口下面的列表框里双击 OnKeyDown 函数,代码就会自动生成,光标停在类的函数里 其中 VK_ESCAPE 对应的是 esc 键 如何响应快捷键,把消息往下传递: BOOL CFo
40、rmViewRecordEditor:PreTranslateMessage(MSG* pMsg) / TODO: Add your specialized code here and/or call the base class if ( pMsg- message = WM_KEYDOWN ) switch( pMsg- wParam ) case 0x41: /selete all case 0x46: /ctrl+f case 0x56: /Ctrl + V: case 0x58: / cut case 0x43: / copy case 0x5A: /undo case 0x59:
41、/redo if ( ( GetKeyState( VK_CONTROL ) return TRUE; break; /End: if ( pMsg- message ); return CFormView:PreTranslateMessage(pMsg); 反复碰到这个问题,查资料很困难,索性整理一下放在这里,供朋友们借鉴。 = 微软很恶心,竟然无法很方便的为 FormView 或者 Dialog 上的 RicheditCtrl 添加右键菜单功能项.经过搜索资料和实际使用,需要用这样的方式才能实现: 注意事项 1.右键菜单中,不能出现系统命令,例如,ID_EDIT_UNDO/ID_EDIT
42、_COPY/ID_EDIT_PASTE/ID_EDIT_CUT/ID_EDIT_SELALL 等,否则,无法响应消息. 2.菜单项目,不能用 OnCommand 的方式进行消息处理,必须在 Message Map 中用 ON_MESSAGE的方式,并且在头文件中实现定义好消息函数如 OnMenuUndo. BEGIN_MESSAGE_MAP(CReferenceFormView, CFormView) /AFX_MSG_MAP(CReferenceFormView) ON_MESSAGE(ID_MENU_UNDO, OnMenuUndo) ON_MESSAGE(ID_MENU_CUT, OnM
43、enuCut) ON_MESSAGE(ID_MENU_COPY, OnMenuCopy) ON_MESSAGE(ID_MENU_PASTE, OnMenuPaste) ON_MESSAGE(ID_MENU_CLEAR, OnMenuClear) ON_MESSAGE(ID_MENU_SELECT_ALL, OnMenuSelectAll) /AFX_MSG_MAP END_MESSAGE_MAP() 3.需要在 FormView 的 OnInitialUpdate()函数或者 Dialog 的 OnInitialDialog()函数中调用 m_ctrlRichEditReference.Set
44、EventMask(ENM_MOUSEEVENTS); 表示 RicheditCtrl 的鼠标事件交由父窗体进行处理. 4.在父窗体(FormView 或者 Dialog)的 OnNotify 消息中做如下处理: BOOL CReferenceFormView:OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) / TODO: Add your specialized code here and/or call the base class 要点 1: The RichEditCtrl sends the message “EN_M
45、SGFILTER “ to the parent, now to get at which message has been reflected (because it could be a left click or a mouse move) we need to examine the message filter, so we cast lParam to MSGFILTER * MSGFILTER * lpMsgFilter = (MSGFILTER *)lParam; 要点 2: if (wParam = IDC_RICHEDIT_REFERENCE) :GetCursorPos(
46、 /where is the mouse? CMenu menu; /lets display out context menu :) UINT dwSelectionMade; VERIFY(menu.LoadMenu(IDR_MNU_REFERENCE4RE) ); CMenu *pmenuPopup = menu.GetSubMenu(0); ASSERT(pmenuPopup != NULL); dwSelectionMade = pmenuPopup- TrackPopupMenu( (TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_NONOTIFY|TPM_RET
47、URNCMD), point.x, point.y, this ); pmenuPopup- DestroyMenu(); PostMessage(dwSelectionMade,0,0); return CFormView:OnNotify(wParam, lParam, pResult); 参考资料: http:/lib.training.ru/Lib/ArticleDetail.aspx?ar=468/这种方式不能正确响应 /:PostMessage(m_ctlEditFieldValue.m_hWnd, pMsg- message, pMsg- wParam, pMsg- lParam
48、);/这种方式不能正确响应 /m_ctlEditFieldValue.SendMessage(WM_COMMAND,(WPARAM)ID_EDIT_PASTE,(LPARAM)0);/这种方式不能正确响应 :PostMessage(m_ctlEditFieldValue.m_hWnd, WM_PASTE,(WPARAM)0,(LPARAM)0);/这种方式可以正确响应! return TRUE; break; /End: if ( pMsg- message ); return CPropertyPage:PreTranslateMessage(pMsg); 加上“Winuser.h“例如测试 Ctrl 键是否按下的代码如下:if (:GetKeyState(VK_CONTROL) GetWindowRect(ScreenToClient(rect.right += ux;rect.bottom += uy;hWin-MoveWindow(LastWindowRect.right = cx;LastWindowRect.bo