Visual C++编程技巧之四

Visual Studio 2022 C++ 调用matplotlib-cpp 绘图 利用matplotlib-cpp在Visual Studio 2022中绘图 阅读详情
Visual C++编程技巧之四  

 

25、如何获取有关窗口正在处理的当前消息的信息

26、如何创建一个不规则形状的窗口

27、如何在代码中获取工具条和状态条的指针

28、如何使能和禁止工具条的工具提示

29、如何设置工具条标题

30、如何创建和使用无模式对话框

31、如何在对话框中显示一个位图

32、如何改变对话或窗体视窗的背景颜色

 

25、如何获取有关窗口正在处理的当前消息的信息

调用CWnd: : GetCurrentMessage可以获取一个MSG指针。例如,可以使用

ClassWizard将几个菜单项处理程序映射到一个函数中,然后调用GetCurrentMessage

来确定所选中的菜单项。

viod CMainFrame : : OnCommmonMenuHandler ( )

{

//Display selected menu item in debug window .

TRACE ("Menu item %u was selected . /n" ,

GetCruuentMessage ( ) —> wParam );

}

26、如何创建一个不规则形状的窗口

可以使用新的SDK函数SetWindowRgn。该函数将绘画和鼠标消息限定在窗口的一

个指定的区域,实际上使窗口成为指定的不规则形状。

使用AppWizard创建一个基于对的应用程序并使用资源编辑器从主对话资源中删

除所在的缺省控件、标题以及边界。

给对话类增加一个CRgn数据成员,以后要使用该数据成员建立窗口区域。

Class CRoundDlg : public CDialog

{

…

private :

Crgn m_rgn : // window region

…

} ;

修改OnInitDialog函数建立一个椭圆区域并调用SetWindowRgn将该区域分配给

窗口:

BOOL CRoundDlg : : OnInitDialog ( )

{

CDialog : : OnInitDialog ( ) ;

//Get size of dialog .

CRect rcDialog ;

GetClientRect (rcDialog );

// Create region and assign to window .

m_rgn . CreateEllipticRgn (0 , 0 , rcDialog.Width ( ) , rcDialog .Height ( ) );

SetWindowRgn (GetSafeHwnd ( ) , (HRGN) m_ rgn , TRUE );

return TRUE ;

}

通过建立区域和调用SetWindowRgn,已经建立一个不规则形状的窗口,下面的例

子程序是修改OnPaint函数使窗口形状看起来象一个球形体。

voik CRoundDlg : : OnPaint ( )

{

CPaintDC de (this) ; // device context for painting .

//draw ellipse with out any border

dc. SelecStockObject (NULL_PEN);

//get the RGB colour components of the sphere color

COLORREF color= RGB( 0 , 0 , 255);

BYTE byRed =GetRValue (color);

BYTE byGreen = GetGValue (color);

BYTE byBlue = GetBValue (color);

// get the size of the view window

Crect rect ;

GetClientRect (rect);

// get minimun number of units

int nUnits =min (rect.right , rect.bottom );

//calculate he horiaontal and vertical step size

float fltStepHorz = (float) rect.right /nUnits ;

float fltStepVert = (float) rect.bottom /nUnits ;

int nEllipse = nUnits/3; // calculate how many to draw

int nIndex ; // current ellipse that is being draw

CBrush brush ; // bursh used for ellipse fill color

CBrush *pBrushOld; // previous brush that was selected into dc

//draw ellipse , gradually moving towards upper-right corner

for (nIndex = 0 ; nIndes < + nEllipse ; nIndes ++)

{

//creat solid brush

brush . CreatSolidBrush (RGB ( ( (nIndex *byRed ) /nEllipse ).

( ( nIndex * byGreen ) /nEllipse ), ( (nIndex * byBlue) /nEllipse ) ) );

//select brush into dc

pBrushOld= dc .SelectObject (&brhsh);

//draw ellipse

dc .Ellipse ( (int) fltStepHorz * 2, (int) fltStepVert * nIndex ,

rect. right -( (int) fltStepHorz * nIndex )+ 1,

rect . bottom -( (int) fltStepVert * (nIndex *2) ) +1) ;

//delete the brush

brush.DelecteObject ( );

}

}

最后,处理WM_NCHITTEST消息,使当击打窗口的任何位置时能移动窗口。

UINT CRoundDlg : : OnNchitTest (Cpoint point )

{

//Let user move window by clickign anywhere on the window .

UINT nHitTest = CDialog : : OnNcHitTest (point) ;

rerurn (nHitTest = = HTCLIENT)? HTCAPTION: nHitTest ;

}

27、如何在代码中获取工具条和状态条的指针

缺省时, 工作框创建状态条和工具条时将它们作为主框窗口的子窗口,状态条

有一个AFX_IDW_STATUS_BAR标识符,工具条有一个AFX_IDW_TOOLBAR标识符,下例说

明了如何通过一起调用CWnd: : GetDescendantWindow和AfxGetMainWnd来获取这些

子窗口的指针:

//Get pointer to status bar .

CStatusBar * pStatusBar =

(CStatusBar *) AfxGetMainWnd ( ) —> GetDescendantWindow

(AFX_IDW_STUTUS_BAR);

//Get pointer to toolbar .

CToolBar * pToolBar =

(CToolBar * ) AfxGetMainWnd ( ) —> GetDescendantWindow (AFX_IDW_TOOLBAR);

28、如何使能和禁止工具条的工具提示

如果设置了CBRS_TOOLTIPS风格位,工具条将显示工具提示,要使能或者禁止

工具提示,需要设置或者清除该风格位。下例通过调用CControlBar : : GetBarStyle

和CControlBar : : SetBarStyle建立一个完成此功能的成员函数:

void CMainFrame : : EnableToolTips ( BOOL bDisplayTips )

{

ASSERT_VALID (m_wndToolBar);

DWORD dwStyle = m _wndToolBar.GetBarStyle ( ) ;

if (bDisplayTips)

dwStyle |=CBRS_TOOLTIPS ;

else

dwStyle & = ~ CBRS_TOOLTIPS ;

m_wndToolBar.SetBarStyle (dwStyle );

}

29、如何设置工具条标题

工具条是一个窗口,所以可以在调用CWnd : : SetWindowText来设置标题,例子如下:

int CMainFrame : : OnCreate (LPCREATESTRUCT lpCreateStruct )

{

…

// Set the caption of the toolbar .

m_wndToolBar.SetWindowText (_T "Standdard");

30、如何创建和使用无模式对话框

MFC将模式和无模式对话封装在同一个类中,但是使用无模式对话需要几

个对话需要几个额处的步骤。首先,使用资源编辑器建立对话资源并使用

ClassWizard创建一个CDialog的派生类。模式和无模式对话的中止是不一样的:

模式对话通过调用CDialog : : EndDialog 来中止,无模式对话则是调用

CWnd: : DestroyWindow来中止的,函数CDialog : : OnOK和CDialog : : OnCancel

调用EndDialog ,所以需要调用DestroyWindow并重置无模式对话的函数。

void CSampleDialog : : OnOK ( )

{

// Retrieve and validate dialog data .

if (! UpdateData (TRUE) )

{

// the UpdateData rountine will set focus to correct item

TRACEO (" UpdateData failed during dialog termination ./n") ;

return ;

}

//Call DestroyWindow instead of EndDialog .

DestroyWindow ( ) ;

}

void CSampleDialog : : OnCancel ( )

{

//Call DestroyWindow instead of EndDialog .

DestroyWindow ( ) ;

}

其次,需要正确删除表示对话的C++对象。对于模式对来说,这很容易,需要创建函数返回后即可删除C++对象;无模式对话不是同步的,创建函数调用后立即返回,因而用户不知道何时删除C++对象。撤销窗口时工作框调用CWnd : : PostNcDestroy,可以重置该函数并执行清除操作,诸如删除this指针。

void CSampleDialog : : PostNcDestroy ( )

{

// Declete the C++ object that represents this dialog .

delete this ;

}

最后,要创建无模式对话。可以调用CDialog : : DoModal创建一个模式对放, 要创建一个无模式对话则要调用CDialog: : Create。下面的例子说明了应用程序是如何创建无模式对话的:

void CMainFrame : : OnSampleDialog ( )

{

//Allocate a modeless dialog object .

CSampleDilog * pDialog =new CSampleDialog ;

ASSERT_VALID (pDialog) ;

//Create the modeless dialog .

BOOL bResult = pDialog —> Creste (IDD_IDALOG) ;

ASSERT (bResult ) ;

}

31、如何在对话框中显示一个位图

这要归功于Win 32先进的静态控件和Microsoft的资源编辑器, 在对话框中显示位图是很容易的, 只需将图形控件拖到对话中并选择适当属性即可,用户也可以显示图标、位图以及增强型元文件。

32、如何改变对话或窗体视窗的背景颜色

调用CWinApp : : SetDialogBkColor可以改变所有应用程序的背景颜色。第一个参数指定了背景颜色,第二个参数指定了文本颜色。下例将应用程序对话设置为蓝色背景和黄色文本。

BOOL CSampleApp : : InitInstance ( )

{

…

//use blue dialog with yellow text .

SetDialogBkColor (RGB (0, 0, 255 ), RGB ( 255 , 255 , 0 ) ) ;

…

}

需要重画对话(或对话的子控件)时,Windows向对话发送消息WM_CTLCOLOR,通常用户可以让Windows选择绘画背景的刷子,也可重置该消息指定刷子。下例说明了创建一个红色背景对话的步骤。

首先,给对话基类增加一人成员变量CBursh :

class CMyFormView : public CFormView

{

…

private :

CBrush m_ brush ; // background brush

…

} ;

其次, 在类的构造函数中将刷子初始化为所需要的背景颜色。

CMyFormView : : CMyFormView ( )

{

// Initialize background brush .

m_brush .CreateSolidBrush (RGB ( 0, 0, 255 ) )

}

最后,使用ClassWizard处理WM_CTLCOLOR消息并返回一个用来绘画对话背景的刷子句柄。注意:由于当重画对话控件时也要调用该函数,所以要检测nCtlColor参量。

HBRUSH CMyFormView : : OnCtlColor (CDC* pDC , CWnd*pWnd , UINT nCtlColor )

{

// Determine if drawing a dialog box . If we are , return +handle to

//our own background brush . Otherwise let windows handle it .

if (nCtlColor = = CTLCOLOR _ DLG )

return (HBRUSH) m_brush .GetSafeHandle ( ) ;

return CFormView : : OnCtlColor (pDC, pWnd , nCtlColor );

}


[自己总结+网上流传]Visual C++编程技巧 1. 如何获取应用程序的实例句柄?应用程序的 实例句柄保存在CWinAppIm_hInstance 中,可以这么调用AfxGetInstancdHandle获得句柄.Example: HANDLE hInstance=AfxGetInstanceHandle();2. 如何通过代码获得应用程序主窗口的指针?主窗口的 指针保存在CWinThread::m_pMainWnd中,调用 AfxGetMai 阅读详情

相关推荐

Visual C++编程从入门到实战自学指南

Visual Studio 是微软推出的集成开发环境(IDE),广泛应用于 Windows 平台下的 C++ 开发。其核心优势在于集成了代码编辑器、调试器、资源管理器、图形界面设计工具等多个功能模块,极大提升了开发效率。Visual Studio 支持多种编译器(如 MSVC)、跨平台开发(如 C++/CLI、C++ for Linux)、以及与 Git 的深度集成,适合从初学者到专业开发者的各类用户。小贴士。

weixin_34471637的博客 752

c++ 使用画刷绘制背景颜色

HBRUSH CBrushBKDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: Change any attributes of the DC here CBrush m_brush; //定义画刷 m_brush.CreateSolidBrush(RGB(255,0,0));//指定画刷颜色 CR..

dxm809的博客 833

全面掌握Visual C++网络编程高级技巧

TCP/IP 协议族定义了网络通信过程中的基本结构,这套结构被分为四层,分别为:链路层、网络层、传输层和应用层。每一层都有其特定的功能和协议,使得复杂的数据通信过程变得条理清晰。链路层:负责在相邻网络节点之间的帧传输。常见的协议有以太网(Ethernet)、Wi-Fi等。网络层:管理数据包在网络中的传输路径,IP协议是该层的核心。它负责把数据包路由到最终目的地。传输层:主要负责的是数据包的传输,包括端到端的连接建立和数据传输管理。

weixin_42462474的博客 666

Visual C++ 编程技巧之三和四

Visual C++ 编程技巧之一和二 转载自网上

无幻 2409

Visual C++编程详解:从基础到Windows应用开发

Visual C++ 是微软公司推出的一个功能强大的集成开发环境(IDE),它广泛应用于C++语言的开发,包括桌面应用程序、游戏、驱动程序以及系统软件等。作为一个成熟的开发工具,它提供了丰富的功能,从代码编辑、编译链接到调试、性能分析以及版本控制等,大大提高了开发效率。STL的强大之处在于它提供了一套统一的接口和数据结构来处理数据集合。通过使用STL组件,开发者能够以更少的代码量完成复杂的任务。STL容器本身是通用的,但有时候我们需要实现一些特殊的数据结构。

weixin_36059856的博客 1207

Visual C++编程实践:核心概念与技巧全解

本文还有配套的精品资源,点击获取 简介:Visual C++(VC++)是微软推出的集成开发环境,主要用于编写C++程序。本文深入探讨了VC++的关键知识点和实用技巧,包括IDE使用、MFC、源码管理、编译与链接、调试技巧、异常处理、多线程编程、预处理指令、模板和泛型编程、STL、资源文件处理、性能优化、错误和日志记录、国际化与本地化及文档与注释等,以帮助开发者提升编程效率...

weixin_42578963的博客 931

【C++版】visual studio 2019安装教

也勾上,一般这个模块已经很少用了,因为比较老,用Qt软件写可视化项目的比较多。注:想用visual studio写可视化项目的,把右侧的一个。登录visual studio 官网。打开visual studio,选择。如果想要好一点的编程感觉可以点击工具。如果有疑问可以私信我哦!选择字体和颜色,分别对。选择模块,C++选择。

千禧皓月的博客 6万+

C++编程与Visual C++环境实战教程

Visual C++是微软公司推出的一款功能强大的C++集成开发环境,支持Windows平台下的程序开发。本章旨在为读者提供一个全面的视觉C++开发环境的概览,并引导读者掌握如何设置和配置该环境,以备后续章节的学习。Visual Studio使用解决方案(Solution)来组织一个或多个项目(Project)。每个项目包含了构建一个软件应用所需要的所有代码文件、资源、数据以及配置信息。在创建一个新的C++项目时,你可以选择多种项目模板,比如控制台应用程序、Windows桌面应用程序等。

weixin_42613017的博客 1147

Visual C++编程技巧精选500例.pdf

Visual C++编程技巧精选500例.pdf 去发现同类优质开源项目:https://gitcode.com/ 《Visual C++编程技巧精选500例》是一本深入浅出的Visual C++编程指南,内容涵盖了消息框、常用控件、通用对话框、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序版权信息、...

gitblog_06794的博客 916

Visual C++网络编程高级指南

本文还有配套的精品资源,点击获取 简介:《Visual C++网络高级编程》是一本专门介绍如何在Visual C++环境下进行高效网络应用开发的书籍。书中从基础的C++网络编程概念出发,深入探讨了使用Windows API和MFC库构建客户端和服务器应用程序的方法。此外,还涵盖了多线程技术、网络通信错误处理、网络安全协议以及Internet功能的使用。本书为C++开发者提供...

weixin_35753431的博客 1565

深入掌握Visual C++ MFC编程:实例与实践

本文还有配套的精品资源,点击获取 简介:《Visual C++ MFC 编程实例教程》是一本专门针对MFC应用程序开发的指南,介绍了如何使用Visual C++进行高效编程。本书涵盖了MFC的核心概念、文档/视图架构、事件处理以及高级特性,并提供了实用的编程技巧和最佳实践。读者将通过详细的实例学习,逐步掌握从创建工程到优化程序的全过程,成为MFC编程领域的专家。 1....

weixin_42579969的博客 1295

【C++】11 Visual Studio 2019 C++安装matplotlib-cpp绘图

使用C++调用matplotlib-cpp绘图

记录专业模型开发、算法程序设计、软件学习笔记、生活日志。 9394

Visual C++ 6.0 编程技巧与百例实战

MFC(Microsoft Foundation Classes)是微软公司提供的一套C++类库,旨在简化Windows应用程序的开发。它将Windows API中复杂的函数和数据结构封装成一系列的类,使开发者能够使用面向对象的方法来编写Windows软件。MFC类库通过封装标准的Windows API,提供了一个对象导向的框架,让开发者可以专注于业务逻辑的实现,而无需从头开始编写底层代码。MFC的核心类库包括了对窗口管理、图形设备接口(GDI)、通用控制、诊断和调试等方面的支持。

weixin_42388898的博客 743

【C++】Visual Studio调试C++代码的13个技巧

Visual Studio调试C++的13个技巧,推荐!!

风的博客 7963

看不懂分子动力学模拟的结果?一文读懂RMSD曲线

随后,将每一帧结构与初始模板进行叠合,计算对应原子的平均偏移量,即RMSD。总之,掌握 RMSD 的解读方法,就等于抓住了评估分子动力学模拟成败与质量的“总开关”。①在模拟初始阶段,RMSD会从0迅速上升,这是蛋白质从静态晶体或模型结构释放到溶液环境中并逐渐适应的正常过程。②经过一段时间后,曲线不再系统性上升或下降,而是围绕一个平均值,小幅度地上下波动,形成一个稳定的“平台”。这种情况下,RMSD 在初始快速上升后,并未进入平台,而是持续甚至加速上升,始终未见收敛。🔍 如何解读不同趋势的RMSD曲线。

weixin_46587777的博客 4891

PCB压合原理与工艺全流程深度解析

PCB压合是多层印制电路板制造中的核心工序,其本质并非简单物理叠加,而是高分子树脂流动、玻璃布应力释放、铜箔热膨胀及界面能调控的协同过程。理解压合原理,需掌握温度-压力-时间三维曲线动态关系;优化工艺流程,须兼顾叠板精度、热压参数匹配与冷却策略;关键影响因素如半固化片(PP)选型、铜箔表面处理、设备温场均匀性、结构对称性、环境湿度及操作手法,共同决定层间结合力、翘曲度与孔壁质量。本文围绕PCB压合原理、工艺流程、关键影响因素三大维度展开,融合IPC标准、实测数据与产线案例,为工艺工程师、NPI人员及设备维护

weixin_29191081的博客 257

Visual C++编程的若干技巧

                                      Visual C++编程的若干技巧  Visual C++是一种面向对象的可视化编程工具,它提供的AppWizard能自动生成应用程序的标准框架,大大减轻了编程的工作量。本文主要介绍如下的编程技巧:修改主窗口风格、创建不规则形状窗口、用鼠标单击窗口标题条以外区域移动窗口、使用上下文菜单、使应用程序只能运行一个实例、使应

iBreathe的专栏 1359

WPF毛玻璃效果别再写C#代码了!纯XAML用Border+VisualBrush+BlurEffect三步搞定

本文详细介绍了如何在WPF中通过纯XAML实现毛玻璃效果,无需编写C#代码。通过VisualBrush、BlurEffect和Clip的黄金组合,开发者可以快速创建专业级的毛玻璃面板,提升UI的现代感和视觉层次。文章还提供了性能优化技巧和实战案例,帮助开发者在各种场景中高效应用这一技术。

weixin_28630185的博客 352
上一篇: Visual C++编程技巧之三
下一篇: Visual C++编程技巧之五
0x16
博客等级 码龄20年 79粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值