<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

统计

  • 随笔 - 4
  • 文章 - 10
  • 评论 - 1
  • 引用 - 0

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

收藏:MFC修改程序框架

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


15.加入启动画面
  Project-Component and ->Visual C++ Components->SplashScreen->插入

posted on 2009-10-11 11:52 ally-zheng 阅读(302) 评论(0)  编辑 收藏 引用 所属分类: mfc


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理