关闭

[MFC]程序外观修改

864人阅读 评论(0) 收藏 举报

1.      改变窗口的外观及大小

 

窗口创建之前修改窗口样式 (分别在窗口类和视口类中要修改)

————————————————框架类中修改样式

改变窗口的大小及尺寸,Afx开头的就是MFC提供的全局函数,AfxRegisterWndClass用来设定类风格及光标画刷,返回一个类指针。

BOOLCMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

         if(!CFrameWnd::PreCreateWindow(cs) )

                   returnFALSE;

//////////////////////////////////第一种方法改变类风格,改变窗口标题

/*     cs.cx= 1000;

         cs.cy= 200;

         //用于将FWS_ADDTOTITLE这种类风格去掉 ,取反,然后与操作

         cs.style&= ~FWS_ADDTOTITLE;

         cs.lpszName= "Chen' s";*/

//////////////////////////////////第二种方法改变类风格

/*     WNDCLASSwndcls;

         wndcls.cbClsExtra= 0 ;

         wndcls.cbWndExtra= 0 ;

         wndcls.hbrBackground= (HBRUSH) GetStockObject(BLACK_BRUSH);

         wndcls.hCursor= LoadCursor(NULL,IDC_CROSS);

         wndcls.hIcon= LoadIcon(NULL,IDI_ERROR);

         wndcls.hInstance= AfxGetInstanceHandle();

         wndcls.lpfnWndProc= ::DefWindowProc;

         wndcls.lpszClassName="Chen 's";

         wndcls.lpszMenuName= NULL;

         wndcls.style= CS_HREDRAW | CS_VREDRAW;

 

         RegisterClass(&wndcls);

         cs.lpszName= "Chen 's";*/

//////////////////////////////////第三种方法改变类风格

         cs.lpszClass= AfxRegisterWndClass(CS_VREDRAW|CS_VREDRAW,0,0,

                   LoadIcon(NULL,IDI_WARNING));

         returnTRUE;

}

 

————————————————视口类中修改样式

BOOLCTestView::PreCreateWindow(CREATESTRUCT& cs)

{

 

         //在CMainFrame中注册的类名,必须要在这个地方声明,View类是覆盖在Frame类上面的

         //cs.lpszClass= "Chen 's";

         cs.lpszClass= AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW ,LoadCursor(NULL,IDC_CROSS),

                   (HBRUSH)GetStockObject(BLACK_BRUSH));

         returnCView::PreCreateWindow(cs);

}

 

窗口创建之后修改窗口样式 (同样在窗口类和视口类中要修改)

——————在框架类中修改应用程序图标

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

….

….

         SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR));

         return0;

}

——————在视口类中修改应用程序背景和光标

int CTestView::OnCreate(LPCREATESTRUCTlpCreateStruct)

{

         if(CView::OnCreate(lpCreateStruct) == -1)

                   return-1;

         SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));

         SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_HELP));

         return0;

}

 

————————————————实现窗口图标的动态切换

1.      在资源中视图中Import图标资源,并在CmainFrame中并以m_hIcons[3]成员变量,在OnCreate中初始化,并熟悉或的应用程序实例的三种方法

//声明the是在外部的一个源文件中定义的。CTestApp是应用程序类名

extern CTestApp theApp;

int CMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct)

{

         ….

         ….

         //      SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR));

         //三种方法获得应用程序实例句柄

         m_hIcons[0]= LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));

         m_hIcons[1]= LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2));

         m_hIcons[2]= LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON2));

         //设置窗口图标

         SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[0]);

 

// timer identifier// time-out value ,第三个是窗口过程

        

//设置定时器,每隔一秒触发一次

SetTimer(1,1000,NULL);

         return0;

}

2.      在CmainFrame中捕获WM_TIMER消息

void CMainFrame::OnTimer(UINT nIDEvent)

{

         //index不加static,那么每次进入OnTimer -->index = 1, ,就达不到图标变换的效果了(初始显示的时候index= 0)

         //解决方法:定义成CMainframe派生类的成员变量或这是全局变量

         staticint index = 1;

         SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[index]);

//index范围限定在0~3之间

         index = ++index%3 ;       

         CFrameWnd::OnTimer(nIDEvent);

}

 

 

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:132629次
    • 积分:2032
    • 等级:
    • 排名:千里之外
    • 原创:73篇
    • 转载:39篇
    • 译文:0篇
    • 评论:4条
    文章分类
    最新评论