在MFC中,修改应用程序的外观可以通过CMainFrame类中的两个函数来实现;即PreCreateWindow(CREATESTRUCT& cs)和OnCreate(LPCREATESTRUCT lpCreateStruct);下面逐一介绍这两个函数;
1:PreCreateWindow(CREATESTRUCT& cs)
顾名思义可以看出该函数是在创建窗口之前修改的外观和大小,而且该函数是一个虚函数,也就是说,调用该函数时,实际上就是调用子对象的函数,对子对象的窗口进行修改;参数CREATESTRUCT& cs是一个引用结构体的形式,这样我们可以通过修改CREATESTRUCT结构体的参数来修改窗口特征。通过查看定义可以看出CREATESTRUCT结构体的成员以及作用;
typedef struct tagCREATESTRUCTW {
LPVOID lpCreateParams;
HINSTANCE hInstance; // 应用程序的实例句柄
HMENU hMenu; //窗口菜单句柄
HWND hwndParent; //父窗口句柄
int cy; //指定新窗口的高和宽,像素为单位
int cx;
int y; //指定新窗口的左上角x,y坐标,像素为单位
int x;
LONG style; //窗口风格
LPCWSTR lpszName; //窗口名称
LPCWSTR lpszClass; //指定新窗口类
DWORD dwExStyle; //窗口扩展风格
} CREATESTRUCTW, *LPCREATESTRUCTW;
常用的窗口类型如下:
WS_POPUP:弹出式窗体,没有标题栏!
WS_BORDER:细的黑边框
WS_OVERLAPPED:一般的有标题栏的窗体,见多了。
WS_CHILD:子窗体,一般用于Frame里面的窗体
WS_CAPTION:标题栏
WS_SYSMENU:系统菜单(只有设置后才有最小化、最大化、关闭)
WS_MINIMIZEBOX :最小化按钮
WS_MAXIMIZEBOX:最大化按钮
WS_MINIMIZE:启动时最小化
WS_MAXIMIZE:启动时最大化
WS_EX_TOOLWINDOW:不在任务栏里显示条目
WS_EX_WINDOWEDGE:
WS_EX_CLIENTEDGE:具有凹陷感;
还可以修改frame window style来修改:
#define FWS_ADDTOTITLE 0x00008000L // 调整标题栏
#define FWS_PREFIXTITLE 0x00004000L // show document name before app name
#define FWS_SNAPTOBARS 0x00002000L // snap size to size of contained bars
但是我们如果不设置的话,就是默认的窗口类型,即WS_OVERLAPPEDWINDOW和FWS_ADDTOTITLE;如果进行了其他修改,这两项也就发生了改变,需要重新设置;而如果需要添加其他的标题,则需要去掉FWS_ADDTOTITLE属性,在修改cs.lpszName;
下面在PreCreateWindow(CREATESTRUCT& cs)下修改窗口看看效果;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式
cs.cx=500;
cs.cy=500;
cs.x=0;
cs.y=0;
cs.style&=~FWS_ADDTOTITLE;
cs.lpszName=_T("aaa");
//cs.style=FWS_PREFIXTITLE;
return TRUE;
}
2:通过OnCreate(LPCREATESTRUCT lpCreateStruct)修改窗口
创建好窗口之后,可以在在CMainFrame的函数OnCreate(LPCREATESTRUCT lpCreateStruct)中,利用SetWindowLong( _In_ HWND hWnd,_In_ int nIndex,_In_ LONG dwNewLong);进行修改;
hwnd:标识窗口,并且间接标只出该窗口的属的窗口类。
这个函数根据nIndex的取值不同,可以实现不同的功能。
其中nInde可以取:
GWL_EXSTYLE: 设置窗口扩展风格,即CreateWindowEx的DWORD wExStyle 参数
GWL_STYLE: 设置窗口风格,即CreateWindow的DWORD dwStyle参数
GWL_WNDPROC: 设置窗口的处理函数,即RegisterClass的WNDCLASSEX的WNDPROC lpfnWndProc成员
GWL_HINSTANCE: 设置窗口所属的应用程序句柄,即RegisterClass的WNDCLASSEX的HINSTANCE hInstance成员
GWL_ID 设置窗口的ID(对于控件,就是控件ID)
GWL_USERDATA: 设置窗口的用户自定义数据
DWL_DLGPROC: 设置对话框处理函数
DWL_MSGRESULT: 设置对话框消息处理的结果值
DWL_USER: 设置扩展区域数据
lNewLong:要设定的值。(函数LONG GetWindowLongHWND hWnd,int nlndex)取得窗口的原属性值,
在此基础上进行修改。)
下面对函数SetWindowLong()的调用实现窗口最大化按钮的无效:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
......
// TODO: 如果不需要可停靠工具栏,则删除这三行
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE)& ~WS_MAXIMIZEBOX);
//SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW);
return 0;
}
此时最大化窗口无效,其他的不变,当然也可以直接修改;
SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW);最后的结果是窗口的标题消失了。