zoukankan      html  css  js  c++  java
  • 单/多文档的窗体类属性修改(VC_MFC)

    (本章节中例子都是用 VS2005 编译调试的)

    窗口与窗口类关系

    与窗口类关系 MFC 类窗口类中封装了一个窗口句柄,窗口销毁时候,与之对应的MFC类窗口对象看其生命是否结束,但是MFC类窗口类对象销毁时候,与之对应的窗口一定会被销毁

    修改程序外观

    • 修改应用程序窗口图标,标题栏在框架类中实现
    • 修改应用程序背景与光标(因为视觉类窗口始终覆盖在框架类上) 在视类中实现

    设置窗口类属性

    在窗体生成前且窗口类注册前

    在CMainFrame的PreCreateWindow函数中进行:

    • 第一种 修改函数中传递的CREATESTRUT结构的对象cs,修改cs中的对应属性,便可以达到修改窗体类的对应属性(CREATESTRUT结构类似于Win32编制中的WNDCLASS结构)
    • 第二种 自身定义一个 WNDCLASS 结构成员变量,并注册此窗体结构变量,(用RegisterClass函数注册窗体类),后 cs.lpszClass = "窗体类名"
    • 第三种 MFC提供了一个全局函数,用来设定窗口的类型,光标,背景和图标 AfxRegisterWndClass 函数,然后 cs.lpszClass = AfxRegisterWndClass();

    代码示例(用VS2005调试):

    首先先看看未被改变的时,工程生成的单文档示例的运行结果:

    第一种:(使初始化程序无菜单栏)

    在CMainFrame的PreCreateWindow函数中添加下添加:

    cs.hMenu = NULL;

     运行结果:

    第二种:(使初始化程序无菜单栏)

    在CMainFrame的PreCreateWindow函数中添加下添加:

    WNDCLASS wndclass;
    
    WNDCLASS wndcls;
    wndcls.cbClsExtra=0;
    wndcls.cbWndExtra=0;
    wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    wndcls.hCursor=LoadCursor(NULL,IDC_ARROW);
    wndcls.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    wndcls.hInstance=AfxGetInstanceHandle();
    wndcls.lpfnWndProc=::DefWindowProc;
    wndcls.lpszClassName=L"test";
    wndcls.lpszMenuName=NULL;
    wndcls.style=CS_HREDRAW | CS_VREDRAW;
    
    RegisterClass(&wndcls);
    
    cs.lpszClass=L"test";

    运行结果同上

    第三种:(修改程序图标)

    首先为工程添加一个图标资源(资源 ID 为 IDI_ICON1),资源视图如下:

    然后在CMainFrame的PreCreateWindow函数中添加下添加:(AfxRegisterWndClass)

    cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,0,0,LoadIcon(NULL,IDI_WARNING));

     运行结果:

    在窗体显示前且窗体类注册后

    说明

    在类中的 OnCreate 函数实现,用SetClassLong函数设置窗体类的属性

    代码示例(用VS2005调试):

    首先先看看未被改变的时,工程生成的单文档示例的运行结果:

    接着需要修改窗口图标,先为工程添加一个图标资源(资源 ID 为 IDI_ICON1),资源视图如下:

    然后在 CMainFrame 的 OnCreate 函数中添加下添加:(SetWindowLong)

    SetClassLong(m_hWnd,GCL_HICON,(LONG)AfxGetApp()->LoadIcon(IDI_ICON1));

    运行结果:

    在窗体生成后

    • SetWindowLong 函数实现
    • GetWindowLong 函数获得当前窗体属性
    • 在 MFC 中还提供 ModifyStyleEx 修改窗口的扩展属性(你可以在 OnCreate 函数中调用它去掉 WS_EX_TOOLWINDOW,然后便可以在任务栏中去掉显示的本窗体图标)

    实现代码(用VS2010调试):

    首先先看看未被改变的时,工程生成的单文档示例的运行结果:

    接着需要修改窗口属性,为文档程序在主菜单栏上添加个 显示/隐藏系统栏 的菜单项,完成显示/隐藏系统栏的这个功能.菜单资源(菜单资源 ID 为 IDR_MAINFRAME,菜单项 ID 为 ID_CH)视图如下:

    为菜单项 显示/隐藏系统栏 在框架类中添加事件响应函数(添加在框架类中,即 MainFrm 中),后在事件响应函数中添加相关操作,具体代码如下:(SetWindowLong)

    View Code
    //获得窗口大小
    CRect rc;
    this->GetWindowRect(&rc);
    //判断窗体是否有系统栏
    if(GetWindowLong(GetSafeHwnd(),GWL_STYLE) & WS_CAPTION)
    {
        //去掉标题栏
        SetWindowLong(this->GetSafeHwnd(),GWL_STYLE,GetWindowLong(GetSafeHwnd(),GWL_STYLE) & ~WS_CAPTION);
        //窗体高度减 30 个像素点,即为窗体减去标题栏的高度
        rc.top+=30;
    
    }
    else
    {
        //添加标题栏栏
        SetWindowLong(this->GetSafeHwnd(),GWL_STYLE,GetWindowLong(GetSafeHwnd(),GWL_STYLE) | WS_CAPTION);
        //窗体高度加 30 个像素点,即为窗体加上标题栏的高度
        rc.top-=30;
    }
    //移动窗体到新矩形区中
    this->MoveWindow(&rc);

    运行结果:

    注意:

    函数在窗口完全创建完成后第一个调用的函数并且在OnPaint前相应

  • 相关阅读:
    python的模块future用法实例解析
    strcmp函数和memcmp函数的用法区别及联系
    esp8266 smartconfig-智能配网分析和使用及注意事项
    ubuntu 18.04 安装并配置adb
    Markdown的常用方法总结
    mac下使用minicom几个注意事项
    最强Linux shell工具Oh My Zsh 指南
    ESP8266源码分析--打印的基本用法
    atom 在Ubuntu 18.04 上安装及基本使用
    ubuntu 查看端口被占用并删除端口
  • 原文地址:https://www.cnblogs.com/kzang/p/2788900.html
Copyright © 2011-2022 走看看