首先我们修改窗体 有2种方法 一是 在窗体创建之前 二是在窗体创建之后 修改 下面就介绍各种修改方法
参考 MSDN window style window styles
用到的函数 GetWindowLong SetWindowLong GetClassLong SetClassLong 在窗体创建之后修改窗体的属性 图标光标 等等
AfxRegisterWndClass函数返回一个已经注册的窗口类的名字以便我们给CREATESTRUCT结构体赋值
RegisterClass注册窗口类
::DefWindowProc 缺省窗口过程 一定要加全局符号 因为 CWnd类也有同名函数否则VC会编译报错
AfxGetInstanceHandle获得应用程序句柄
LoadIcon(NULL,IDI_ERROR); //要使用系统图标 参数一实例的句柄必须设置为NULL 如果 引用了 图标资源那么不能为NULL 应该是AfxGetApp()->m_hInstance;
LoadCursor(NULL,IDC_HELP);
1.
窗体创建之前修改这种修改是通用的我们可以再 从CWnd派生的类中覆盖这个虚函数 SDI程序 主界面由框架窗体 和视图构成
这个函数在窗体创建之前
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) //在窗体生成之前传递给MFC底层代码 CreateWindowEx在这里的改变会影响到底层代码
{ //这个CREATESTRUCT的结构体的参数和创建窗口所需要的WNDCLASSEX参数完全一样只是顺序不同
if( !CFrameWnd::PreCreateWindow(cs) ) //window style 参考
return FALSE;
cs.cx=500; //修改大小
cs.cy=500;
cs.style&=~FWS_ADDTOTITLE; //MFC默认这个属性把window caption设置为 文档标题 所以我们要去掉这个属性用&= 取反 cs.lpszName="http://www.xiaowei.org";
//因为 引用关系所作的修改都会影响到MFC创建窗体的底层代码
//如何修改窗体的图标光标背景呢 这些事创建窗口的时候MFC指定的 我们不能也不应该修改MFC底层代码 但是我们可以注册自己的窗口类
/* WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)::GetStockObject(BLACK_BRUSH);
wndcls.hCursor=::LoadCursor(NULL,IDC_ARROW);
wndcls.hIcon=::LoadIcon(NULL,IDI_ERROR);
wndcls.hInstance=::AfxGetInstanceHandle();
wndcls.lpfnWndProc=::DefWindowProc;// 缺省窗口过程 因为CWnd类也有一样的函数所以 我们应该加上全局限定符
wndcls.lpszClassName="xiaowei.com";
wndcls.lpszMenuName=NULL;//对于一个MDI程序来说 菜单的创建不是在注册窗口类的时候 所以 NULL
wndcls.style=CS_HREDRAW|CS_VREDRAW; //窗口类型 水平重画 和垂直重绘
RegisterClass(&wndcls);//窗口类一经注册全局 便可以使用 类名字
cs.lpszClass="xiaowei.com"; //吧底层代码的窗口类换成我们注册的
*/
//上面的修改太过繁琐 我们要修改 窗口 的光标 图标 背景其实很简单 AfxRegisterWndClass()函数返回一个 注册的窗口类名
//cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,0,0,LoadIcon(NULL,IDI_ERROR));修改成我们注册的窗口类
}
2.窗体创建之后修改 窗体的属性 图标光标 背景 等等 具体看MSDN window styles class styles 有相关的设置参数
在 框架类 或者 视图类的WM_CREATE消息的响应事件中
//SDI的主窗体就是框架 就好像 基于对话框的程序一样 主窗体是对话框
//我们再窗体创建之后通过 SetWindowLong 改变窗口属性 GetWindowLong 获得现有窗口的信息
//::SetWindowLong(this->m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW );
//修改的属性值 参考window styles
::SetWindowLong(this->m_hWnd,GWL_STYLE,::GetWindowLong(this->m_hWnd,GWL_STYLE)&~WS_MAXIMIZEBOX);
//在视图中用 这个函数设置视图的背景 在框架类设置背景 光标无意义 应该砸view类设置 光标和背景
::SetClassLong(this->m_hWnd,GCL_HBRBACKGROUND,(LONG)::GetStockObject(GRAY_BRUSH));