VC++深入详解之第九章定制应用程序外观笔记

本文详细介绍了如何在MFC程序中定制应用程序窗口的外观和大小,包括修改窗口图标、背景、光标,以及如何在窗口创建前通过CMainFram类的PreCreateWindow成员函数进行修改。同时,文章还阐述了如何在视类中通过PreCreateWindow函数调整窗口的图标、背景和光标,并展示了如何自定义状态栏和工具栏的实现过程。

声明:此乃作者阅读笔记,对您无任何作用,请忽略,当然了,如果你非要看,那我也没有办法,但是我声明了,就没有责任了。

如果希望在应用程序窗口创建之前修改它的外观和大小,就应该在CMainFram类的PreCreateWindow成员 函数中进行: PreCreateWindow有一个CREATESTRUCT类型的参数,修改该变量里的成员变量即可。 在串钩创建之后可以利用前面介绍过得SetWindowLong这个函数来实现这种功能,为了改变窗口的类型, 该函数的第二个参数应制定为GWOL_STYLE,第三个参数应指定为新的窗口类型。可以在架构类的 OnCreate中添加具体的实现代码。 SetWindowLong( m_hWnd, GWL_STYLE, GetWindowLong( m_hWnd, GWL_STYLE) & ~WS_MAXIMIZEBOX); 修改窗口的光标图标背景: 窗口的图标、光标和背景是在设计窗口类时指定的,所以,需要编写自己的窗口类并注册,然后让随后 的窗口按照我们编写的窗口去创建。 才CMainFrame类的PreCreateWindow函数中编写一个自己的窗口类并注册。 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; WNDCLASS wndcls; wndcls.cbClsExtra = 0; wndcls.cbWndExtra = 0; wndcls.hbrBackground = (HBRUSH)GetStockObject(6); wndcls.hCursor = LoadCursor( NULL , IDC_HELP); wndcls.hIcon = LoadCursor( NULL, IDI_WARNING); wndcls.hInstance = AfxGetInstanceHandle(); wndcls.lpfnWndProc = ::DefWindowProc; wndcls.lpszClassName =_T( "sunxin.org"); wndcls.lpszMenuName = NULL; wndcls.style = CS_HREDRAW | CS_VREDRAW; RegisterClass( &wndcls ); cs.lpszClass =_T( "sunxin.org"); return TRUE; } 在视类的PreCreateWindow函数中使用刚刚注册的窗口 cs.lpszClass = "sunxin.org"; 总结:在MFC程序中,如果想要修改应用程序窗口的图标,则应在架构类中进行,因为在架构窗口中才有 标题栏,所以才能修改位于该标题栏上得图标;如果想要修改程序窗口的背景和光标,就应该在视类中 进行。 也可以通过AfxRegisterWndClass来修改窗口的图标,背景。不过,修改图标应该架构类的 PreCreateWindow中,修改背景、光标应该视类的PreCreateWindow中。 LPCTSTR AFXAPI AfxRegisterWndClass( UINT nClassStyle, HCURSOR hCursor = 0, HBRUSH hbrBackground = 0, HICON hIcon = 0 ); 即使在窗口已经创建完成以后也是可以修改窗口的光标,图标,背景的。利用SetClassLong函数即可。 DWORD SetClassLong( HWND hWnd, int nIndex, LONG dwNewLong ); hWnd 指定要设置新属性的窗口句柄 nIndex 指定要设置的属性的索引。取值: GCL_HBRBACKGROUND 设置新的背景画刷 GCL_HCURSOR 设置新的光标 GCL_HICON 设置新的图标 GCL_STYLE 设置新的窗口样式 dwNewLong 指定要设置的新值。 模拟动画图标: 新建几个资源 在架构类中定义HICON的成员变量 加载资源 m_hIcons = LoadIcon( AfxGetInstanceHandle(), MAKEINTRESOURCE( IDB_BITMAP1));//其 中,宏MAKEINTRESOURCE将资源ID转换为相应的资源标示符字符串。 设置定时器: SetTimer(1, 1000,0); 为架构类添加定时器消息(WM_TIMER)的相应函数,并在该相应函数中调用SetClassLong[注意区分 SetWindowLong]函数改变应用程序窗口的图标 自定义工具栏: ①够着CToolBar对象 ②调用Create或CreateEx函数创建Windows工具栏,并把它与创建的CToolBar对象关联起来 ③调用LoadBitmap函数加载半酣工具栏按钮图像的位图 ④调用Setbuttons函数设置按钮样式 其实只需要替换掉部分系统为我们生成的代码即可: int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_TOOLBAR1)) //创建工具栏,加载自定义的工具栏 IDR_TOOLBAR1 { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);//设置工具栏的停靠位置 EnableDocking(CBRS_ALIGN_ANY);//设置架构类的停靠位置 DockControlBar(&m_wndToolBar);//使工具栏停靠在架构类之上 显示或者隐藏工具栏: void CMainFrame::OnViewNewtoolbar() { if( m_newToolBar.IsWindowVisible()) { m_newToolBar.ShowWindow( SW_HIDE ); } else { m_newToolBar.ShowWindow( SW_SHOW ); } RecalcLayout();//架构类的成员函数,通知架构窗口布局变动 DockControlBar( &m_newToolBar );//再次将工具栏置于架构之上 } 以上所有动作都可以利用ShowControlBar函数完成。 ShowControlBar( &m_newToolBar, !m_newToolBar.IsWindowVisible(), FALSE ); 修改状态栏: 在CMainFrame类中已经定义了状态栏CStatusBar m_wndStatusBar; 在OnCreate函数中有如下代码: if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)))//indicators是状态栏右下角的各种状态,我 们可以修改该数组,前提是到string table中定义字符串资源 { TRACE0("Failed to create status bar\n"); return -1; // fail to create } 将字符串资源加入其中: static UINT indicators[] = { ID_SEPARATOR, // status line indicator IDS_TIMER, IDS_PROGRESS, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; 为了将字符串显示到状态栏的窗格子上,可以调用CStatusBar类的SetPaneText函数。 设置窗格的宽度SetPaneInfo CTime t = CTime::GetCurrentTime(); CString str = t.Format("%H:%M:%S"); CClientDC dc(this); CSize sz = dc.GetTextExtent( str ); m_wndStatusBar.SetPaneInfo( 1, IDS_TIMER, SBPS_NORMAL, sz.cx); m_wndStatusBar.SetPaneText(1, str); 进度条编程:如果要再程序中使用进度栏,首先需要构造一个CProgressCtrl对象,然后调用 CProgressCtrl类的Create函数创建进度栏控件。 利用CProgressCtrl类的SetPos成员函数可以设置进度栏上当前进度 m_progress.Set( 50 ); 为了在状态栏的窗格中显示进度栏,首先需要获得窗格的区域,然后将这个区域的大小作为进度栏的大 小。为了获得窗格的区域,可以利用CStatusBar类的GetItemRect【GetPaneInfo】成员函数来完成 当窗口第一次显示时会调用OnPaint,当窗口大小发生变化时,进度条的位置就不对了,但是系统会发送 WM_PAINT消息,我们可以响应此消息,然后重画。 void CMainFrame::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here // Do not call CFrameWnd::OnPaint() for painting messages CRect rect; m_wndStatusBar.GetItemRect( 2, &rect); if( !m_progress.m_hWnd) { m_progress.Create( WS_CHILD | WS_VISIBLE | PBS_SMOOTH , rect , &m_wndStatusBar, 123); } else { m_progress.MoveWindow(rect); } m_progress.SetPos(50); } 在状态栏上显示鼠标当前位置: ①在视类中相应VM_MOUSEMOVE消息,(CMainFram*)GetParent())->m_wndStatusBar.SetWindowText( str ); ②调用架构类的成员函数((CMainFrame*)GetParent())->SetMessageText(str); ③第一种方法和第二种方法的结合,不需要访问架构类的保护成员变量m_wndStatusBar. ((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str );
内容概要:本文设计了一种基于PLC的全自动洗衣机控制系统内容概要:本文设计了一种,采用三菱FX基于PLC的全自动洗衣机控制系统,采用3U-32MT型PLC作为三菱FX3U核心控制器,替代传统继-32MT电器控制方式,提升了型PLC作为系统的稳定性与自动化核心控制器,替代水平。系统具备传统继电器控制方式高/低水,实现洗衣机工作位选择、柔和过程的自动化控制/标准洗衣模式切换。系统具备高、暂停加衣、低水位选择、手动脱水及和柔和、标准两种蜂鸣提示等功能洗衣模式,支持,通过GX Works2软件编写梯形图程序,实现进洗衣过程中暂停添加水、洗涤、排水衣物,并增加了手动脱水功能和、脱水等工序蜂鸣器提示的自动循环控制功能,提升了使用的,并引入MCGS组便捷性与灵活性态软件实现人机交互界面监控。控制系统通过GX。硬件设计包括 Works2软件进行主电路、PLC接梯形图编程线与关键元,完成了启动、进水器件选型,软件、正反转洗涤部分完成I/O分配、排水、脱、逻辑流程规划水等工序的逻辑及各功能模块梯设计,并实现了大形图编程。循环与小循环的嵌; 适合人群:自动化套控制流程。此外、电气工程及相关,还利用MCGS组态软件构建专业本科学生,具备PL了人机交互C基础知识和梯界面,实现对洗衣机形图编程能力的运行状态的监控与操作。整体设计涵盖了初级工程技术人员。硬件选型、; 使用场景及目标:I/O分配、电路接线、程序逻辑设计及组①掌握PLC在态监控等多个方面家电自动化控制中的应用方法;②学习,体现了PLC在工业自动化控制中的高效全自动洗衣机控制系统的性与可靠性。;软硬件设计流程 适合人群:电气;③实践工程、自动化及相关MCGS组态软件与PLC的专业的本科生、初级通信与联调工程技术人员以及从事;④完成PLC控制系统开发毕业设计或工业的学习者;具备控制类项目开发参考一定PLC基础知识。; 阅读和梯形图建议:建议结合三菱编程能力的人员GX Works2仿真更为适宜。; 使用场景及目标:①应用于环境与MCGS组态平台进行程序高校毕业设计或调试与运行验证课程项目,帮助学生掌握PLC控制系统的设计,重点关注I/O分配逻辑、梯形图与实现方法;②为工业自动化领域互锁机制及循环控制结构的设计中类似家电控制系统的开发提供参考方案;③思路,深入理解PL通过实际案例理解C在实际工程项目PLC在电机中的应用全过程。控制、时间循环、互锁保护、手动干预等方面的应用逻辑。; 阅读建议:建议结合三菱GX Works2编程软件和MCGS组态软件同步实践,重点理解梯形图程序中各环节的时序逻辑与互锁机制,关注I/O分配与硬件接线的对应关系,并尝试在仿真环境中调试程序以加深对全自动洗衣机控制流程的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值