zoukankan      html  css  js  c++  java
  • (转)MFC技巧学习<四>

    41.如何禁止对话框关闭按钮和浮动工具条上的系统菜单
    1、禁止对话框中的关闭按钮有二种方法。
    第一种方法,用ModiftMenu()涵数来实现:

    CMenu* pMenu = this->GetSystemMenu(FALSE);
    pMenu->ModifyMenu(SC_CLOSE,MF_BYCOMMAND | MF_GRAYED );
    第二种方法,用EnableMenuItem()涵数来实现:
    CMenu* pMenu = this->GetSystemMenu(FALSE);
    pMenu->EnableMenuItem( SC_CLOSE, MF_BYCOMMAND|MF_GRAYED);
    

    2、禁止浮动工具条上的系统菜单。
    新建一个CToolBar的派生类CxxToolBar,在新类中的左键双击(CxxToolBar::OnLButtonDblClk(...))
    和左键单击(CxxToolBar:: OnLButtonDown(...))涵数中分别加入下面代码既可:

    if (IsFloating()) //工具条正在浮动状态中
    {
      CWnd* pMiniFrame;
      CWnd* pDockBar;
      pDockBar = GetParent();
      pMiniFrame = pDockBar->GetParent();
      //去除其上系统菜单
      pMiniFrame->ModifyStyle(WS_SYSMENU, NULL);
      //重绘工具条
      pMiniFrame->ShowWindow(SW_HIDE);
      pMiniFrame->ShowWindow(SW_SHOW);
    }

    3、禁止窗口最大化按钮

    在PreCreateWindow()涵数中去掉WS_MAXIMIZEBOX风格显示既可。
    BOOL CxxFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
    {
      cs.style &= ~WS_MAXIMIZEBOX;
      return CFrameWnd::PreCreateWindow(cs);
    }


    42.如何拷贝一个工程的对话框资源到另一个工程中?
     有两种方法可以实现:
     1)你可以直接拷贝resource,用VC++以文本的方式或者直接用文本编辑器打开.rc文件,将有关的片段从
    一个工程拷贝到另一个工程.你可以通过查找如下字样的片段(此片段用来定义对话框资源)来拷贝你要
    的部分:
     IDD_MYDIALOG_ID DIALOG DISCARDABLE 0, 0, 235, 55
     这里的IDD_MYDIALOG_ID是你的对话框的ID,将到此片段结尾的部分全拷下来,通常你还要给新的工程
    加一个ID(通过DevStudio的工具或者直接修改resource.h文件).
     2)可以通过DevStudio的copy/paste功能.首先,在编辑器以"auto"模式打开.rc文件,这时resource
    正确的显示出来.然后,选中要拷贝的对话框的ID,在Edit菜单里选Copy或者按住Ctrl+C.然后打开目标
    resource文件,在Edit菜单里选Paste或者按住Ctrl+V.

    43.如何实现点一下对话框外面的区域,自动隐藏对话框?
     [问题提出]
      如果想在点击对话框外面的地方使得对话框关闭,该如何做?
     [解决方法]
      试试下面的代码,原理是在激活对话框时,捕获鼠标的动作,当鼠标点击时判断是否点击在对话框外,是的话就释放对话框.
     [程序实现]
      建立名为My的对话框程序.实现如下步骤:
      在MyDlg.h中加入:

      class CShowWindow1Dlg : public CDialog
      {
       // Construction
       public:
         int m_cx;
         int m_cy;
         ......
      };

          在MyDlg.cpp中:

      //定义消息映象,处理鼠标单击及激活
      BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
        //{{AFX_MSG_MAP(CMyDlg)
        ON_WM_LBUTTONDOWN()
        ON_WM_ACTIVATE()
        //}}AFX_MSG_MAP
      END_MESSAGE_MAP()
      void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)
      {
        CRect rect;
        GetClientRect(&rect);
        rect.InflateRect(m_cx, m_cy);
        //Release dialog if the user click outside it.
        if(!rect.PtInRect(point))
        {
          EndDialog(IDCANCEL);
        }
        CDialog::OnLButtonDown(nFlags, point);
      }
      void CMyDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
      {
        CDialog::OnActivate(nState, pWndOther, bMinimized);
        if( nState == WA_ACTIVE || nState == WA_CLICKACTIVE)
          SetCapture();
        else
          ReleaseCapture();
      }
      BOOL CMyDlg::OnInitDialog()
      {
        CDialog::OnInitDialog();
        .....
        OSVERSIONINFO info;
        memset((char*)&info, 0, sizeof(OSVERSIONINFO));
        info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        if(GetVersionEx(&info))
        { //we don't run on Win32s, so check only two values
          if(info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
          { //On windows 95
           m_cx = GetSystemMetrics(SM_CXFIXEDFRAME);
           m_cy = GetSystemMetrics(SM_CYFIXEDFRAME);
          }
          else
          { //On NT
           m_cx = GetSystemMetrics(SM_CXDLGFRAME);
           m_cy = GetSystemMetrics(SM_CYDLGFRAME);
          }
        }
      }
    

       说明:
       1)WM_ACTIVATE消息在ClassWizard中没有,按如下步骤添加,右击CMyDlg类,选Add Windows Message Handle,接着在Filter for messages available to中选Window,在New Windows messages/events列表中就会出现WM_ACTIVATE,选中,点击Add Handler
       2)SM_CXDLGFRAME,SM_CYDLGFRAME  NT中取得有WS_DLGFRAMEstyle风格的窗口的高和宽 95中已经废弃而采用SM_CX_FIXEDFRAME和SM_CYFIXEDFRAME

    44. 初始化应用程序的大小
    如果想使应用程序界面(文档)在开始运行是按你的尺寸展现在屏幕上,
     添加代码如下:

     BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
     {
       int xsize=::GetSystemMetrics(SM_CXSCREEN);
       int ysize=::GetSystemMetrics(SM_CYSCREEN);
       cs.cx=xsize*5/10;
       cs.cy=ysize*5/10;
       cs.x=(xsize-cs.cx)/2;
       cs.y=(ysize-cs.cy)/2;  
     }

     其中的5/10是你的初始界面占屏幕的百分比,可以自己修改。如果想使应用程序大小固定添加cs.style&=~WS_THICKFRAME;


    45. 如何得到视图指针?
    [问题提出]
      现在你有一个多线程的Demo,你想在多线程里处理视图指针里的函数,我们给这个函数起个名字:Put();该如何实现呢?
      有两种方法可以实现你的要求:
      1)第一种方法:
      要是多线程不是在App.cpp里出现,那么要在多线程的.cpp中加上extern CYourApp theApp;

      //获得文档模板:
      POSITION curTemplatePos = theApp.GetFirstDocTemplatePosition();
      CDocTemplate *m_doc=theApp.GetNextDocTemplate(curTemplatePos);
      //获得文档:
      curTemplatePos=m_doc->GetFirstDocPosition();
      CYourDoc *m_pdoc=(CA8Doc*)m_doc->GetNextDoc(curTemplatePos);
      //获得视图:
      curTemplatePos=m_pdoc->GetFirstViewPosition();
      CYourView *m_pview=(CYourView*)m_pdoc->GetNextView(curTemplatePos);
      //调用视图函数:
      m_pview->Put();
    

      2)第二种方法:

      //获得窗体指针:
      CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
      //获得与该窗体符合的视图:
      CYourView *m_pView = (CYourView *) pFrame->GetActiveView();
      //调用视图函数:
      m_pView->Put();


    46. 如何使我的程序在启动时不创建一个新文档?
    [问题]
    如何使我的程序在启动时不创建一个新文档?
    [解答]
    在程序的InitInstance中的ProcessShellCommand函数之前加入:

    cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing

     

    47. 如何将标题栏上的右键菜单屏蔽掉?
     [解决方法]
      右键菜单是系统菜单,只要将其WS_SYSMENU的属性去掉即可.
     [程序实现]

      int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
      {
         ........
      long style = GetWindowLong(m_hWnd, GWL_STYLE);
         style &= ~WS_SYSMENU;
         SetWindowLong(m_hWnd, GWL_STYLE, style);
      return 0;
      }


    48.如何全屏显示(没有标题,没有菜单,没有工具条)
     [解决方法]
      重载CMainFrame的ActivateFrame函数:

      void CMainFrame::ActivateFrame(int nCmdShow) 
      {
         CRect cRectdesktop;
         WINDOWPLACEMENT windowplacement;
         ::GetWindowRect(::GetDesktopWindow(),&cRectdesktop);
         ::AdjustWindowRectEx(&cRectdesktop,GetStyle(),TRUE,GetExStyle());
         windowplacement.rcNormalPosition=cRectdesktop;
         windowplacement.showCmd=SW_SHOWNORMAL;
         SetWindowPlacement(&windowplacement); 
         CFrameWnd::ActivateFrame(nCmdShow);
      }


    49.如何设置有背景颜色的文本
    (1)[解决方法]
      用到了CDC::SetBkMode();
     [程序实现]

      void CMyView::OnDraw(CDC* pDC)
      {
        CMyDoc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        CRect rcView;//加這兩句
        GetClientRect(rcView);
        // TODO: add draw code for native data here
        CString str (_T("Perfect Text...")); 
        pDC->SetBkMode(TRANSPARENT); 
        rcView.OffsetRect (1,1); 
        pDC->SetTextColor(RGB (0,0,0)); 
        pDC->DrawText(str,str.GetLength(),rcView,DT_SINGLELINE | DT_CENTER | DT_VCENTER); 
        rcView.OffsetRect(-1,-1); 
        pDC->SetTextColor(RGB (255,0,0)); 
        pDC->DrawText(str,str.GetLength(),rcView,DT_SINGLELINE | DT_CENTER | DT_VCENTER); 
      }


    (2) 建立名为My的SDI或MDI,并响应WM_ERASEBKGND.

      BOOL CMyView::OnEraseBkgnd(CDC* pDC) 
      {
       // TODO: Add your message handler code here and/or call default
       CBrush Brush (RGB(114,147,171)); 
       // Select the brush into the device context . 
       CBrush* pOldBrush = pDC->SelectObject(&Brush); 
       // Get the area that needs to be erased . 
       CRect ViewClip; 
       pDC->GetClipBox(&ViewClip); 
       //Paint the area. 
       pDC->PatBlt(ViewClip.left,ViewClip.top,ViewClip.Width(),ViewClip.Height(),PATCOPY); 
       //Unselect brush out of device context . 
       pDC->SelectObject (pOldBrush ); 
       // Return nonzero to half fruther processing . 
       return TRUE;
       return CView::OnEraseBkgnd(pDC);
      }

      此方法也适合基类是EditView的SDI或MDI的情况,但是字体的颜色和底色不行.建议用WM_CTLCOLOR.


    50.串太长时往让其末尾显示一个省略号(在SDI或MDI的View中)
     [问题提出]
      如何在串太长时往让其末尾显示一个省略号(在SDI或MDI的View中)?
     [程序实现]
      建立名为My的SDI或MDI工程.
     

     void CMyView::OnDraw(CDC* pDC)
      {
        CMyDoc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        // TODO: add draw code for native data here
        pDC->DrawText(CString("It's a long string,so we will add a '...' at the end."),CRect (110, 110, 180, 130),DT_LEFT | DT_END_ELLIPSIS); 
        //Add ellpsis to middle of string if it does not fit 
        pDC->DrawText(CString("It's a long string,so we will add a '...' at the end."),CRect (110, 140, 300, 160),DT_LEFT | DT_PATH_ELLIPSIS); 
      }

  • 相关阅读:
    iqueryable lambda表达式
    win10安装后耳机有声音而外放无声音
    Coursera机器学习week11 笔记
    Coursera机器学习week10 单元测试
    Coursera机器学习week10 笔记
    Coursera机器学习week9 编程作业
    Coursera机器学习week9 单元测试
    Coursera机器学习week9 笔记
    Coursera机器学习week8 编程作业
    Coursera机器学习week8 单元测试
  • 原文地址:https://www.cnblogs.com/leven20061001/p/2728123.html
Copyright © 2011-2022 走看看