Fork me on GitHub

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/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,请尊重作者的劳动成果。

posted @ 2010-11-06 23:41  SkySeraph  阅读(711)  评论(1编辑  收藏  举报