修改程序窗口的光标、图标、背景

在应用程序框架类中只能修改程序窗口的图标,在视图类中才能改变应用程序窗口的背景和光标;

1、在窗口创建之前修改

  方法一:

  编写自己窗口类并注册,然后让随后的窗口按照我们自己编写的窗口类去创建;在程序的框架类CMainFrame类的PreCreateWindow函数中实现:   

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    if( !CFrameWnd::PreCreateWindow(cs) )
        return FALSE;
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs
    
    //窗口类结构体
    WNDCLASSEX wcex={0};
    //窗口类结构体字节数
    wcex.cbSize=sizeof(wcex);
    //窗口类风格
    wcex.style=CS_HREDRAW|CS_VREDRAW;
    //窗口过程函数指针
    wcex.lpfnWndProc=::DefWindowProc;
    //窗口类附加数据缓冲区字节数
    wcex.cbClsExtra=0;
    //窗口附加数据缓冲区字节数
    wcex.cbWndExtra=0;
    //获取当前应用程序实例句柄
    wcex.hInstance=AfxGetInstanceHandle();
    //大图标句柄,若使用资源的ID须用MAKEINTRESOURCE进行类型转换
    wcex.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    //小图标句柄,若使用资源的ID须用MAKEINTRESOURCE进行类型转换
    wcex.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
    //光标句柄,若使用资源的ID须用MAKEINTRESOURCE进行类型转换
    wcex.hCursor=LoadCursor(NULL,IDC_ARROW);
    //背景刷句柄
    //wcex.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
    wcex.hbrBackground=GetSysColorBrush(COLOR_WINDOW);
    //菜单资源名,若使用资源的ID须用MAKEINTRESOURCE进行类型转换
    wcex.lpszMenuName=NULL;
    //窗口类名
    wcex.lpszClassName="MAIN";
    RegisterClassEx(&wcex);

    //将当前程序的窗口类的类名改为我们新注册的窗口类的类名
    cs.lpszClass="MAIN";

    return TRUE;
}

  运行发现仅修改了应用程序的图标,而背景和光标的修改须在覆盖在框架类窗口之上的视图类窗口中完成;在视图类CStyleView类创建窗口之前,在视图类的PreCreateWindow函数中将窗口类设为我们新注册的窗口类:  

BOOL CStyleView::PreCreateWindow(CREATESTRUCT& cs)
{
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs

    cs.lpszClass="MAIN";

    return CView::PreCreateWindow(cs);
}

  方法二:

  MFC提供了一个全局函数:AfxRegisterWndClass,用来设置程序窗口的类型、光标、背景、图标,返回值为注册后的类名;

  LPCTSTR AFXAPI AfxRegisterWndClass(

    UINT nClassStyle,

    HCURSOR hCursor = 0,

    HBRUSH hbrBackground = 0,

    HICON hIcon = 0

  );

  在框架类CMainFrame类的PreCreateWindow函数中修改程序窗口的图标:    

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    if( !CFrameWnd::PreCreateWindow(cs) )
        return FALSE;
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs
    
    cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,0,0,LoadIcon(NULL,IDI_WARNING));

    return TRUE;
}

  在视图类CStyleView类的PreCreateWindow函数中修改程序窗口的背景和光标:    

BOOL CStyleView::PreCreateWindow(CREATESTRUCT& cs)
{
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs

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

    return CView::PreCreateWindow(cs);
}

2、在窗口创建之后修改

  利用全局函数SetClassLong,重置指定窗口所属窗口类的WNDCLASSEX结构体中的数据成员的属性;

    DWORD SetClassLong(

    HWND hWnd,       //指定要设置新属性的窗口句柄

     int nIndex,      //指定要设置的属性为:GCL_HBRBACKGROUND/GCL_HCURSOR/GCL_HICON/GCL_STYLE

     LONG dwNewLong   //指定要设置的新的属性值

    );

  在框架类CMainFrame类的OnCreate函数中修改程序窗口的图标:    

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    ......
    // 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);
    
    SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR));

    return 0;
}

  右击视图类CStyleView类,添加WM_CREATE消息的响应函数OnCreate函数,在此函数中修改程序窗口的光标、背景:

        

int CStyleView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CView::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    // TODO: Add your specialized creation code here
    SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));
    SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_HELP));
    
    return 0;
}
时间: 2024-11-16 04:33:08

修改程序窗口的光标、图标、背景的相关文章

实现程序窗口不断变化的动画图标

利用定时器和可在窗口创建完成后修改其窗口图标的SetClassLong函数,在程序中每隔一定时间就调用一次这个函数,让窗口图标循环显示预先准备好的一组图标中的下一个图标,就可实现图标不断变化的动画效果: 1.加载图标资源 在程序的资源窗口中,插入/引入新的一组图标资源 在程序的框架类CMainFrame类中添加一个成员变量,用来存放这组图标的句柄 在CMainFrame类的OnCreate函数中利用LoadIcon函数加载这组图标: int CMainFrame::OnCreate(LPCREA

获取 window任务栏已经打开应用程序窗口(也就是任务管理器中前台进程)的图标

获取 window任务栏已经打开应用程序窗口(也就是任务管理器中前台进程)的图标 1.功能描述 获取到window任务栏已经打开的应用程序的窗口图标.如下:(要获取到QQ,浏览器,文件夹的图标,但是任务栏中隐藏的图标不显示) 2.使用技术及工具 JAVA,JNA,eclipse. 需要去下载JNA的包(一个是jna.jar,一个时jna-platform.jar):包的下载在文章结尾提供地址. 3.实现思路 (1).一个window任务栏打开的应用程序也就是一个前台进程,所以先通过JNA获取所有

修改应用程序窗口的外观

1.在窗口创建之前修改 须在程序的框架类CMainFrame类的PreCreateWindow虚函数中进行: BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {     if( !CFrameWnd::PreCreateWindow(cs) )         return FALSE;     // TODO: Modify the Window class or styles here by modifying     //  the C

应用程序窗口示例

1 //Windows.h文件中包含应用程序中所需的数据类型和数据结构的定义 2 #include <Windows.h> 3 #include <tchar.h> 4 5 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //窗口函数说明 6 //------------------------------以下是入口函数的代码------------------------------ 7 int WINAPI WinMa

MFC程序实现给对话框加入?背景图片

1.插入一个Bitmap的资源图片,如果资源名称为:IDC_BITMAP1 2.在CXXXDialog::OnPaint()中实现: void CMyDialogDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cx

Android开发5:应用程序窗口小部件App Widgets的实现

前言 本次主要是实现一个Android应用,实现静态广播.动态广播两种改变 widget内容的方法,即在上篇博文中实验的基础上进行修改,所以此次实验的重点是AppWidget小部件的实现啦~ 首先,我们简单说一下Widget是一个啥玩意~ 应用程序窗口小部件(Widget)是微小的应用程序视图,可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新.你可以通过一个App Widget provider来发布一个Widget.可以容纳其它App Widget的应用程序组件被称为App Widge

Android应用程序窗口(Activity)的测量(Measure)、布局(Layout)和绘制(Draw)过程分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8372924 在前面一篇文章中,我们分析了Android应用程序窗口的绘图表面的创建过程.Android应用程序窗口的绘图表面在创建完成之后,我们就可以从上到下地绘制它里面的各个视图了,即各个UI元素了.不过在绘制这些UI元素之前,我们还需要从上到下地测量它们实际所需要的大小,以及对它们的位置进行合适的安排,即对它们进行合适的布局.在本文中,我们

Android应用程序窗口(Activity)的视图对象(View)的创建过程分析

从前文可知道,每一个Activity组件都有一个关联的Window对象,用来描述一个应用程序窗口.每一个应用程序窗口内部又包含有一个View对象,用来描述应用程序窗口的视图.应用程序窗口视图是真正用来实现UI内容和布局的,也就是说,每一个Activity组件的UI内容和布局都是通过与其所关联的一个Window对象的内部的一个View对象来实现的.在本文中,我们就详细分析应用程序窗口视图的创建过程. 在前面Android应用程序窗口(Activity)实现框架简要介绍和学习计划一文中提到,应用程序

修改VC++2010界面左上角图标

(1)在Resource View中创建或者插入一个新的Icon资源,用于你想要的程序图标,假设ID号为IDI_ICON(这种图标要有16*16和32*32两种格式的,前者用于最小化和列表显示等,后者用于桌面图标和平铺显示等-如你给图片)(2) CTESTDlg::CTESTDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CTESTDlg::IDD, pParent){ //m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAM