• VC++ 定制应用程序的外观


    一.在窗口创建之前改变窗口的大小和标题

     要改变应用程序窗口的大小可以通过在PreCreatWindowl函数中修改CREATSTRUCT结构体变量成员的值

      BOOL CMainFrame::PreCreatWindow(CREATSTRUCT cs)

      {

         if(!CFrameWnd::PreCreatWindow(cs))

          return FALSE;

        (在这个函数的地方改变CREATSTRUCT结构体变量的值)

          cs.cx=300;//把cx的值改为300

          cs.cy=200;//把cy的值改为200

          return TRUE;

       }

     2.改变应用程序窗口的标题

       要改变应用窗口的标题可以通过改变CREATSTRUCT结构体成员变量的 lpszName参数的值来实现。

       BOOL CMainFrame::PreCreatWindow(CREATSTRUCT cs)

      {

         if(!CFrameWnd::PreCreatWindow(cs))

          return FALSE;

        (在这个函数的地方改变CREATSTRUCT结构体变量的值)

          cs.cx=300;//把cx的值改为300

          cs.cy=200;//把cy的值改为200

          cs.style&=~FWS_ADDTOTITLE;//其中FWS_ADDTOTITLE是指示将文档的标题加到窗口上,这是MFC默认的                               //式,所以需要将这个默认的方式去掉以后才可以加自己的标题。

          cs.lpszName="李现会";

          return TRUE;

       }

    二 在窗口创建之后改变窗口的大小和标题

        1.首先介绍一下 SetWindowLong();函数;

        SetWindowLong(HWND hWnd,int index, LONG dwNewLong );SetWindowLong()实现了改变窗口的属性的功能。

       第一个参数是指向了 需要改变的窗口的句柄。

       第二个参数是要改变窗口的具体的方面。

       第三个参数是要把该窗口改变成什么样子;

       通常SetWindowLong();函数可以在窗口创建之后改变窗口的外观。

       在单文档文件中,通常是在PreCreatWindow函数中实现“预创建”窗口。而在OnCreat()函数中,当执行到return 0;语句的时候已经创建完成了窗口。所以在OnCreat()函数中调用SetWindowLong();函数来实现窗口创建完成之后的改变窗口的外观。

      所以在OnCreat()函数中调用SetWindowLong()函数具体用法如下:

       int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
     if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
      return -1;
     
     if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
      | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
      !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
     {
      TRACE0("Failed to create toolbar ");
      return -1;      // fail to create
     }

     if (!m_wndStatusBar.Create(this) ||
      !m_wndStatusBar.SetIndicators(indicators,
        sizeof(indicators)/sizeof(UINT)))
     {
      TRACE0("Failed to create status bar ");
      return -1;      // fail to create
     }

     // TODO: Delete these three lines if you don't want the toolbar to
     //  be dockable
     m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
     EnableDocking(CBRS_ALIGN_ANY);
     DockControlBar(&m_wndToolBar);
     SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW);//在MFC中如果想在窗口创建之后改变窗口的外观,可以通过调用SetWindowLong();函数
     return 0;
    }

    其中 WS_OVERLAPPEDWINDOW定义如下:

      #define WS_OVERLAPPEDWINDOW(WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX | WS_MAXIMIZE | WS_THICKFRAME);

      其中 WS_SYSMENU是系统菜单,不包括按钮。

      使得窗口可以最大化和最小化。

      2.用SetWindowLong()和GetWindowLong()两个函数结合来改变窗口的某些属性;

       如法如下:

      
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
     if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
      return -1;
     
     if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
      | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
      !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
     {
      TRACE0("Failed to create toolbar ");
      return -1;      // fail to create
     }

     if (!m_wndStatusBar.Create(this) ||
      !m_wndStatusBar.SetIndicators(indicators,
        sizeof(indicators)/sizeof(UINT)))
     {
      TRACE0("Failed to create status bar ");
      return -1;      // fail to create
     }

     // TODO: Delete these three lines if you don't want the toolbar to
     //  be dockable
     m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
     EnableDocking(CBRS_ALIGN_ANY);
     DockControlBar(&m_wndToolBar);
     SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE)&~WS_MAXIMIZEBOX);// 在MFC中如果想在窗口创建之后改变窗口的外观,可以通过调用SetWindowLong();函数
     return 0;
    }可以看到在SetWindowLong();函数的第三个参数处实用了GetWindowLong();函数,该函数返回的是函数的类型,该类型和 WS_MAXIMIZEBOX的去反相与,成为SetWindowLong()函数的第三个参数,所以新设置的窗口不再有最大化这个选项了。

  • 相关阅读:
    开源项目
    [Accessibility] Missing contentDescription attribute on image [可取行]失踪contentDescription属性图像
    Android 布局 中实现适应屏幕大小及组件滚动
    EF 错误记录
    EasyUI 加载时需要显示和隐藏 panel(面板)内容破版问题
    IE 报表缩放后页面破版
    VS 2017 引入nuget 问题
    SSRS 报表显示页面 asp net session丢失或者找不到 asp net session has expired or could not be found()
    log4net 配置
    网站
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/3843422.html
Copyright © 2020-2023  润新知