Visual C++编程技巧之八

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

 

57、为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态

58、如何给系统菜单添加一个菜单项

59、如何确定顶层菜单所占据的菜单行数

60、在用户环境中如何确定系统显示元素的颜色

61、如何查询和设置系统参数

62、如何使用一个预定义的Windows光标

63、如何确定当前屏幕分辨率

64、如何检索原先的Task Manager应用程序使用的任务列表

65、如何确定Windows和Windows系统目录

66、在哪儿创建临文件

67、如何访问桌面窗口

 

57、为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态

需要将CFrameWnd:: m_bAutomenuEnable设置为FALSE,如果该数据成员为TRUE(缺省值),工作框将自动地禁止没有ON_UPDATE_COMMAND_UI或者ON_COMMAND的菜单项。

//Disable MFC from automatically disabling menu items.

m_bAuoMenuEnable=FALSE;

//Now enable the menu item.

CMenu* pMenu=GetMenu ();

ASSERT_VALID (pMenu);

pMenu->EnableMenuItem (ID_MENU_ITEM,MF_BYCOMMAND | MF_ENABLED);

58、如何给系统菜单添加一个菜单项

给系统菜单添加一个菜单项需要进行下述三个步骤:

首先,使用Resource Symbols对话(在View菜单中选择Resource Symbols...

可以显示该对话)定义菜单项ID,该ID应大于0x0F而小于0xF000;

其次,调用CWnd::GetSystemMenu获取系统菜单的指针并调用CWnd:: Appendmenu将菜单项添加到菜单中。下例给系统菜单添加两个新的菜单项:

int CMainFrame:: OnCreate (LPCREATESTRUCT lpCreateStruct)

{

…

//Make sure system menu item is in the right range.

ASSERT (IDM_MYSYSITEM &0xFFF0)==IDM_MYSYSITEM);

ASSERT (IDM-MYSYSITEM<0xF000);

//Get pointer to system menu.

CMenu* pSysmenu=GetSystemmenu (FALSE);

ASSERT_VALID (pSysMenu);

//Add a separator and our menu item to system menu.

CString StrMenuItem (_T ("New menu item"));

pSysMenu->Appendmenu (MF_SEPARATOR);

pSysMenu->AppendMenu (MF_STRING, IDM_MYSYSITEM, strMenuitem);

…

}

现在,选择系统菜单项时用户应进行检测。使用ClassWizard处理

WM_SYSCOMMAND消息并检测用户菜单的nID参数:

void CMainFrame:: OnSysCommand (UINT nID,LPARAM lParam)

{

//Determine if our system menu item was selected.

if ( (nID & 0xFFF0)==IDM_MYSYSITEM)

{

//TODO-process system menu item

}

else

CMDIFrameWnd:: OnSysCommand (nID, lParam);

}

最后,一个设计良好的UI应用程序应当在系统菜单项加亮时在状态条显示一个帮助信息,这可以通过增加一个包含系统菜单基ID的串表的入口来实现。

59、如何确定顶层菜单所占据的菜单行数

这可以通过简单的减法和除法来实现。首先,用户需要计算主框窗口的高度和客户区;其次,从主框窗口的高度中减去客户区、框边界以及标题的高度;最后,除以菜单栏的高度。下例成员函数是一个计算主框菜单所占据的行数的代码实现。

int CMainFrame:: GetMenuRows ()

{

CRect rcFrame,rcClient;

GetWindowRect (rcFrame);

GetClientRect (rcClient);

return (rcFrame.Height () -rcClient.Height ()-

:: GetSystemMetrics (SM_CYCAPTION) -

(:: getSystemMetrics (SM_CYFRAME) *2)) /

:: GetSystemMetrics (SM_CYMENU);

}

60、在用户环境中如何确定系统显示元素的颜色

调用SDK函数GetSysColor可以获取一个特定显示元素的颜色。下例说明了如何在MFC函数CMainFrameWnd:: OnNcPaint中调用该函数设置窗口标题颜色。

void CMiniFrameWnd:: OnNcPaint ()

{

…

dc.SetTextColor (:: GetSysColor (m_bActive ?

COLOR_CAPTIONTEXT : COLOR_INACTIVECAPTIONTEXT));

…

}

61、如何查询和设置系统参数

在Windows 3.1 SDK中介绍过SDK函数SystemParametersInfo,调用该函数可以查询和设置系统参数,诸如按键的重复速率设置、鼠标双击延迟时间、图标字体以及桌面覆盖位图等等。

//Create a font that is used for icon titles.

LOGFONT stFont;

:: SystemParametersInfo (SPIF_GETICONTITLELOGFONT,

sizeof (LOGFONT), &stFont, SPIF_SENDWININICHANGE);

m_font.CreateFontIndirect (&stFont);

//Change the wallpaper to leaves.bmp.

:: SystemParametersInfo (SPI_SETDESKWALLPAPER, 0,

_T (" forest.bmp"), SPIF_UPDATEINIFILE);

62、如何使用一个预定义的Windows光标

调用CWinApp:: LoadStandardCursor并传送光标标识符。

BOOL CSampleDialog:: OnSetCursor (CWnd* pWnd, UINT nHitTest, UINT message)

{

//Display wait cursor if busy.

if (m_bBusy)

{

SetCursor (AfxGetApp () ->LoadStandardCursor (IDC_WAIT));

return TRUE;

}

return CDialog:: OnSetCursor (pWnd. nHitTest,message);

}

63、如何确定当前屏幕分辨率

调用SDK函数GetSystemMetrics,该函数可以检索有关windows显示信息,诸如标题大小、边界大小以及滚动条大小等等。

//Initialize CSize object with screen size.

CSize sizeScreen (GetSystemMetrics (SM_CXSCREEN),

GetSystemMetrics (SM_CYSCREEN));

64、如何检索原先的Task Manager应用程序使用的任务列表

原先的Task Manager应用程序显示顶层窗口的列表。为了显示该列表,窗口

必须可见、包含一个标题以及不能被其他窗口拥有。调用CWnd:: GetWindow可以

检索顶层窗口的列表,调用IsWindowVisible、GetWindowTextLength以及GetOwner

可以确定窗口是否应该在列表中。下例将把TaskManager窗口的标题填充到列表中。

void GetTadkList (CListBox&list)

{

CString strCaption; //Caption of window.

list.ResetContent (); //Clear list box.

//Get first Window in window list.

ASSERT_VALID (AfxGetMainWnd ());

CWnd* pWnd=AfxGetMainWnd () ->GetWindow (GW_HWNDFIRST);

//Walk window list.

while (pWnd)

{

// I window visible, has a caption, and does not have an owner?

if (pWnd ->IsWindowVisible () &&

pWnd ->GetWindowTextLength () &&! pWnd ->GetOwner ())

{

//Add caption o window to list box.

pWnd ->GetWindowText (strCaption);

list.AddString (strCaption);

}

//Get next window in window list.

pWnd=pWnd->GetWindow (GW_HWNDNEXT);

}

}

65、如何确定Windows和Windows系统目录

有两个SDK函数可以完成该功能。GetWindowsDirectory和GetSystemDirectory,下例说明了如何使用这两个函数:

TCHAR szDir [MAX_PATH];

//Get the full path of the windows directory.

:: GetWindowsDirectory (szDir, MAX_PATH);

TRACE ("Windows directory %s/n", szDir);

//Get the full path of the windows system directory.

:: GetSystemDirectory (szDir, MAX_PATH);

TRACE ("Windows system directory %s/n", szDir);

66、在哪儿创建临文件

调用SDK函数GetTemPath可以确定临时文件的目录,该函数首先为临时路径检测TMP环境变量:如果没有指定TMP,检测TMP环境变量,然后返回到当前目录。下例说明了如何创建一个临时文件。

…

//get unique temporary file.

CString strFile;

GetUniqueTempName (strFile);

TRY

{

//Create file and write data.Note that file is closed

//in the destructor of the CFile object.

CFile file (strFile,CFile:: modeCreate | CFile:: modeWrite);

//write data

}

CATCH (CFileException, e)

{

//error opening file

}

END_CATCH

…

Void GetuniqueTempName (CString& strTempName)

{

//Get the temporary files directory.

TCHAR szTempPath [MAX_PATH];

DWORD dwResult=:: GetTempPath (MAX_PATH, szTempPath);

ASSERT (dwResult);

//Create a unique temporary file.

TCHAR szTempFile [MAX_PATH];

UINT nResult=GetTempFileName (szTempPath, _T ("~ex"),0,szTempfile);

ASSERT (nResult);

strTempName=szTempFile;

}

67、如何访问桌面窗口

静态函数CWnd:: GetDesktopWindow 返回桌面窗口的指针。下例说明了MFC函数CFrameWnd::BeginModalStae是如何使用该函数进入内部窗口列表的。

void CFrameWnd::BeginModalState ()

{

…

//first count all windows that need to be disabled

UINT nCount=0;

HWND hWnd=:: GetWindow (:: GetDesktopWindow (), GW_CHILD);

while (hWnd!=NULL)

{

if (:: IsWindowEnabled (hwnd) &&

CWnd::FromHandlePermanent (hWnd)!=NULL &&

AfxIsDescendant (pParent->m_hWnd, hWnd) &&

:: SendMessage (hWnd, WM_DISABLEMODAL, 0, 0)==0)

{

++nCount;

}

hWnd=:: GetWindow (hWnd, GW_HWNDNEXT);

}

…

}


[自己总结+网上流传]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

Visual C++开发工具与调试技巧整理

文章来源:http://www.ttadd.com/diannao/HTML/235896.html  1.如何在Release状态下进行调试  Project->Setting=>ProjectSetting对话框,选择Release状态。C/C++标签中的Category选General,Optimizations选Disable(Debug),Debut info选Program D

快乐天堂 2909

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

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

weixin_42462474的博客 666

Visual C++开发经验技巧宝典

Visual C++开发经验技巧宝典 书名:Visual C++开发经验技巧宝典 作者:明日科技 编著 来源:人民邮电出版社 出版时间:2007年11月 ISBN:9787115166593 定价:89元 看 书 评 论 收 藏打 分 购 买 图书版权归出版社和作者所有,优快云 & D

1128

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

Visual C++ 编程技巧之七、八和九

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

无幻 3960

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

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

weixin_42613017的博客 1147

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

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

千禧皓月的博客 6万+

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

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

weixin_42388898的博客 743

Visual C++实战编程100例(第2版)完整源码解析

在Visual C++中,变量的定义是程序开发的基础。C++支持多种内置数据类型,包括整型(int)、浮点型(floatdouble)、字符型(char)、布尔型(bool)等。定义变量时需指定其类型和名称,例如:// 整型变量// 双精度浮点型// 字符型// 布尔型上述代码中,变量被赋予了初始值。在Visual Studio中编译运行后,可通过调试器查看变量值的变化,理解其在内存中的存储方式。变量命名应遵循命名规范,如使用有意义的英文单词,避免关键字等。

weixin_29476595的博客 967

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

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

gitblog_06794的博客 916

南大计算机2024保研笔试:编译原理等5门专业课考点分布与408复习避坑指南

本文详细解析了南京大学计算机2024保研笔试的考点分布与复习策略,重点突出编译原理(占比28%-32%)和离散数学的特色考核。提供跨课程复习方法、真题题型分析及高效备考建议,帮助考生突破传统408框架,应对南大独特的命题风格。

weixin_29304985的博客 345

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

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

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

FPGA网络调试实战:基于88E1111和DP83867两款PHY芯片的SGMII-UDP数据回环对比与避坑指南

本文深入对比了88E1111与DP83867两款PHY芯片在SGMII-UDP数据回环中的性能差异,涵盖硬件设计、Vivado工程配置及调试技巧。通过实测数据揭示DP83867在吞吐量、延迟和功耗方面的优势,并提供FPGA网络调试中的常见问题解决方案,助力工程师高效完成项目开发。

weixin_31682031的博客 384

OpenGL纹理贴图

OpenGL纹理1. 基本概念2. 纹理环绕方式3. 纹理过滤3.1 GL_NEAREST3.2 GL_LINEAR3.3 多级渐远纹理 (Mipmap)4. 纹理加载与创建4.1 纹理加载4.2 纹理创建4.3 纹理的使用 1. 基本概念 纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来表示物体的细节特征,希望绘制一个有足够多细节的物体,当然可以用足够多的顶点颜色来描述,但是无疑也增加了许多额外的开销;另一种办法就是使用纹理。 学习之前先展示一张实现的纹理图以更好理解纹理! 还是这张图为了将纹

牵LV小猪精的博客 8925

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

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

风的博客 7963

方法二:旋转机械动平衡精度计算

本文以实际案例为基础,系统阐述基于ISO 1940标准的动平衡精度G GG等级计算方法。通过角速度转换、许用剩余不平衡量e p e r e_{per}e per ​ 推导及G GG等级公式应用,结合惯性力偶矩、转子质量等参数,得出某转子系统的动平衡精度为G 40 G40G40。文中详细解析了公式原理与参数单位转换要点,并附完整ISO 1940动平衡等级参考表,为工程师提供从理论到实践的完整解决方案。研究结果表明,该方法可有效量化旋转机械的平衡精度,适用于风机、泵类等中低速设备的设计与调试,对提升设备运行

weixin_46153372的博客 922

Visual C++编程的若干技巧

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

iBreathe的专栏 1359

Fluent温度超限调试:从能量方程到网格优化的实战指南

本文深入解析Fluent中温度超限问题的诊断与解决方法,从能量方程机制到网格优化策略,提供实战指南。通过分析温度与焓的换算关系,探讨典型场景如能量方程发散、局部网格质量差等,并给出五步调试法及高级命令应用,帮助工程师有效解决温度计算异常问题。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值