在应用程序框架类中只能修改程序窗口的图标,在视图类中才能改变应用程序窗口的背景和光标;
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; }