zoukankan      html  css  js  c++  java
  • VC学习笔记:定制窗体外观

    VC学习笔记:定制窗体外观

     SkySeraph NOV.4th 2010  HQU

    Email-zgzhaobo@gmail.com  QQ-452728574

    Latest Modified Date:NOV.4th 2010 HQU

    基础操作[1]

    • 修改应用程序窗口外观/SDI

    ①在窗口创建之前修改:在Frame类的PreCreateWindow成员函数中进行[虚函数]

    修改窗口大小:

    cs.cx = 800;

    cs.cy = 600;

    修改窗口标题:

    cs.style &= ~FWS_ADDTOTITLE;//cs.style = WS_OVERLAPPEDWINDOW ; //通过MSDN输入window style,查看SDI默认window style

    cs.lpszName ="Hello World!  @SkySeraph";

    ②在窗口创建之后修改:在Frame类的OnCreate函数中添加

    SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) & ~WS_MAXIMIZEBOX);//去掉最大化按钮

    • 修改窗口光标、图标和背景/SDI

    //说明:光标在Frame类进行,图标和背景在View类进行

    ①在窗口创建之前修改:

    在Frame类的PreCreateWindow函数中修改

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

    在View类的PreCreateWindow函数中修改

    cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW&CS_VREDRAW,LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),0);

    函数说明:

    LPCTSTR AFXAPI AfxRegisterWndClass(UINT nClassStyle,HCURSOR hCursor = 0,HBRUSH hbrBackground = 0,HICON hIcon = 0 );

    ②在窗口创建之后修改:

    在Frame类的OnCreate函数中修改

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

    在View类的OnCreate函数中修改

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

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

    • 模拟动画图标/SDI

    ①加载三幅位图资源,ID分别为IDI_ICON1~3,在frame类定义一个HICON类型私有成员变量m_hIcons[3],用来存放三幅图标的句柄

    ②在frame类OnCreate函数中加载位图,并在OnCreate函数定义前加声明 extern CStyleApp theApp;//声明一个外部源文件定义的变量

    //技巧:三种方法获得当前实例句柄

    m_hIcons[0] = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));

    //自定义图标,第一个参数应为应用程序当前实例句柄,利用MAKEINTRESOURCE宏将资源ID转换为资源标识符字符串

    m_hIcons[1] = LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2));

    //在MFC SDI中,有一个表示应用程序本身的类,本例中就是CStyleApp,它派生于CWinApp。该类有一个数据成员m_hInstance,标识了应用程序当前的实例,也就是说,如果我们能够获取到应用程序的CWinApp对象,就可以利用这个对象来调用它的m_hInstance数据成员,从而得到当前实例的句柄。而CStyleApp的源文件中已经定义了一个CStyleApp类型的全局变量theApp。我们可以利用这个全局对象调用其内部的数据成员

    //在一个源文件中调用另一个源文件的全局变量,必须再调用前声明这个变量是在外部定义的,在Frame类前OnCreate函数定义之前定义 extern CStyleApp theApp;

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

    ③再设置定时器[frame类OnCreate函数中]

    SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[0]);//默认显示

    SetTimer(1,1000,NULL);

    ④为frame类添加定时器消息WM_TIMER的响应函数

    void CMainFrame::OnTimer(UINT_PTR nIDEvent)

    {

    // TODO: 在此添加消息处理程序代码和/或调用默认值

    static int index=0;//定义一个图标索引变量   //此处也可以定义成Frame类的成员变量

    //静态局部变量存放在程序的数据区中,而不是栈中分配空间

    SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[index]);//HICON转换为LONG型

    index=++index%3;

    //如果希望把某个数值时钟限定在一个范围内,最好的办法就是取模运算%。例如希望某个变量的取值在0~10之间变化,只需要对11取模即可,取模即取余

    CFrameWnd::OnTimer(nIDEvent);

    }

    Author:         SKySeraph

    Email/GTalk: zgzhaobo@gmail.com    QQ:452728574

    From:         http://www.cnblogs.com/skyseraph/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,请尊重作者的劳动成果。

  • 相关阅读:
    《孙子兵法》【行军第九】
    《孙子兵法》【虚实第六】
    《孙子兵法》【地形第十】
    企业无线局域网的搭建
    企业无线局域网的搭建
    UDDI
    (转载)Linux:Ldd命令介绍及使用方法
    (转载)传递给const引用形参的实参要求
    (转载)千万不要把bool设计成函数参数
    (转载)Linux下如何修改终端提示符?
  • 原文地址:https://www.cnblogs.com/skyseraph/p/1870871.html
Copyright © 2011-2022 走看看