1.修改窗口大小:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中修改cs值,例如cs.cx=100;cs.cy=200;
2.修改窗口标题:
cs.style&=~FWS_ADDTOTITLE;
cs.lpszName="要添加的标题";
3.改变窗口类型:
在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中添加代码:
SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW);
4.改变图标:
在BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中使用AfxRegisterWndClass函数
例如:cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,0,0,LoadIcon(NULL,IDI_WARNING));//将图标改为一个警告符号
注意:LoadIcon中若使用的是系统默认的图标,则第一个变量设置NULL,第二个变量设置为默认图标的ID
LoadIcon中若使用的是自己设定的图标的话,第一个变量则为实例句柄:可以用全局函数AfxGetInstanceHandle()获得,第二个变量要通过MAKEINTRESOURCE改变变量类型
例如:m_hIcon1=LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON1));其中theApp.m_hInstance是获得实例句柄的另外一种方法,不过要在类CMainFrame中声明全局变量theApp,在MainFrame.cpp中添加extern CStyleApp theApp;
5.修改光标、背景:
在BOOL CStyleView::PreCreateWindow(CREATESTRUCT& cs)中添加代码:
cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),0);
上面设置的光标为十字光标,背景采用的黑色画刷
6.修改图标、光标、背景也可以用SetClassLong函数,该函数有三个变量,第一个是对象变量,第二个是要改变值的索引,第三个是索引对应的属性值;
例如:SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));具体可以看MSDN中对SetClassLong函数的讲解;
注意:
修改图标和外观要在MainFrame中进行,修改光标、背景要在View类中进行,SetClassLong函数要添加在OnCreate函数中
7.设置定时器:
对CMainFrame类添加WM_TIMER响应
在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中可以设置时钟变化间隔,例如SetTimer(1,1000,NULL);使时钟每个1000毫秒变化一次
8.设置一个可以在一定范围内变化的变量:
例如使index在0,1,2之间变化,可以在void CMainFrame::OnTimer(UINT nIDEvent) 中加入代码:
static int index=0;index=++index%3;
9.创建新的工具栏:
(1)在ResourceView中添加一个新的工具栏资源,IDR_TOOLBAR1
(2)构建一个CToolBar对象,在MainFrm.h中添加:CToolBar m_newToolBar;
(3)在MainFrm.cpp中调用OnCreate函数添加工具栏,并将它与构建的对象联系:代码如下:
if (!m_newToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_RIGHT //CBRS_RIGHT表示新创建的工具栏靠在窗口的右侧
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_newToolBar.LoadToolBar(IDR_TOOLBAR1)) //LoadToolBar(IDR_TOOLBAR1)将对象与工具栏联系
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
m_newToolBar.EnableDocking(CBRS_ALIGN_ANY); //设置工具栏可以停靠
DockControlBar(&m_newToolBar); //工具栏停靠
10.工具栏的隐藏:
在主菜单添加一个按钮,通过ClassWizarrd 对该按钮添加COMMAND响应,添加代码:
ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE);
11.为主菜单的子按钮添加复选标记:
为按钮添加UPDATE COMMAND UI 响应,添加代码:
pCmdUI->SetCheck(m_newToolBar.IsWindowVisible()); //设计的是将新工具栏隐藏
12.添加新的状态栏:
以添加时间状态栏为例
(1)在ResourceView的String Table中添加IDS_TIMER,属性改为:时钟;
(2)在MainFrm.cpp中的static UINT indicators[]中添加IDS_TIMER;
(3)需要使时间动起来,所以可利用void CMainFrame::OnTimer(UINT nIDEvent)函数,在里面添加代码:
CTime t = CTime::GetCurrentTime(); //设置时间对象
CString str=t.Format("%H:%H:%S"); //格式化时间
CClientDC dc(this);
CSize sz = dc.GetTextExtent(str); //设计字符串str存放所需窗格面板的宽度
m_wndStatusBar.SetPaneInfo(1,IDS_TIMER,SBPS_NORMAL,sz.cx); //设置状态栏窗口属性,其中的1表示IDS_TIMER在static UINT indicators[]中索引为1
m_wndStatusBar.SetPaneText(1,str);//设置窗格面板文字
13.在状态栏中添加进度栏:
前两步类似12中的添加时钟状态栏
(1)在ResourceView的String Table中添加IDS_PROGRESS,属性改为:进度栏;
(2)在MainFrm.cpp中的static UINT indicators[]中添加IDS_PROGRESS;
(3)在MainFrm.h中添加CProgressCtrl m_progress;,类似9—(2)中添加的CToolBar m_newToolBar;
(4)在MainFrm.cpp中创建进度栏代码:
CRect rect;
m_wndStatusBar.GetItemRect(2,rect);//得到状态栏窗格的大小,2表示IDS_PROGRESS在static UINT indicators[]中索引为2
m_progress.Create(WS_CHILD | WS_VISIBLE, rect, &m_wndStatusBar, 123/*进度栏ID号*//*);
m_progress.SetPos(50);//设置进度
(5)将其创建到状态栏的方法!如果在OnCreate()中创建,则不成立,因为获取矩形大小时失败。
解决办法,用自定义消息:
在MainFrm.h中#define UM_PROGRESS WM_USER+1
afx_msg void OnProgress();
在MainFrm.cpp中
ON_MESSAGE(UM_PROGRESS,OnProgress)
然后实现这个函数
void CMainFrame::OnProgress()
{
CRect rect;
m_wndStatusBar.GetItemRect(2,&rect);
m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH,
rect,&m_wndStatusBar,123);
m_progress.SetPos(50);
}
最后在OnCreate中调用 PostMessage(UM_PROGRESS);
(6)解决重绘时进度栏改变的问题。在OnPain()中重写代码
CRect rect;
m_wndStatusBar.GetItemRect(2,&rect);
m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH,
rect,&m_wndStatusBar,123);
m_progress.SetPos(50);
然后在定时器消息处理函数中加入
m_progress.StepIt();
14.在状态栏中显示鼠标位置。
在View中增加OnMouseMove()处理函数
Code
1 CString str;
2 str.Format("x=%d,y=%d",point.x,point.y);
3 //((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);
4 //((CMainFrame*)GetParent())->SetMessageText(str);
5 //((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str);
6 GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(str);
15.加入启动画面
Project-Component and ->Visual C++ Components->SplashScreen->插入