VC学习笔记:定制窗体外观
VC学习笔记:定制窗体外观
SkySeraph NOV.4th 2010 HQU
Email-zgzhaobo@gmail.com QQ-452728574
Latest Modified Date:NOV.4th 2010 HQU
基础操作[1]
- 修改应用程序窗口外观/SDI
①在窗口创建之前修改:在Frame类的PreCreateWindow成员函数中进行[虚函数]
修改窗口大小:
cs.cx = 800;
cs.cy = 600;
修改窗口标题:
cs.style &= ~FWS_ADDTOTITLE;//cs.style = WS_OVERLAPPEDWINDOW ; //通过MSDN输入window style,查看SDI默认window style
cs.lpszName ="Hello World! @SkySeraph";
②在窗口创建之后修改:在Frame类的OnCreate函数中添加
SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) & ~WS_MAXIMIZEBOX);//去掉最大化按钮
- 修改窗口光标、图标和背景/SDI
//说明:光标在Frame类进行,图标和背景在View类进行
①在窗口创建之前修改:
在Frame类的PreCreateWindow函数中修改
cs.lpszClass = AfxRegisterWndClass(CS_VREDRAW&CS_HREDRAW,0,0,LoadIcon(NULL,IDI_WARNING));
在View类的PreCreateWindow函数中修改
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW&CS_VREDRAW,LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),0);
函数说明:
LPCTSTR AFXAPI AfxRegisterWndClass(UINT nClassStyle,HCURSOR hCursor = 0,HBRUSH hbrBackground = 0,HICON hIcon = 0 );
②在窗口创建之后修改:
在Frame类的OnCreate函数中修改
SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR));
在View类的OnCreate函数中修改
SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));
SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_HELP));
- 模拟动画图标/SDI
①加载三幅位图资源,ID分别为IDI_ICON1~3,在frame类定义一个HICON类型私有成员变量m_hIcons[3],用来存放三幅图标的句柄
②在frame类OnCreate函数中加载位图,并在OnCreate函数定义前加声明 extern CStyleApp theApp;//声明一个外部源文件定义的变量
//技巧:三种方法获得当前实例句柄
m_hIcons[0] = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
//自定义图标,第一个参数应为应用程序当前实例句柄,利用MAKEINTRESOURCE宏将资源ID转换为资源标识符字符串
m_hIcons[1] = LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2));
//在MFC SDI中,有一个表示应用程序本身的类,本例中就是CStyleApp,它派生于CWinApp。该类有一个数据成员m_hInstance,标识了应用程序当前的实例,也就是说,如果我们能够获取到应用程序的CWinApp对象,就可以利用这个对象来调用它的m_hInstance数据成员,从而得到当前实例的句柄。而CStyleApp的源文件中已经定义了一个CStyleApp类型的全局变量theApp。我们可以利用这个全局对象调用其内部的数据成员
//在一个源文件中调用另一个源文件的全局变量,必须再调用前声明这个变量是在外部定义的,在Frame类前OnCreate函数定义之前定义 extern CStyleApp theApp;
m_hIcons[2] = LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3));
③再设置定时器[frame类OnCreate函数中]
SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[0]);//默认显示
SetTimer(1,1000,NULL);
④为frame类添加定时器消息WM_TIMER的响应函数
void CMainFrame::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
static int index=0;//定义一个图标索引变量 //此处也可以定义成Frame类的成员变量
//静态局部变量存放在程序的数据区中,而不是栈中分配空间
SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[index]);//HICON转换为LONG型
index=++index%3;
//如果希望把某个数值时钟限定在一个范围内,最好的办法就是取模运算%。例如希望某个变量的取值在0~10之间变化,只需要对11取模即可,取模即取余
CFrameWnd::OnTimer(nIDEvent);
}
Author: SKySeraph
Email/GTalk: zgzhaobo@gmail.com QQ:452728574
From: http://www.cnblogs.com/skyseraph/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,请尊重作者的劳动成果。
作者:skyseraph
出处:http://www.cnblogs.com/skyseraph/
更多精彩请直接访问SkySeraph个人站点:http://skyseraph.com//
Email/GTalk: zgzhaobo@gmail.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。