Dr.Wing

心翼的技术笔记本

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

//---------------窗体创建之前,修改其窗体类型等,不涉及图标,光标等---------------

1、窗口创建之前修改窗体的外观:可以在MainFrm类的PreCreateWindow成员函数中进行。

PreCreateWindow函数是一个虚函数,在MFC的底层代码里,由继承性,会调用子类对象的PreCreateWindow函数。

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 由这个函数可见,修改的时候依靠该函数的参数CREATESTRUCT结构体来修改,这个结构体就是修改窗体各种外观的,且其同CreateWindow函数的参数相同。

//----------------创建后修改--------------------------------------

2、窗口创建之后修改的话,就在MainFrm类的OnCreate函数中修改,添加实现的代码。可以用SetWindowLong函数来进行修改.SetWindowLong(窗体句柄,指定窗体类型的值,参数二的详细)

//---------------窗体创建之前,修改图标,光标等,不涉及其窗体类型---------------

3、要修改应用程序窗口的图标,在框架类中进行;如果要修改程序窗口的背景和光标,是在视类中进行。

//----------------创建前修改图标,光标等,不涉及其窗体类型----------------------

4、可以用AfxRegisterWndClass函数进行修改窗体的一些外观等。比如可以在框架类中的OnCreate函数中使用:AfxRegisterWndClass(...),这样来修改。也可以看出,AfxRegisterClass这个函数的用法。同样的,我们也能如此在View类的PreCreateWindow函数中使用,来修改窗体的背景、鼠标等等。

BOOL CSelf_8View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs

cs.lpszClass
=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),0); //这里是修改的代码

return CView::PreCreateWindow(cs);
}
 

//----------------创建后修改图标,光标等,不涉及其窗体类型--------------------------------------

5、如果要在创建后修改窗体的图标、背景、鼠标指针这几种的话,可以在MainFrm类以及View类中的OnCreate函数中,使用函数SetClassLong(窗体句柄,指定窗体类型的值,参数二的详细)进行修改。

总结:①、修改图标要在MainFrm类中,修改背景、鼠标指针、光标等,要在View类中。

        ②、在窗体创建前修改,都是分别在两个类的PreCreateWindow中进行修改,修改的时候,是利用该函数的参数,即CREATESTRUCT结构体进行修改;若要在创建后修改,那么就要使用SetClassLong函数或者SetWindowLong函数进行修改;

        ③、区别:SetClassLong修改的是窗体的图标、光标、背景等;而SetWindowLong修改的是窗体的外观,STYLE等属性,要注意使用。它们俩都是用于窗体创建后进行窗体外观修改的函数。

      ④、如果希望把某个数始终限定在一个范围内,最好的办法就是进行取模运算(%)。例如,如果希望某个变量的取值范围在0-10之间变化,因为0-10之间有11个数,所有就应该把这个变量对11取模即可。

7、工具栏的显示和隐藏,使用函数ShowControlBar最合适。这里加上孙鑫书本当时的工具栏浮动以后,再显示的问题修改代码如下,一共处理方式有两种:

一、原始方式:

 1 if(m_myToolBar.IsWindowVisible())
2 {
3 //如果这个工具栏不可见,下面是如果该工具栏是浮动状态
4 if(m_myToolBar.IsFloating())
5 {
6 m_DockState=TRUE; //给一个判断,这个bool值事先定义为一个变量,作为判断工具栏是否浮动
7 m_myToolBar.GetDockingFrame()->GetWindowRect(&m_myRect); //获取浮动坐标!
8 m_myToolBar.ShowWindow(SW_HIDE);
9 }
10 else
11 {
12 m_DockState=FALSE;
13 m_myToolBar.ShowWindow(SW_HIDE);
14 }
15 }
16 else
17 {
18 m_myToolBar.ShowWindow(SW_SHOW);
19 }
20 RecalcLayout(); //注意这一句是需要的
21 DockControlBar(&m_myToolBar);
22
23 if(m_DockState) //如果是浮动的,那么就让他显示浮动在原来的位置,注意用函数FloatControlBar函数
24 {
25 FloatControlBar(&m_myToolBar,CPoint(m_myRect.left,m_myRect.top));
26 }

二、方式二

ShowControlBar(&m_myToolBar,!m_myToolBar.IsWindowVisible(),FALSE);   //是的,你没有看错,就这句代码就行了...

8、要给状态栏添加新项目的话,可以在MainFrm类的函数:

static UINT indicators[] 中,进行操作,如我们可以在Resource里的String Table中,添加一个

IDR_TIMER的字符串,然后在函数中写上:

static UINT indicators[] =

{

ID_SEPARATOR,
// status line indicator

IDS_TIMER,
//这是添加的状态

ID_INDICATOR_CAPS,

ID_INDICATOR_NUM,

ID_INDICATOR_SCRL,

};

9、SetPaneText是CStatusBar类的成员函数,可以作为设置相应窗格的状态栏。

     SetPaneInfo可以对状态栏相关进行设置,如ID号、类型、宽度等。

10、也许有时候我们不清楚状态栏相关字符串的索引位置,我们可以用CStatusBar类的

CommandToIndex( UINT nIDFind )来获取到他的ID号,这个函数在CToolBar类也有同样使用方式。

//-------------------------下面是进度栏了------------------------------//

注意好如何添加消息相应的问题

①、首先是在头文件.h中,定义了一个用户消息

#define    UM_PROGRESS    WM_USER+1    //WM_USER是用户自定义消息

②、再在头文件.h中,做消息相应函数原型的声明

afx_msg LRESULT OnProress(WPARAM,LPARAM);   //其中OnProgress是自己取名即可,千万注意这里VC6和VS2010的区别

如上说明,VC6中写

afx_msg void OnProress();

都可以通过,但是在VS2010中,必须写afx_msg LRESULT OnProress(WPARAM,LPARAM);它必须是LRESULT类型,且两个参数WPARAM,LPARAM,而且,这个函数原型中,一定要注意,要返回TRUE或者FALSE

③、然后添加消息相应,如下添加:

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_MESSAGE(UM_PROGRESS,OnProress)
//注意位置,注意没有括号,注意没有分号或者逗号
END_MESSAGE_MAP()

④、然后在源文件.cpp中,做消息映射

 1 LRESULT  CMainFrame::OnProress(WPARAM,LPARAM)
2
3 {
4
5 //它必须是LRESULT类型,必须是有俩参数WPARAM,LPARAM
6 m_wndStatusBar.GetItemRect(2,&m_myRect);
7
8 m_progress.Create(WS_CHILD | WS_VISIBLE,m_myRect,&m_wndStatusBar,1);
9
10 m_progress.SetPos(50);
11
12
13
14 return TRUE; //一定要注意,要返回TRUE或者FALSE
15
16 }

④、最后,在相应函数中,投递消息:

//SendMessage(UM_PROGRESS);  //投递以后必须执行才返回
PostMessage(UM_PROGRESS); //一个是投递以后,不先执行.注意参数是我们定义的消息的宏

注意,要在函数中投递消息的时候,要用PostMessage函数,而不是SengMessage函数。

可以在OnTimer函数中,使用CProgressCtrl类,也就是进度栏的StepIt()函数来让进度栏自动增加等操作。

//------------------------------------------------------------------------

一般来说MainFrm类是View类的指针,如果要在View类中访问MainFrm中的成员变量等,那么可以用

((CMainFrame*)GetParent())->XXXX这样来访问,前面是因为GetParent返回的是CWnd类的指针,所以需要强制转换为CMainFrame类的指针变量

posted on 2011-08-21 18:12  心翼  阅读(328)  评论(0编辑  收藏  举报