• 第9章 定制应用程序外观


    参考: https://blog.csdn.net/u014162133/article/details/46573873

    1、修改外观和图标可以在MainFrm中进行,而修改背景和光标只能在View中进行。为什么?因为view的显示挡在了MainFrame的前面。

    a.在MainFrame

    PreCreateWindow()中,在窗口创建之前,用重新注册窗口类的方法,比较麻烦。在PreCreateWindow()中修改也可以用简单的方法,用全局函数

    //cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,0,0,

    // LoadIcon(NULL,IDI_WARNING));在窗口创建之后,在OnCreate()中修改

    //SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW);

    //SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) & ~WS_MAXIMIZEBOX);

    // SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR));

    b.在View

    PreCreateWindow()中

    //cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,

    // LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),NULL);

    cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW);

        OnCreate()中

    SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));

    SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_HELP));

    2、创建一个不断变化的图标。用定时器和SetClassLong完成

      a.准备三个图标文件,放在RES文件夹,Insert->Resource-三个图标,

      b.在CMainFrame中增加图标句柄数组,m_hIcons[3]

    m_hIcons[0]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));//MAKEINTRESOURCE是一个宏,它将整数转化为Win32的资源类型,简单的说它是一个类型转换

    #define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i)))

    m_hIcons[1]=LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2));//此处需要用到theAPP对象,故要在文件中声明extern CStyleApp theApp;

    m_hIcons[2]=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3));

    然后将其初始化

      c.然后在定时器中实现

    3、工具栏的编程

      a.加入分隔符的方法,向右拖动即可;

      b.删除按纽的方法,拖出即可。

    4.创建一个新的工具栏的方法

      a.插入一个工具栏,画出其图形。

      b.在头文件中,定义CToolBar m_newToolBar

      c.在MainFrm.cpp的OnCreate()中调用

    if (!m_newToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_RIGHT

      | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||

      !m_newToolBar.LoadToolBar(IDR_TOOLBAR1))

    {

      TRACE0("Failed to create toolbar ");

      return -1;      // fail to create

    }  

      d.点击“新的工具栏”菜单时,隐藏工具栏。两种方法

      第一种

    if(m_newToolBar.IsWindowVisible())

    {

      m_newToolBar.ShowWindow(SW_HIDE);

    }

    else

    {

      m_newToolBar.ShowWindow(SW_SHOW);

    }

    RecalcLayout();

    DockControlBar(&m_newToolBar);*/

      第二种ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE);

      e.将菜单增加复选标记。在OnUpdateUI中加入代码

        pCmdUI->SetCheck(m_newToolBar.IsWindowVisible());

    5、状态栏编程

      a.Indicator[]数组中有状态栏的信息

      如果要增加,可以在String Table中加入一个IDS_Timer,然后将其加入到Indicator []中。

      b.在时间栏显示时间,代码略,比较简单

    6、进度栏

      a.增加成员变量,CProgressCtrl m_progress

      b.OnCreate m_progress.Create(WS_CHILD | WS_VISIBLE,// | PBS_VERTICAL, rect,&m_wndStatusBar,123);

    m_progress.SetPos(50);

      c.将其创建到状态栏的方法!如果在OnCreate()中创建,则不成立,因为获取矩形大小时失败。

      解决办法,用自定义消息:

        在MainFrm.h中#define UM_PROGRESS  WM_USER+1//WM_USER是一个界限

    消息函数原型声明:afx_msg void OnProgress()

        在MainFrm.cpp中

    ON_MESSAGE(UM_PROGRESS,OnProgress)

    然后实现这个函数

    void CMainFrame::OnProgress()

    {

    CRect rect;

    m_wndStatusBar.GetItemRect(2,&rect);

    m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH, rect,&m_wndStatusBar,123);

    m_progress.SetPos(50);

    }

       最后在OnCreate中调用 PostMessage(UM_PROGRESS);//不能用SendMessage()

       d.解决重绘时进度栏改变的问题。在OnPain()中重写代码

    CRect rect;

    m_wndStatusBar.GetItemRect(2,&rect);

    m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH, rect,&m_wndStatusBar,123);

    m_progress.SetPos(50);

    然后在定时器消息处理函数中加入

    m_progress.StepIt();

       e.显示鼠标位置。在View中增加OnMouseMove()处理函数

    CString str;

    str.Format("x=%d,y=%d",point.x,point.y);

    //((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);

    //((CMainFrame*)GetParent())->SetMessageText(str);

    //((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str);

    GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(str);

    7、加入启动画面

      Project-Component and ->Visual C++ Components->SplashScreen->插入

  • 相关阅读:
    bzoj 3308 九月的咖啡店
    8.13模拟赛
    8.10模拟赛
    8.9模拟赛
    8.8模拟赛
    Codeforces Round #406 (Div. 2) D. Legacy (线段树建图dij)
    BZOJ 2957: 楼房重建 (分块)
    SPOJ BGSHOOT
    Codeforces Round #404 (Div. 2) E. Anton and Permutation(树状数组套主席树 求出指定数的排名)
    Lightoj-1356 Prime Independence(质因子分解)(Hopcroft-Karp优化的最大匹配)
  • 原文地址:https://www.cnblogs.com/happykoukou/p/9298050.html
Copyright © 2020-2023  润新知