2022年VC编程技巧 .pdf
《2022年VC编程技巧 .pdf》由会员分享,可在线阅读,更多相关《2022年VC编程技巧 .pdf(30页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、MFC 技巧 90例-总结篇 (三) 2007-03-07 14:00 21. 介绍函数过程中一种任意键退出同时能处理消息的实现方法1. 设置定时器 ,用于使 :GetMessage(.) 函数总能快速取到消息. 2. 在函数处理中加入: 函数每执行完一步后执行下面的代码. if (:GetMessage(&msg, 0, 0, 0) if (msg.message = WM_KEYFIRST & msg.message GetDescendantWindow(AFX_IDW_TOOLBAR); pToolBar-SetWindowText (_T(Standdard); 不要在 TooBar
2、 悬浮时做OnMyToolBar() 会出错的 . 顺便提一下如何获得状态条的指针: CStatusBar * pStatusBar =(CStatusBar *)AfxGetMainWnd()-GetDescendantWindow(AFX_IDW_STATUS_BAR); 24. 在状态条中显示鼠标的设备坐标与逻辑坐标显示器的设备坐标系的原点在客户区的左上角,x 轴向右增长, y 轴向下增长。我们要设置的逻辑坐标系的原点则在客户区的中心,x 轴向右增长,y 轴向上增长,如一个笛卡尔坐标系一般。为 CChildView添加一个成员函数void OnPrepareDC(CDC * pDC, C
3、PrintInfo * pInfo = NULL); void OnPrepareDC(CDC * pDC, CPrintInfo * pInfo) CRect rect; / 设置映射模式为LOMETRIC (0.1mm),右上为增长方向pDC-SetMapMode (MM_LOMETRIC); / 将坐标原点定在客户区的中心GetClientRect(rect); pDC-SetViewportOrg(rect.Width()/2, rect.Height()/2); 为 CChildView响应鼠标移动消息,并在状态条中显示鼠标的坐标值。m_ptMouse 数据成员是原打算做十字交叉线用
4、的,在此使用没有实际意义。void CChildView:OnMouseMove(UINT nFlags, CPoint point) CClientDC dc(this); CString str; OnPrepareDC(&dc); /要访问类CMainFrame ,需要将mainfrm.h 文件引入名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 30 页 - - - - - - - - - CMainFrame * pFrame = (CMainFrame *) A
5、fxGetApp()-m_pMainWnd; /要访问CMainFrame 的数据成员m_wndStatusBar ,需要手工修改mainfrm.h ,public 这个数据成员CStatusBar * pStatus = (CStatusBar *) &pFrame-m_wndStatusBar; m_ptMouse = point; str.Format ( 设备坐标X=%i pixel, Y=%i pixel, m_ptMouse.x, m_ptMouse.y); pStatus-SetPaneText(1, str); dc.DPtoLP(&m_ptMouse); str.Format
6、 ( 逻辑坐标X=%i * 0.1mm, Y=%i * 0.1mm, m_ptMouse.x, m_ptMouse.y); pStatus-SetPaneText(2, str); 25. 如何用 VC+ 动态修改应用程序菜单 问题提出 本文将介绍一些使用CMenu 的方法 ,如查找指定菜单,在指定选项前添加菜单项. 解决方法 使用 CWnd:GetMenu( ) 访问主菜单, GetMenu( ) 返回指向CMenu 对象的指针,它有一些成员函数,允许我们修改一个菜单。1) 如何实现找到一个菜单项: 步骤如下 : /动态修改菜单: / Get the Main Menu CMenu* pMa
7、inMenu = AfxGetMainWnd()-GetMenu(); CMenu* pSubMenu = NULL; int i; for (i=0; iGetMenuItemCount(); i+) pSubMenu = pMainMenu-GetSubMenu(i); if (pSubMenu & pSubMenu-GetMenuItemID(0) = ID_FILE_NEW) break; CString s; s.Format(%d,i);/菜单项的位数 . AfxMessageBox(s); ASSERT(pSubMenu); 2) 动态编辑菜单 : 名师资料总结 - - -精品资
8、料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 30 页 - - - - - - - - - 步骤如下 (可以用上例的pSubMenu, 要加的菜单你自己定义.): 1) 添加一个称为Wzd2,命令 ID 为 IDC_NAME_NEW1的菜单命令到该菜单中,可以用: pSubMenu-AppendMenu(0,IDC_NAME_NEW1,New&1); 2) 在 New1 前插入 New2 ,可以用 : pSubMenu-InsertMenu(IDC_NAME_NEW1,MF_BYCOMMAND,ID
9、C_NAME_NEW2, New&2); 3) 把 New1 改变成 New3 ,可以用 : pSubMenu-ModifyMenu(IDC_NAME_NEW1,MF_BYCOMMAND,IDC_NAME_NEW3, New&3); 4) 删除该菜单中第二项,可以用: pSubMenu-RemoveMenu(1,MF_BYPOSITION); 26. VC+ 中的 3D 按钮的编程运行 AppWizard 生成一个基于对话框的test 工程, 在对话框中加入一个CButton 控件。 在 CButton控件的 General 属性页将控件的ID 改为 IDC_3DTEXTBTN, Captio
10、n 改为 “ 谁与争疯 ” , 在控件 Styles属性页选中OwnerDraw ,其余设置保持默认。用 classwizard 创建一个新类:C3dTextButton ,基类为 CButton 。为 C3dTextButton 类添加一个protected 的函数 void Draw(CDC* pDC, const CRect& rect, UINT state)。如下所示编写代码:void C3dTextButton:Draw(CDC *pDC, const CRect &rect, UINT state) CString text; GetWindowText(text); int l
11、=text.GetLength(); CRect rectClient=rect; /获得控件的字体CFont* pFont=GetFont(); /确定所选字体有效高度和宽度LOGFONT logfont; pFont-GetObject(sizeof(LOGFONT),&logfont); if(logfont.lfHeight=0)logfont.lfHeight=20; logfont.lfWidth=0;/宽度设为 0,宽度值由高度确定logfont.lfWeight=1000; logfont.lfEscapement=logfont.lfOrientation=0; CFont
12、tryfont; VERIFY(tryfont.CreateFontIndirect(&logfont); CFont* pFontOld=pDC-SelectObject(&tryfont); /根据控件大小,调整字体的高度,使文本与控件协调CSize textSizeClient=pDC-GetTextExtent(text,l); if(rectClient.Width()*textSizeClient.cyrectClient.Height()*textSizeClient.cx) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - -
13、 - - 名师精心整理 - - - - - - - 第 4 页,共 30 页 - - - - - - - - - logfont.lfHeight=:MulDiv(logfont.lfHeight,rectClient.Height(),textSizeClient.cy); else logfont.lfHeight = :MulDiv(logfont.lfHeight,rectClient.Width(),textSizeClient.cx); /创建并选择协调后的字体CFont font; font.CreateFontIndirect(&logfont); pDC-SelectObje
14、ct(&font); textSizeClient=pDC-GetTextExtent(text,l); /确定文本与控件边界的距离minx,miny int minx=rectClient.left+(rectClient.Width()-textSizeClient.cx)/2; int miny=rectClient.top+(rectClient.Height()-textSizeClient.cy)/2; int oldBkMode=pDC-SetBkMode(TRANSPARENT); COLORREF textcol=:GetSysColor(COLOR_BTNTEXT); CO
15、LORREF oldTextColor=pDC-SetTextColor(textcol); int cx = minx; int cy = miny; int s=(state&ODS_SELECTED)?-1:+1; cx+= 3; cy+= 3; /实现 3D 效果pDC-SetTextColor(:GetSysColor(COLOR_3DDKSHADOW); pDC-TextOut(cx-s*2,cy+s*2,text); pDC-TextOut(cx+s*2,cy-s*2,text); pDC-TextOut(cx+s*2,cy+s*2,text); pDC-SetTextColor
16、(:GetSysColor(COLOR_3DHILIGHT); pDC-TextOut(cx+s*1,cy-s*2,text); pDC-TextOut(cx-s*2,cy+s*1,text); pDC-TextOut(cx-s*2,cy-s*2,text); pDC-SetTextColor(:GetSysColor(COLOR_3DSHADOW); pDC-TextOut(cx-s*1,cy+s*1,text); pDC-TextOut(cx+s*1,cy-s*1,text); pDC-TextOut(cx+s*1,cy+s*1,text); pDC-SetTextColor(:GetSy
17、sColor(COLOR_3DLIGHT); pDC-TextOut(cx,cy-s*1,text); pDC-TextOut(cx-s*1,cy,text); pDC-TextOut(cx-s*1,cy-s*1,text); pDC-SetTextColor(textcol); /输出标题pDC-TextOut(cx,cy,text); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 30 页 - - - - - - - - - /恢复设备描述表pDC-SetTextC
18、olor(oldTextColor); pDC-SetBkMode(oldBkMode); pDC-SelectObject(pFontOld); 用 classwizard 重载 C3dTextButton 类的 DrawItem 函数。编写代码如下所示:void C3dTextButton:DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) CDC* pDC=CDC:FromHandle(lpDrawItemStruct-hDC); ASSERT_V ALID(pDC); CRect rectClient=lpDrawItemStruct-rcItem;
19、 Draw(pDC,rectClient,lpDrawItemStruct-itemState); 用 classwizard 为 IDC_3DTEXTBTN建立一个 C3dTextButton 控件变量m_3dTextButton1 。把“3dTextButton.h ”加入 testDlg 头文件。编译并测试应用程序。27. 如何正确的得到ComBox 的指针CComboBox *mComb = (CComboBox*)GetDlgItem(IDC_DuanCB); CComboBox *mComb = (CComboBox*):GetDlgItem(m_hWnd,IDC_DuanCB);
20、 28. 如何让对话框中的CEdit 控件类接收对话框的消息/ / 如何让对话框中的CEdit 控件类接收对话框的消息/ 1、在对话框中增加一个ID 为 IDC_EDIT1 的 CEdit1 控件2、通过 ClassWizard 生成一个基于CEdit 的新类 CMyEdit, CMyEditm_wndEdit; 3、在对话框OnInitDialog() 中,将 m_wndEdit 子类化,使其能够接受对话框的消息。m_wndEdit.SubclassDlgItem (IDC_EDIT1,this); 29.利用 WM_CTLCOLOR消息实现编辑控制(Edit Control )的文本与背景
21、色的改变首先要明白:WM_CTLCOLOR是一个由控制(Control) 发送给它父窗口的通知消息(Notification message)。实现步骤:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 30 页 - - - - - - - - - 生成一个标准的单文档应用程序框架,假设应用程序的名称为Color。我将利用它的About 对话框做示范。在About dialog 中添加两个Edit control, 设定其 ID 为 IDC_EDIT1 与 IDC_EDIT
22、2 。第一种方法 (对应于IDC_EDIT1): 按照标准的Windows 编程,由其父窗口的消息处理函数负责处理 WM_CTLCOLOR消息。1. 在 CAboutDlg中添加一个数据成员:HBRUSH m_brMine; 2. 利 用 向 导 映 射AboutDlg的WM_CTLCOLOR消 息 , 产 生 函 数 : HBRUSH CAboutDlg:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);pDC 是 AboutDlg的设备上下文,pWnd 是 AboutDlg中发送该消息的control 指针, nCtlColor 市Contr
23、ol 的类型编码。对其进行如下修改:HBRUSH CAboutDlg:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) if (pWnd-GetDlgCtrlID() = IDC_EDIT1) & (nCtlColor = CTLCOLOR_EDIT) COLORREF clr = RGB(255,0,0); pDC-SetTextColor(clr);/设置红色的文本clr = RGB(0,0,0); pDC-SetBkColor(clr);/设置黑色的背景m_brMine = :CreateSolidBrush(clr); return m_
24、brMine;/作为约定,返回背景色对应的刷子句柄 else HBRUSH hbr = CDialog:OnCtlColor(pDC, pWnd, nCtlColor); return hbr; 第二种方法 (对应于 IDC_EDIT2): 利用 MFC 4.0 的新特性 : Message reflection 。1.利用向导添加一个新的类:CColorEdit ,基类为CEdit; 2.在 CColorEdit 中添加一个数据成员: HBRUSH m_bkBrush; 3.利用向导映射CColorEdit的=WM_CTLCOLOR消息,产生函数:HBRUSH CColorEdit:CtlC
25、olor(CDC* pDC, UINT nCtlColor); 对其进行如下修改:HBRUSH CColorEdit:CtlColor(CDC* pDC, UINT nCtlColor) COLORREF clr = RGB(0,0,0); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 30 页 - - - - - - - - - pDC-SetTextColor(clr);/设置黑色的文本clr = RGB(255,0,0); pDC-SetBkColor(clr);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年VC编程技巧 2022 VC 编程 技巧
限制150内