VC++修改应用程序的外观

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhang_alongzd/article/details/52554221

在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);
最后的结果是窗口的标题消失了。









猜你喜欢

转载自blog.csdn.net/zhang_alongzd/article/details/52554221
今日推荐