• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

带有菜单的EDIT控件实现

发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 13次 | 进入软件测试论坛讨论

领测软件测试网

     eidt控制是vc中经常使用的文本输入输出交互控制,有的时候,我们为了实现对输入,输出有特殊的操作过程,那么,原来的edit控制的功能也许就不一定能实现我们的要求,或者实现的不是那么灵活,因此,我们也经常在edit控件的基础上继承基类来做一些配生的子类情况下实现我们自己在工程中需要的特殊的要求。本文介绍一个可以带有菜单操作的edit类的实现过程,基础类eidt基类,在继承的子类上添加各个菜单操作功能,其中的菜单操作也是为了实现多edit中的文本进行各种文本的常规操作。

     这个类的实现过程如下:

。h文件

#if !defined(AFX_MENUEDIT_H__8EA53611_FD2B_11D4_B625_D04FA07D2222__INCLUDED_)
#define AFX_MENUEDIT_H__8EA53611_FD2B_11D4_B625_D04FA07D2222__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif

class CMenuEdit : public CEdit
{
public:
  CMenuEdit() {};

protected:
  virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
  afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);

  DECLARE_MESSAGE_MAP()
};

#endif

。cpp文件

#include "stdafx.h"
#include "MenuEdit.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define MES_UNDO    _T("&Undo")
#define MES_CUT     _T("Cu&t")
#define MES_COPY    _T("&Copy")
#define MES_PASTE    _T("&Paste")
#define MES_DELETE   _T("&Delete")
#define MES_SELECTALL  _T("Select &All")
#define ME_SELECTALL  WM_USER + 0x7000

BEGIN_MESSAGE_MAP(CMenuEdit, CEdit)
  ON_WM_CONTEXTMENU()
END_MESSAGE_MAP()

void CMenuEdit::OnContextMenu(CWnd* pWnd, CPoint point)
{
  SetFocus();
  CMenu menu;
  menu.CreatePopupMenu();
  BOOL bReadOnly = GetStyle() & ES_READONLY;
  DWORD flags = CanUndo() && !bReadOnly ? 0 : MF_GRAYED;
  menu.InsertMenu(0, MF_BYPOSITION | flags, EM_UNDO,
    MES_UNDO);

  menu.InsertMenu(1, MF_BYPOSITION | MF_SEPARATOR);

  DWORD sel = GetSel();
  flags = LOWORD(sel) == HIWORD(sel) ? MF_GRAYED : 0;
  menu.InsertMenu(2, MF_BYPOSITION | flags, WM_COPY,
    MES_COPY);

  flags = (flags == MF_GRAYED || bReadOnly) ? MF_GRAYED : 0;
  menu.InsertMenu(2, MF_BYPOSITION | flags, WM_CUT,
    MES_CUT);
  menu.InsertMenu(4, MF_BYPOSITION | flags, WM_CLEAR,
    MES_DELETE);

  flags = IsClipboardFormatAvailable(CF_TEXT) &&
    !bReadOnly ? 0 : MF_GRAYED;
  menu.InsertMenu(4, MF_BYPOSITION | flags, WM_PASTE,
    MES_PASTE);

  menu.InsertMenu(6, MF_BYPOSITION | MF_SEPARATOR);

  int len = GetWindowTextLength();
  flags = (!len || (LOWORD(sel) == 0 && HIWORD(sel) ==
    len)) ? MF_GRAYED : 0;
  menu.InsertMenu(7, MF_BYPOSITION | flags, ME_SELECTALL,
    MES_SELECTALL);

  menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON |
    TPM_RIGHTBUTTON, point.x, point.y, this);
}

BOOL CMenuEdit::OnCommand(WPARAM wParam, LPARAM lParam)
{
  switch (LOWORD(wParam))
  {
  case EM_UNDO:
  case WM_CUT:
  case WM_COPY:
  case WM_CLEAR:
  case WM_PASTE:
    return SendMessage(LOWORD(wParam));
  case ME_SELECTALL:
    return SendMessage (EM_SETSEL, 0, -1);
  default:
    return CEdit::OnCommand(wParam, lParam);
  }
}


延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网