1.
修改窗口外观有2种方法:
(1)窗口创建之前,在MainFrame的
PreCreateWindow()中修改cs,或直接使用AfxRegisterWndClass();
(2)窗口创建之后,在MainFrame的OnCreate()中调用
SetWindowLong();
修改外观和图标在MainFrm中进行,而修改背景和窗口光标只能在View中进行。为什么?因为view的显示挡在了 MainFrame的前面。
a 在
MainFrame
中
(1)PreCreateWindow()
中,在窗口创建之前,用重新注册窗口类的方法,比较麻烦。在 PreCreateWindow()中修改
也可以用简单的方法,用全局函数
//cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,0,0,
// LoadIcon(NULL,IDI_WARNING));
(2)在窗口创建之后,在 OnCreate()中修改
//SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW);
//SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) & ~WS_MAXIMIZEBOX);
// SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR));
b.
在
View
中
(1)PreCreateWindow()
中
//cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,
// LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),NULL);
cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW);
(2)OnCreate()
中
SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));
SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_HELP));
2.
创建一个不断变化的图标。用定时器和
SetClassLong完成
a.
准备三个图标文件,放在
RES文件夹,Insert->Resource- 三个图标,
b.
在
CMainFrame
中增加图标句柄数组, m_hIcons[3]
m_hIcons[0]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));//MAKEINTRESOURCE
是一个宏,它将整数转化为
Win32的资源类型,简单的说它是一个类型转换 #define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i)))
m_hIcons[1]=LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2));//
此处需要用到 theAPP对象,故要在文件中声明 extern CStyleApp theApp;
m_hIcons[2]=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3));
然后将其初始化
c.
然后在定时器中实现
3.
工具栏的编程
a.
加入分隔符的方法,向右拖动即可;
b.
删除按纽的方法,拖出即可。
4.
创建一个新的工具栏的方法
a.
插入一个工具栏,画出其图形。
b.
在头文件中,定义
CToolBar m_newToolBar
c.
在
MainFrm.cpp
的OnCreate()中调用
if (!m_newToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_RIGHT
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_newToolBar.LoadToolBar(IDR_TOOLBAR1))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
d.
点击“新的工具栏”菜单时,隐藏工具栏。两种方法
第一种
if(m_newToolBar.IsWindowVisible())
{
m_newToolBar.ShowWindow(SW_HIDE);
}
else
{
m_newToolBar.ShowWindow(SW_SHOW);
}
RecalcLayout();//
DockControlBar(&m_newToolBar);//停靠工具栏
第二种ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE);
e.
将菜单增加复选标记。在
OnUpdateUI中加入代码
pCmdUI->SetCheck(m_newToolBar.IsWindowVisible());
5.
状态栏编程
a.Indicator[]
数组中有状态栏的信息
如果要增加,可以在String Table中加入一个 IDS_Timer,然后将其加入到[]中。
b.
在时间栏显示时间,代码略,比较简单
CTime::GetCurrentTime()获取当前时间
CommandToIndex获取索引
dc.GetTextExtent()获取字符串大小
SetPaneText()设置状态栏的某部分的内容
SetPaneInfo()设置状态栏某部分的信息,例如大小
6.
进度栏
a.
增加成员变量,
CProgressCtrl m_progress
b.OnCreate
中 m_progress.Create(WS_CHILD | WS_VISIBLE,// | PBS_VERTICAL,
rect,&m_wndStatusBar,123);
m_progress.SetPos(50);*/ c.
将其创建到状态栏的方法!如果在 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);//不能用SendMessage()
d.
解决重绘时进度栏改变的问题。在 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();
e.
显示鼠标位置(//设置状态栏第一个栏的文本内容的方法)。
在
View中增加OnMouseMove() 处理函数
CString str;
str.Format("x=%d,y=%d",point.x,point.y);
(1) 直接将主窗口CMainFrame类中的 状态栏变量设为public,然后调用它的
SetWindowText方法即可
((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);//设置状态栏第一个栏的内容
(2)调用
CFrameWnd::SetMessageText
方法,该方法给状态栏中的ID为0的栏设置字符串内容
((CMainFrame*)GetParent())->SetMessageText(str);
(3)使用
CFrameWnd::GetMessageBar
获取状态栏,然后设置其内容
((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str);
(4)调用
CWnd::GetDescendantWindow
方法,获取主窗口中的状态栏
GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(str);//
AFX_IDW_STATUS_BAR是状态栏的ID
7.
加入启动画面
Project-Component and ->Visual C++ Components->SplashScreen->
插入
工程中增加了
类CSplashWnd和位图IDB_SPLASH