第9课 定制应用程序外观

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 
基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值