flash player activexx 类型不匹配 VT_UI1|VT_ARRAY

XMLHttpRequest To provide client server communications with the http protocol Dim HttpReq As New MSXML2.XMLHTTP30 HttpReq.open &GET&, &http://localhost/books.xml&, False HttpReq.send MsgBox HttpReq.responseText Remarks XmlHttp client o
由于现在在公司负责制作标准的静态页面,为了增强客户体验,所以经常要做些AJAX效果,也许你也和我一样在,学习AJAX. 而设计AJAX时使用的一个重要的技术(工具)就是XMLHTTPRequest对象了.这里海啸把我学习XMLHTTPRequest对象的一点资料拿出来跟大家一起分享.文中的资料都是海啸在学习时在网上收集的,如果您开过,那就再加深下印象吧!(如果您觉得侵犯了您的版权,请联系海啸.(haixiao_yao[at]yahoo.com.cn)) 1.XMLHTTPRequest对象什么是
1.XMLHTTPRequest对象什么是? 最通用的定义为:XmlHttp是一套可以在Javascript.VbScript.Jscript等脚本语言中通过http协议传送或从接收XML及其他数据的一套API.XmlHttp最大的用处是可以更新网页的部分内容而不需要刷新整个页面.(这个功能正是AJAX的一大特点之一:)) 来自MSDN的解释:XmlHttp提供客户端同http服务器通讯的协议.客户端可以通过XmlHttp对象(MSXML2.XMLHTTP.3.0)向http服务器发送请求并使用
Package using the SAFEARRAY data POST. SAFEARRAY * // Define safearray SAFEARRAYBOUND rgsabound[1]; // According to the dimension of the array to define several array element, this example is a single-dimensional array rgsabound[0].cElements = p
前天碰到有人问SAFEARRAY的问题,我正好对VB SCRIPT里面如何得到COM组件返回的数组感兴趣,就试验了一下. IDE用的是VC7.1 开始都差不多,建立工程,建立COM对象,建立方法: 接口定义: [id(2), helpstring(&method GetArray&)] HRESULT GetArray1([out,retval] VARIANT* v); 方法实现: STDMETHODIMP CATL3::GetArray1(VARIANT * pvaVariant)
目录: SAFEARRAY使用实例... 1 目录:... 1 前言:... 1 何谓SAFEARRAY:... 1 创建SAFEARRAY:2 方法一:使用SafeArrayAllocDescriptor在栈上创建一维数组... 2 方法二:使用SafeArrayAllocDescriptor和SafeArrayAllocData在堆上创建一维数组... 2 方法三:使用SafeArrayAllocDescriptor和SafeArrayAllocData在堆上创建二维数组... 3 方法四:
之前对于删除操作,一直使用的是头儿写的通用的&确认删除&的方法 // 显示确认对话框 function showConfirm(txtTitle, txtMsg, callback){ getDivDialog().text(txtMsg).dialog({ modal: true , overlay: { opacity: 0.5 } , title: txtTitle ,buttons: { &是& : function(){ callback(); $(thi
&html& &head& &script type=&text/javascript& src=&jquery-1.4.1.js&&&/script& &script type=&text/javascript&& $(&document&).ready ( function() { $(&a&).click(function(){ $('#ui
SQL trace settings to SQL_TRACE very simple, SQL_TRACE is a parameter, only in the session layer, set it to TRUE, to usher in a SQL trace, Oracle SQL statement will be the implementation of records to trace file. Through access to trace files, will h
To follow a very simple SQL SQL_TRACE Shezhi, SQL_TRACE is a parameter, only need to Zai session Cengjiang set it to TRUE, the Kai Qi Liao SQL Tracking, Oracle will be the implementation of the SQL statement Guochengjilu Dao Genzongwenjian in. Throug
&div& &input value=&333&/& &/div& var div = document.getElementById('ui'); var input = document.getElementById('ui1'); input.value = '444'; alert(div.innerHTML) Ie value is 444 in the next, in the gecko and webkit is under 333.
1, the string conversion 1, CString into a plastic Int CString str = _T (&12345&); / / Atoi, do not know no other function, currently only know atoi atoi ((LPCSTR) str); / / use LPCSTR const char * can be transformed into 2, a CString to a char
The support of the many users, serial debugging assistant from May 21, 2001 release date, just one month, total across the country downloaded nearly 5,000 times, more than 200 e-mail in the past, 20 people provided the use of test views, more than 50
Original Address: http://www.open-open.com/ajax/jQuery.htm Horizontal accordion: jQuery Development based on jQuery, a very simple horizontal fold control. Horizontal accordion: jQuery jQuery-Horizontal Accordion XBOX360 blade style interface with ho
import com.jacob.com.*; import com.jacob.activeX.*; public class Exam_6 { public static void main(String[] args) { ActiveXComponent pp = new ActiveXComponent(&PrjCOM.MyCOM&); try { SafeArray sa = new SafeArray(Variant.VariantString,2); Variant v
1 Use SafeArray VB SafeArray is stored in the array. By SafeArray, can VC + + and VB in the mutual call. Automation SafeArray is stored in the standard array. 1.1 SafeArray handler COM provides a set of API for processing SafeArray. To ensure procedu
Early days, the project needs to be done for an automatic landing site ActiveX plug-ins. Main function is started by the plugin instance or use an IE browser plug-in which, Make a website (that is, through Navigate navigation), by IHTMLDocument2 find
Original Address: http://hi.baidu.com/hfutgiser/blog/item/f09fe.html Previously used in the neural network are adjusted in matlab, but the project needs to write a neural network algorithm, the main interface is written in VB in VB
[Transfer] http://wjhaishun.iteye.com/blog/657083 [More fully] http://www.sudu.cn/info/html/edu/645.html This is a global alter system set sql_trace = true alter system set sql_trace = false SQL_TRACE set the SQL Trace is very simple, SQL
jQuery Sticky Notes 网站 : http://www.oschina.net/action/project/go?id=13771&p=home jQuery Sticky Notes 是一款 jQuery 基于网页的即时贴插件.如下图所示: 示例代码: &html&&head& &script type=&text/javascript& src=&jquery-1.3.2.min.js&&&/s
JScript 8.0 VBArray 对象 提供对 Visual Basic 安全数组的访问. varName = new VBArray(safeArray) 参数 varName 必选.VBArray 分配到的变量名称. safeArray 必选.VBArray 值. 备注 safeArray 参数在传递到 VBArray 构造函数之前必须具有一个 VBArray 值.要获取该值,可以从现有的 ActiveX 或其他对象检索该值. 注意 在 JScript 中创建的数组和在 Visual
这篇文章主要介绍了C++使用ADO实现存取图片的方法,需要的朋友可以参考下 一般在网上查到的资料中向Server2000存储图片代码比较多,从数据库中读取图片并显示也不少,但是把图片从数据库中二进制数据转换为原图片保存在本地,就很少有C++代码了.本文就此问题一步一步地讲一讲解决的方法: 一.使用数据库前的准备 我们使用ADO,是用_ConnectionPtr,_RecordsetPtr来操纵数据库的.还有一个_CommandPtr,本程序没有使用它. 为了使用ADO,需要导入ADO动态链接库.
JavaScript调用COM传递数组时,在COM接口端,接收到的是VARIANT类型对象,如array,该对象的vt类型VT_DISPATCH,因此其值表示的是一个IDispatch类型的指针. IDispatch类型的指针,则表明该数组对象实际是一个JavaScript的内建数组对象,在JavaScript端,我们可以通过length属性来得到数组的大小,那么在此处,可以通过GetIDsOfNames函数和Invoke函数来获取数组长度,这样可以动态变量数组内容. // 获取数组长度 BST
/*-------------------ASP文档参考集-----------------------*/ *--&作者:草履虫 *--&时间:---(原来是自己编写的手册,现在发在这里) *--&联系:[email protected] *--&文档功能: 1.复习了ASP,加深了对ASP结构的理解和ASP的体会 2.可以用来做ASP参考,自己写的,参考起来更方便 这是第二部分:ASP七大对象 /*----------------------
jquery ui 的 dialog 在IE8下会出现不该出现的滚动条,在JQUI的FORUM上SEARCH下,发现也有人碰上,当解决办法就是把滚动条隐藏 此问题在UI1.7就出现,到了UI1.8也未修复,真不知道该怎么说好.. JQUI 开发提交BUG的帖子:http://dev.jqueryui.com/ticket/3623 解决办法相当不科学~ 我的解决办法,个人感觉好过那个,因为我只隐藏横的滚动条,呵呵 附上修改的代码: 修改:jquery.ui.dialog.js var $el =
花N长时间积累的Jquery插件,希望大家喜欢.大家还有什么新的插件,请留言,我们一并收录.感谢大家的支持. 1.accordion类 基于jQuery开发,非常简单的水平方向折叠控件. Horizontal accordion: jQuery 热点图书:www.hotbook.cn jQuery-Horizontal Accordion 具有XBOX360 blade界面风格的水平方向Accordion. jQuery-Horizontal Accordion jQuery plugin: A
因为要给新员工进行培训jQuery.UI方面的内容,我之前学习的都是jquery.ui-1.6b的,现在的版本升级到jquery-ui-1.7.1,除了样式上有很大调整以外,API也有了很大的变化. 1. 每个ui插件现在都有自己单独的css文件,但是要根据情况与ui.theme.css ui.core.css结合使用,否则有些效果还是显示不出来的. eg. datepicker就必须同时引用上述两个css文件:accordion 只须引入ui.theme.css即可.这个我会把每个插件独立的d
jQuery EasyUI是一组基于jQuery的UI插件集合,而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面. 第一步下载jquery easyui 下载地址:http://www.jb51.net/codes/70218.html 第二步创建Java web项目 第三步导入相关的文件..目录结构如下 &link rel=&stylesheet& type=&text/css& href=&easyu
这篇文章主要介绍了JavaScript中的ubound函数使用实例,本文先是讲解了ubound函数的语法,然后给出了用法代码实例,需要的朋友可以参考下 JavaScript中ubound函数方法是返回在 VBArray 的指定维中所使用的最大索引值.使用方法: safeArray.ubound(dimension) 其中safeArray是必选项.是一个 VBArray 对象. dimension是可选项.要获知其索引上界的 VBArray 的维数.如果忽略,ubound 将该参数作为 1 进行
一.前言 上回书介绍了GUID.CLSID.IID和接口的概念.本回的重点是介绍 COM 中的数据类型.咋还不介绍组件程序的设计步骤呀?咳......别着急,别着急!孔子曰:&饭要一口一口地吃&:老子语:&心急吃不了热豆腐&,孙子云:&走一步看一步吧& ...... 先掌握必要的知识,将来写起程序来才会得心应手也:-) 走入正题之前,请大家牢牢记住一条原则:COM 组件是运行在分布式环境中的.比如,你写了一个组件程序(DLL或EXE),那么使用者
CString是一个动态TCHAR数组, BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵 ) LPCTSTR只是一个常量的TCHAR指针. CString 是一个完全独立的类,动态的TCHAR数组,封装了+等操作符和字符串操作方法. typedef OLECHAR FAR* BSTR; typedef const char * LPCTSTR; vc++中各种字符串的表示法 首先char* 是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持
1)My97DatePicker是一个更全面,更人性化,并且速度一流的 日期选择控件.具有强大的日期范围限制功能:自定义事件和丰富的API库:多语言支持和自定义皮肤支持:跨 无限级框架显示和自动选择显示位置. 主页: http://www.my97.net/dp/index.asp 演示地址: http://www.my97.net/dp/demo/index.htm 2)Date Range Picker基于jQuery UI1.6与jQuery UI CSS框架开发的日期选择控件. 主页:
一.VC常用数据类型列表 二.常用数据类型转化 2.1数学类型变量与字符串相互转换 2.2 CString及string,char *与其他数据类型的转换和操作 ●CString,string,char*的综合比较 ●数学类型与CString相互转化 ●CString与char*相互转换举例 ●CString 与 BSTR 型转换 ●VARIANT 型转化成 CString 型 2.3 BSTR._bstr_t与CComBSTR 2.4 VARIANT ._variant_t 与 COleVar
CString, BSTR, LPCTSTR之间得关系和区别 CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针. CString 是一个完全独立的类,动态的TCHAR数组,封装了 + 等操作符和字符串操作方法. typedef OLECHAR FAR* BSTR; typedef const char * LPCTSTR; vc++中各种字符串的表示法 首先char* 是指向ANSI字符数组的指针,其中
int i = 100; long l = 2001; float f=300.2; double d=; char username[]=&程佩君&; char temp[200]; char * CS _variant_t v1; _bstr_t v2; 一.其它数据类型转换为字符串 短整型(int) itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制 itoa(i,temp,2); ///按二
一. VC常用数据类型列表 二. 常用数据类型转化 2.1数学类型变量与字符串相互转换 2.2 CString及string,char *与其他数据类型的转换和操作 ●CString,string,char*的综合比较 ●数学类型与CString相互转化 ●CString与char*相互转换举例 ●CString 与 BSTR 型转换 ●VARIANT 型转化成 CString 型 2.3 BSTR._bstr_t与CComBSTR 2.4 VARIANT ._variant_t 与 COleV
COM 数据类型 下表显示在 COM 中使用的数据类型及其相应的 .NET Framework 内置值类型或类. 此表中没有显式标识的任何类型都将被转换为 Int32 系统类型. 有关 Visual Basic 2005.C# 和 C++ 中的相应类型,请参见 .NET Framework 类库介绍 . COM 值类型 COM 引用类型 系统类型 bool bool * System::Int32 char.small char *.small * System::SByte short sho
由于项目开发需要,原有的程序用C++开发,但是现有用C#开发,所以需要对用C++开发的接口利用COM进行封装,供c#语言调用,在此处用到一个字节数组,所以此处对其进行封装. (一)用到的COM接口: 1.1 SAFEARRAY的创建 SAFEARRAY* SafeArrayCreate( VARTYPE vt, unsigned int cDims, SAFEARRRAYBOUND * rgsabound ); VARTYPE 数组数据的类型,此处为:VT_UI1表示1个字节的BYTE类型.具体
ATL问题集(前31个) ATL问题集(前31个) 这些问题是以前在csdn当版主是一些朋友整理的,今天找到了,贴到这里来! #1 如何使用控件不能改变大小? 答:有时我们需要创建不可改变大小的控件,像那种在运行时没有界面的控件(例:时间控件,SysInfo 等),想做到这种功能的话,请把以下代码加入到控件类的构造函数: m_bAutoSize = TRUE; SIZEL size = {24, 24}; AtlPixelToHiMetric(&size, &m_sizeExtent);
Visual C++.NET涉及到ATL/ATL Server.MFC和托管C++等多种编程方式,不仅功能强大而且应用广泛.在编程中,我们常常会遇到ANSI.Unicode以及BSTR不同编码类 型的字符串转换操作.本文先介绍基本字符串类型,然后说明相关的类,如CComBSTR._bstr_t.CStringT等,最后讨论它们的转换方法, 其中还包括使用最新ATL7.0的转换类和宏,如CA2CT.CA2TEX等. 一.BSTR.LPSTR和LPWSTR 在Visual C++.NET的所有编程方
我们先看看COM所支持的一些类型的基本类: (微软提供,在comdef.h中定义) 在COM中使用的标准类Class如下所示: _bstr_t:对BSTR类型进行打包,并提供有用的操作和方法: _com_error:定义抛出的error对象: _com_ptr_t:封装COM接口指针 _variant_t:对VARIANT类型进行打包,并提供有用的操作和方法: 一._variant_t类的简单介绍: _variant_t对象封装了VARIANT数据类型. The class manages re
1. 简单方法:int转String:ToString():int转string:int.Parse() 复杂方法:int转String:System.Convert.ToString():int转string:System.Convert.ToIntXX() 2. int32.parse(xxxxxx); xx.toString(); 3. string到int: Int.Parse(); Convert.Toint(); int到string:ToString(); 还有一些好像是vc的,如
12 steps to Navier-Stokes 12步解N-S方程 本系列教程是美国Prof. Lorena教授的网络教程.学习的前提是你有偏微分方程.计算流体力学以及Python的基础知识. 先看一个完成学习后所编程序执行后Cavity flow的数值解 : Cavity flow solution at Reynolds number of 200 with a 41x41 mesh. Python源代码: # -*- coding: utf-8 -*- #This is step 1
12步解N-S方程之第二步 # -*- coding: utf-8 -*- #This is step 2 of python cfd courses. #Text and code provided under a Creative Commons Attribution license, CC-BY #. (c) Lorena A. Barba, 2013. Thanks: Gilbert Forsyth for help writing the #notebooks. NSF for su
我第一次用VARIANT和CComVariant的时候完全不明白它是怎么回事,为它什么数据类型都可以存放,什么数据都可以被可以初始化?里面到底是怎么实现的?感觉又神奇又迷惑!我们在上一节中讲了union的用法之后你也许想到了大概是怎么回事了.没错,union可以帮我们实现这一个神奇的功能.而且VARIANT定义中确实使用了union.如果你还不明白,那我们就自己来模拟实现一个类似于CComVariant功能的类把,废话不多说,看代码: CVariate.h: #ifndef CVARIATE_H
Copyright (C) , All Rights Reserved.
版权所有 闽ICP备号
processed in 0.092 (s). 9 q(s)VT_ARRAY | VT_UI1 结构的数据类型,如何取出其中的数据?请高手进!!
[问题点数:100分,结帖人CSDN]
VT_ARRAY | VT_UI1 结构的数据类型,如何取出其中的数据?请高手进!!
[问题点数:100分,结帖人CSDN]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2006年10月 总版技术专家分月排行榜第一2006年9月 总版技术专家分月排行榜第一2006年8月 总版技术专家分月排行榜第一2006年7月 总版技术专家分月排行榜第一2006年6月 总版技术专家分月排行榜第一2006年5月 总版技术专家分月排行榜第一
2006年4月 总版技术专家分月排行榜第二
2006年10月 总版技术专家分月排行榜第一2006年9月 总版技术专家分月排行榜第一2006年8月 总版技术专家分月排行榜第一2006年7月 总版技术专家分月排行榜第一2006年6月 总版技术专家分月排行榜第一2006年5月 总版技术专家分月排行榜第一
2006年4月 总版技术专家分月排行榜第二
2006年10月 总版技术专家分月排行榜第一2006年9月 总版技术专家分月排行榜第一2006年8月 总版技术专家分月排行榜第一2006年7月 总版技术专家分月排行榜第一2006年6月 总版技术专家分月排行榜第一2006年5月 总版技术专家分月排行榜第一
2006年4月 总版技术专家分月排行榜第二
匿名用户不能发表回复!|ActiveX 如何与脚本(如JavaScript)等交互数组呀!
[问题点数:0分]
ActiveX 如何与脚本(如JavaScript)等交互数组呀!
[问题点数:0分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2001年 总版技术专家分年内排行榜第七
2002年1月 总版技术专家分月排行榜第一
2001年 总版技术专家分年内排行榜第七
2002年1月 总版技术专家分月排行榜第一
2001年 总版技术专家分年内排行榜第七
2002年1月 总版技术专家分月排行榜第一
匿名用户不能发表回复!|js怎样提取activex控件返回的variant类型数据
[问题点数:50分,结帖人hzq3554055]
js怎样提取activex控件返回的variant类型数据
[问题点数:50分,结帖人hzq3554055]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2009年8月 VC/MFC大版内专家分月排行榜第一
2010年7月 VC/MFC大版内专家分月排行榜第二
2009年7月 总版技术专家分月排行榜第二2009年3月 总版技术专家分月排行榜第二2009年1月 总版技术专家分月排行榜第二2005年7月 总版技术专家分月排行榜第二2005年5月 总版技术专家分月排行榜第二2005年3月 总版技术专家分月排行榜第二
优秀小版主2015年8月优秀小版主2015年9月优秀小版主2015年5月优秀小版主2015年2月论坛优秀版主
匿名用户不能发表回复!|当前位置: >>
VC高手的经验总结――vc实用小技巧
vc 实用小技巧一、 一次只运行一个程序实例下列两种方式都可以实现, 建议采用第二种方式: 1、 if( FindWindow(NULL,&程序标题&)) exit(0); 2、BOOL CDemoTBarEApp::InstanceIsRun(){ HANDLE m_hM m_hMutex = ::CreateMutex(NULL, TRUE, _T(&YourApplication&)); ASSERT(m_hMutex); if (GetLastError() == ERROR_ALREADY_EXISTS) { m_hMutex = NULL; return TRUE;//实例已经运行 } return FALSE;//实例未运行}二、 装载光标 SetCursor(AfxGetApp()-&LoadStandardCursor(IDC_WAIT));其中::SetCursor()是全局函数,用来设置整个例程的光标参数是宏定义光标句柄。AfxGetApp ()是一个系统函数,它 返回当前的一个 CWinApp 对象。其成员函数 LoadStandardCursor()用来读取一个系统指针,每一种系 统指针的具体宏定义如下: IDC_APPSTARTING 带小沙漏的标准箭头 IDC_ARROW 标准箭头 IDC_C ROSS 十字光标(用于定位)IDC_HAND Windows 2000:手型 IDC_HELP 带问号的箭头 IDC_I BEAM I 型标 IDC_ICON Obsolete for applications marked version 4.0 or later. IDC_N O 禁止符号 IDC_SIZE Obsolete for applications marked version 4.0 or later. Use IDC_SIZEALL. IDC_SIZEALL 十字箭头 IDC_SIZENESW 指向东北和西南的双向箭头 IDC_SIZENS 指 向南和北的双向箭头 IDC_SIZENWSE 指向西北和东南的双向箭头 IDC_SIZEWE 指向东西的双向箭 头 IDC_UPARROW 上箭头 IDC_WAIT 沙漏获得主框架: CM pMainframe = (CMainFrame *) AfxGetApp()-&m_pMainW.获取应用程序的实例句柄: xGetInstanceHandle();获得应用程序主窗口的指针: indow(SW_SHOWMAXMIZED); //使程序最大化 Example: HANDLE hInstance=AfExample: AfxGetMainWnd() -&ShowW四、重新建立字体的代码 if(m_fontLogo.m_hObject) m_fontLogo.Detach(); m_fontLogo.Crea teFont(nHeight, 0, 0, 0, nWeight, bItalic, bUnderline,0,0,0,0,0,0, Name);五、用指定颜色填充区域 dc.FillSolidRect(rect, ::GetSysColor(COLOR_3DFACE)); 六、绘制立体字体效果的字体,很值得一看 void CTestView::OnPaint() { CPaintDC dc(this); // device context for painting CR GetWindowRect(rect); CFont m_fontL m_fo ntLogo.CreateFont(24, 0, 0, 0, FW_BOLD, true, FALSE,0,0,0,0,0,0, &Arial&); CString m_ LogoT m_LogoText=_T(&Benlux Pro3D System&); dc.SetBkMode(TRANSPARENT); CFo nt * OldFont = dc.SelectObject(&m_fontLogo); // draw text in DC COLORREF OldColor = dc.SetTextColor( ::GetSysColor( COLOR_3DHILIGHT)); rect.right = rect.Width(); rect. bottom = rect.Height(); rect.left = rect.top = 0; dc.FillSolidRect(rect, ::GetSysColor(CO LOR_3DFACE)); dc.DrawText( m_LogoText, rect + CPoint(1,1), DT_SINGLELINE | DT_LE FT | DT_VCENTER); dc.SetTextColor( ::GetSysColor( COLOR_3DSHADOW)); dc.DrawTex t( m_LogoText, rect, DT_SINGLELINE | DT_LEFT | DT_VCENTER); // restore old text co lor dc.SetTextColor( OldColor); // restore old font dc.SelectObject(OldFont); // Do not call CView::OnPaint() for painting messages}七、简单的消息检索和抽取函数,能够让系统响应其它操作 BOOL PeekAndPump(){ static MSG while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) { if (!AfxGetApp()-&PumpMe ssage()) { ::PostQuitMessage(0); return FALSE; } } return TRUE;}八、在你的程序中用动画光标替换默认的等待光标 (ANI 光标的使用) HCURSOR m_hAniCursor=NU LL; BeginWaitCursor(); //begin wait cursor for api function //load ani cursor from filein current path TCHAR cursorPath[MAX_PATH]; GetModuleFileName(NULL,cursorPath,MA X_PATH); char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; char fname[_MAX_FNAME]; c har ext[_MAX_EXT]; _splitpath(cursorPath, drive, dir, fname, ext ); sprintf(cursorPath, &%s%s\wait.ani&,drive,dir); //ani cursor file name is wait.ani m_hAniCursor= LoadCurs orFromFile(cursorPath); HCURSOR oldC if(m_hAniCursor != NULL) oldCursor=Set Cursor(m_hAniCursor); for(long i=0;i&1000;i++) Sleep(5); oldCursor=NULL; m_hAniCursor=NULL; EndWaitCursor(); //end wait cursor for api function九、如何限制编辑框中的准许字符如果用户在编辑控件中只允许接收数字,可以使用一个标准的编辑控件并指定新的创建标志 ES_NUMBERS,它是 Windows 95 新增加的标志,该标志限制 编辑控件只按 收数字字符。如果用户需要复杂的编辑控件,可以使用 Microsoft 的屏蔽编辑控件,它是一个很有用的 O LE 定制控件。 如果希望不使用 OLE 定制控件自己处理字符,可以派生一个 CEdit 类并处理 WM_CH AR 消息,然后从编辑控件中过滤出特定的字符。首先,使用 ClassWizard 建立一个 CEdit 的派生类, 其次,在对话类中指定一个成员变量将编辑控件分类在 OnInitdialog 中调用 CWnd: : SubclassDlgIt em .//In your dialog class declaration (.H file )private : CMyEdit m_wndE // Instance of your new edit control .//In you dialog class implementation (.CPP file )BOOL C SampleDialog : : OnInitDialog ( ){ ssDlgItem (IDC_EDIT,this ); …} //Subclass the edit lontrod . m_wndEdit .Subcla使用 ClassWizard 处理 WM_CHAR 消息, 计算 nChar 参量并决定所执行的操作,用户可以确定是否修改、传送字符。下例说明了如何显示字母字符,如果字符是字 母字符,则调用 CW OnChar,否则不调用 OnChar.//Only display alphabetic dharacters .v oid CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UITN nFlags ){ nChar is an alphabetic character . //Determine if CEif (: : IsCharAlpha ( ( TCHAR) nChar ) )dit : : OnChar (nChar, nRepCnt , nFlags );}如果要修改字符, 则不能仅仅简单地用修改过的 nChar 调用 CEdit : : OnChar。要修改一个字符,需要首先修改 nChar,然后用修改过的 nChar 调用 C Wnd: : DefWindowProc。下例说明了如何将字符转变为大写://Make all characters uppercasev oid CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UINT nFlags ){ haracter is uppercase . Upper (nChar ) ; w proc. if (: : IsCharAlpha ( .( TCHAR) nChar) //Make sure c nChar=: : Char//Bypass default OnChar processing and directly call default windoDefWindProc (WM_CHAR, nChar , MAKELPARAM (nRepCnt , nFlags )) ;}十、 串太长时如何在其末尾显示一个省略号调用 CDC:: DrawText 并指定 DT_END_ELLIPSIS 标志,这样就可以用小略号取代串末尾的字符使其适合于指定的边界矩形。如果要显示路径信息,指定 DT_END _ELLIPSIS 标志并省略号取代串中间的字符。void CSampleView:: OnDraw (CDC* pDC){ estDoc* pDoc=GetDocument (); c); ring if it does not fit ASSERT_VALID (pDo //Add ellpsis to end of st pDC-&Drawtext (CString (&This is a long string&), CRect CT(10, 10, 80, 30), DT_LEFT | DT_END_ELLIPSIS); t does not fit//Add ellpsis to middle of string if i CRect (10, 4pDC-&DrawText (AfxgetApp () -&m_pszhelpfilePath,0, 200, 60), DT_LEFT | DT_PATH_ELLIPSIS);}十一、如何实现一个橡皮区矩形(具有踪迹矩形并可移动、缩放的矩形)CRectTracker 是一个很有用的类, 可以通过调用 CRectTracker:: TrackRubberBand 响应 WM_LBUTTONDOWN 消息来创建一个 橡皮区矩形。下例表明使用 CRectTracker 移动和重置视窗中的蓝色椭圆的大小是很容易的事情。首先, 在文档类中声明一个 CRectTracker 数据成员: class CTestDoc: Public CDocument{…public: CRectTracker m_…}; 其次,在文档类的构造函数中初始化 CRectTracker 对象:CTestDoc::CTestDoc(){ m_tracker.m_rect.SetRect (10, 10, 300, 300); m_tracker.m_nStyle=C RectTracker:: resizeInside | CRectTracker:: dottedL } 然后,在视图类的 OnDraw 函数中画椭圆和踪迹矩形:void CTestView::OnDraw(CDC* pDC){ CTestDoc* pDoc = GetDocu ment(); ASSERT_VALID(pDoc);//Select blue brush into device context. (RGB (0, 0, 255)); CBrush* pOldBrush=pDC-&SelectObject (&brush); CRect rcE CBrush brush //draw ellipse in tracking rectangle. e);pDoc-&m_tracker.GetTrueRect (rcEllips pDoc-&m_tracker.DrawpDC-&Ellipse (rcEllipse);//Draw tracking rectangle.(pDC); h);}//Select blue brush out of device context.pDC-&SelectObject(pOldBrus最后,视图类中处理 WM_LBUTTONDOWN 消息,并增加下述代码。该段代码根据鼠标击键情况可以拖放、移动或者重置椭圆的大小。void CTestView::OnLButtonDown(UINT nFlags, CPoint point) { //Get pointer to document. CTestDoc* pDoc=GetDocument(); ASSERT_V //rubberALID (pDoc);//If clicked on ellipse, drag or resize it. Otherwise create a-band rectangle nd create a new ellipse. int)!= s. CRectTracker::hitN {BOOL bResult=pDoc-&m_tracker.HitTest (po //Tracker rectangle changed so update view pDoc-&SetMoif (bResult)pDoc-&m_tracker.Track (this,point,TRUE); } elsedifiedFlag ();pDoc-&UpdateAllViews (NULL);pDoc-&m_tracker.TrackRubberBand (this,point,TRUE); CView::OnLButtonDown(nFlags, point);}十二、如何在临时目录创建一个临时文件如果你要在临时目录下创建临时文件,下面的代码能帮到你的忙。 bool GetuniqueTempName (CString& strTempName){ strTempName=&&; mporary files directory. TCHAR szTempPath [MAX_PATH]; if (dwResult==0) //Get the teDWORD dwResult=:: G //Create atTempPath (MAX_PATH, szTempPath); unique temporary file.TCHAR szTempFile[MAX_PATH];UINT nResult=GetTempF stName (szTempPath, _T (&~ex&),0,szTempFile); rTempName=szTempF}if (dwResult==0) 十三、如何限制窗口的最小范围要限制窗体的大小,下面的代码能帮到你的忙。在 CMainFrame 中增加 WM_GETMAXMININFO 消息的处理函数,然后在这个函数中写代码如下://限制主窗体的最小高度和宽 度 void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) { lpMMI-&ptMinTrack Size.x=600; lpMMI-&ptMinTrackSize.y=400; CNewFrameWnd::OnGetMinMaxInfo(lpMM I);}十四、怎样删除文件到回收站中 要删除文件到回收站,很简单。只要用 SHFileOperation 函数就行了, 下面的代码我将为你演示了这一个函数的用法。当然你可以直接拷贝到你的项目中。//删除文件到回收站 中//pszPath : 待删除的全路径文件名//bDelete : TRUE 删除,不移到回收站,FALSE:移到回收站 一、 //返回 : TRUE 删除成功 FALSE 删除失败 BOOL CDelFileToRecycleDlg::Recycle(LPCTSTR pszPath, BOOL bDelete/*=FALSE*/){ SHFILEOPSTRUCT shDelF memset(&shDe lFile,0,sizeof(SHFILEOPSTRUCT)); shDelFile.fFlags |= FOF_SILENT; ogress shDelFile.fFlags |= FOF_NOERRORUI; FOF_NOCONFIRMATION; // don't report pr// don't report errors shDelFile.fFlags |=// don't confirm delete // Copy pathname to double-NULL-terminated string. // TCHAR buf[_MAX_PATH + 1]; // allow one more character _tcscpy (buf, pszPath); // copy caller's pathname buf[_tcslen(buf)+1]=0; // need two NULLsat end // Set SHFILEOPSTRUCT params for delete operation shDelFile.wFunc = FO_DE LETE; // REQUIRED: delete operation shDelFile.pFrom = // REQUIRED: w // if delehich file(s) shDelFile.pTo = NULL;// MUST be NULL if (bDelete) {te requested.. shDelFile.fFlags &= ~FOF_ALLOWUNDO; else { le Bin }// ..don't use Recycle Bin } // ..send to Recyc// otherwise.. shDelFile.fFlags |= FOF_ALLOWUNDO; return SHFileOperation(&shDelFile); // do it!}十五、内存泄漏检查也许你已经知道,在 C++和 C 语言中指针问题也就是内存申请与释放是一个令人头疼的事情,假如你申请了内存,但没有释放,并且你的程序需要长时间地运行,那么,系统的资源将逐 渐减少,当系统的资源全部被用完时,系统将会崩溃。所以在开发程序的过程中一定要保证资源的完全释 放。下面我们来介绍内存漏洞的检查。示例如下:// do your memory allocations and deallocatio ns... CString s = &This is a frame variable&;#ifdef _DEBUG CMemoryState oldMemStat e, newMemState, diffMemS oldMemState.Checkpoint();#endif // the next object is a heap object CString* p = new CString( &Smith Alan 581_0215& ); p=NUL L;#ifdef _DEBUG newMemState.Checkpoint(); BOOL b=diffMemState.Difference(oldMem State, newMemState); if (b) { AfxMessageBox( &Memory leaked!\n& ); }#endif根据试验,由于我们无法释放掉象 int CString char 申请的变量。只能释放指针型的变量。而检测内存 时,照样会出现内存泄漏现象。所以,这种内存检测方式局限性还是很大。因为我们无法释放非指针型变 量。CString,string,char*的综合比较(一) 概述 string 和 CString 均是字符串模板类,string 为标准模板类(STL)定义的字符串类,已经纳 入 C++标准之中;CString(typedef CStringT&TCHAR, StrTraitMFC&TCHAR&& CString)为 Vi sual C++中最常用的字符串类,继承自 CSimpleStringT 类,主要应用在 MFC 和 ATL 编程中,主要数 据类型有 char(应用于 ANSI),wchar_t(unicode),TCHAR(ANSI 与 unicode 均可);char*为 C 编程 中最常用的字符串指针,一般以'{post.abstract}'为结束标志;(二) 构造 string 是方便的,可以从几乎所有的字符串构造而来,包括 CString 和 char*; CString 次 之,可以从基本的一些字符串变量构造而来,包括 char*等; char*没有构造函数,仅可以赋值; 举例: char* psz = &joise&;CString cstr( psz );string str( cstr );(三) 运算符重载 a) operator= string 是最方便的,几乎可以直接用所有的字符串赋值,包括 CString 和 char*; CString 次之,可以直接用些基本的字符串赋值,包括 char*等; char*只能由指针赋值, 并且是极危险的操作,建议使用 strcpy 或者 memcpy,而且 char*在声明的时候如未赋初值建议先设为 NULL,以避免野指针,令你抓狂; 举例:char *psz = NULL;psz = new char[10]; //当然,以上 的直接写成 char *psz = new char[10];也是一样 memset( psz, 0, 10 );strcpy( psz, &joise& ); CScstr =str =str =delete []b) operator+strin g 与 CString 差不多,可以直接与 char*进行加法,但不可以相互使用+运算符,即 string str = str + cstr 是非法的,须转换成 char*;char*没有+运算,只能使用 strcat 把两个指针连在一起; 举例:c har* psz = &joise&;CString cstr =cstr = cstr +string str =str = str + str +strcat( psz, psz );strcat( psz, cstr );//合法 strcat( psz, str );//非法,由此可见,CSt ring 可自动转换为 const char*, 而 string 不行 c) operator += string 是最强大的, 几乎可以与所有 的字符串变量+=,包括 CString 和 char*; CString 次之,可以与基本的一些字符串变量进行+=而来, 包括 char*等;char*没有+=运算符,只能使用 strcat 把两个指针连在一起;d) operator[] CString 最好,当越界时会抛出断言异常; string 与 char*下标越界结果未定义;举例:char* psz = &joise&; CString cstr =cout && cstr[8];string str =cout && str[8];cout && psz[8];e) o perator== 、operator!=、operator& 、operator& 、operator&= 、perator&= CString 与 str ing 之间不可以进行比较,但均可以与 char*进行比较,并且比较的是值,而不是地址;cout && ( psz == cstr );cout && ( psz == str );cout && ( str == psz );cout && ( cstr == psz );// 以上代码返回均为 1(四) 常用算法 a) 查找作用 char* string CString 查找指定值 strchrstrstrstrrstrstrspn find Find 第一个匹配的值 find_if fild_first_of FindOneOf 从后面开始查找 ReserveFind 指定匹配方式注:find_if 中是把范围内的值挨个代入匹配函数直至返回 trueb) 比较作用 char* stringCString 查找指定值(区分大小写) strcmpstrncmpstrcoll_strncoll operator&operator&operator &= operator&=operator==operator!= CollateCompare 查找指定值(不区分大小写) _stricmp_ strnicmp_stricoll_strnicoll CollateNoCaseCompareNoCas 注:返回值如果&0 则前面的值小于后面的值, 反之亦然 c) 替换作用 char* string CString 查找指定值 _strset_strnset replacereplac e_copyreplace_copy_ifreplace_if Replace d) 插入作用 char* string CString 查找指定值 insert Insert e) 增加作用 char* string CString 动态增加值 strcat pushappend AppendAppe ndCharAppendFormat f) 截取作用 char* string CString 得到部分值 用下标操作 substr LeftMi dRightTruncate g) 移除作用 char* string CString 移除部份值 remove Remove 移除空白值RemoveBlanks 注:此为 ATL 提供,非 C 函数 remove_if TrimTrimLeftTrimRig h) 转换大小写作 用 char* string CString 转换大小写 _strlwr_strupr 换作用 char* string CString 转化为数字 atoiatodatof MakeLowerMakeUpper i) 与其他类型转 Format 转化为 char* c_str GetBufferGetBufferSetLen j) 格式化作用 char* string CString 格式化 sprintf 度作用 char* string CString 得到长度 strlen length GetLength 得到大小Format k) 得到长 size GetAllocLength l) 判断为空作用 char* string CString 判断是否为空 判断是否==NULL 或者第一个字符是否是' {post.abstract}' empty IsEmpty m) 重定义大小作用 char* string CString 重定义大小 realloc new resize GetBufferSetLength n) 释放资源作用 char* string CString 释放 freedelete (dele te[]) ReleaseBufferReleaseBufferSetLength(五) 安全性&CString & string & char*;(六) 灵活性 CString & string &char*; (七) 可移植性 char* = string & CString(八) MFC 中常用字符串结构图(此非比较,但为了方便查阅就一并算在这儿了)九) 总结综上所述,我个人认为,在 MFC、ATL 中使用字符串尽量使用 CString,毕竟都是微软的孩子, 各方面都比其它更有优势,而在非微软平台上或对移植性要求较高的场合推荐使用 string,标准模板库提 供了那么强大的泛型算法,没必要再自己去造车轮。vc 常用技巧总结如何通过代码获得应用程序主窗口的 指针?主窗口的 指针保存在 CWinThread::m_pMainWnd 中,调用 AfxGetMainWnd 实现。 AfxGetMainWnd() -&ShowWindow(SW_SHOWMAXMIZED)//使程序最大 化.(2) 确定应用程序的路径 Use GetModuleFileName 获得应用程序的路径,然后去掉可执行文件名。 Example:TCHARexeFullPath[MAX_PATH] // MAX_PATH 在 API 中定义了吧,好象是 128GetMod uleFileName(NULL,exeFullPath,MAX_PATH)(3) 如何在程序中获得其他程序的 图标?两种方法:(1) SDK 函数 SHGetFileInfo 或使用 ExtractI con 获得图标资源的 handle,(2) SDK 函数 SHGetFileInfo 获得有关文件的很多信息,如大小图标,属 性, 类型等.Example(1):在程序窗口左上角显示 NotePad 图标.void CSampleView:OnDraw(CDC * pDC){if( :: SHGetFileInfo(_T(&c:\pwin95\notepad.exe&),0,&stFileInfo,sizeof(stFileInfo),S HGFI_ICON)){pDC -&DrawIcon(10,10,stFileInfo.hIcon)}}Example(2):同样功能,Use Extract Icon Functionvoid CSampleView:: OnDraw(CDC *pDC){HICON hIcon=:: ExtractIcon(Afx GetInstanceHandle(),_T(&NotePad.exe&),0)if (hIcon &&hIcon!=(HICON)-1)pDC-&DrawIcon (10,10,hIcon)}说明: 获得 notepad.exe 的路径正规上来说用 GetWindowsDirectory 函数得到, 如果 是调用 win95 下的画笔,应该用访问注册表的方法获得其路径,要作成一个比较考究的程序,考虑应该 全面点.(4) 获得各种目录信息 Windows 目录: Use &GetWindowsDirectory&Windows 下的 system 目录: Use &GetSystemDirectory&temp 目录: Use &GetTempPath&当前目录: Use &GetCurrentDirect ory&请注意前两个函数的第一个参数为目录变量名,后一个为缓冲区后两个相反. (5)如何自定义消息 1) 手工定义消息, 可以这么写#define WM_MY_MESSAGE(WM_USER+100), MS 推荐的至少是 WM_USER+100(2)写消息处理函数,用 WPARAM,LPARAM 返回 LRESULT.LRESU LT CMainFrame::OnMyMessage(WPARAM wparam,LPARAM lParam){temp 目录: Use &GetT empPath&//加入你的处理函数 irectory&}(6) 如何改变窗口的图标?向窗口发送 WM_SECTION 消息。Example:HICON hIcon=AfxGetApp () -&LoadIcon(IDI_ICON)ASSERT(hIcon)AfxGetMainWnd() -&SendMessage(WM_SECTIO N,TRUE,(LPARAM)hIcon)(7) 如何改变窗口的缺省风格?重载 CWnd:: PreCreateWindow 并修改 CREATESTRUCT 结构来指 定窗口风格和其他创建信息.Example: Delete &Max& Button and Set OriginalWindow's Positio n and SizeBOOL CMainFrame:: PreCreateWindow(CREATESTRUCT &cs){cs.style &=~WS _MAXINIZEMOXcs.x=cs.y=0cs.cx=GetSystemMetrics(SM_CXSCREEN/2)cs.cy=GetSystemM etrics(SM_CYSCREEN/2)return CMDIFramewnd ::PreCreateWindow(cs)}(8) 如何将窗口居中显示?Call Function CWnd::Center WindowsExample(1):Center Window ( ) //Relative to it's parent// Relativeto ScreenExample(2):Center Window(CWnd:: GetD esktopWindow( ))//Relative toApplication's MainWindowAfxGetMainWnd( ) -&Center Win dow( )(9) 如何让窗口和 MDI 窗口一启动就最大化和最小化?先说窗口。在 InitStance 函数中设定 m_nC mdShow 的取值.m_nCmdShow=SW_SHOWMAXMIZED //最大化 m_nCmdShow=SW_SHOWM INMIZED //最小化 m_nCmdShow=SW_SHOWNORMAL //正常方式 MDI 窗口:如果是创建新的应用 程序,可以用 MFC AppWizard 的 Advanced 按钮并在 MDI 子窗口风格组中检测最大化或最小化还可以 重载 MDI Window 的 PreCreateWindow 函数, 设置 WS_MAXMIZE or WS_MINMIZE 如果从 CM DIChildWnd 派生,调用 OnInitialUpdate 函数中的 CWnd::Show Window 来指定 MDI Child Win dow 的风格。(10) 如何限制窗口的大小?也就是 FixedDialog 形式。 Windows 发送 WM_GETMAXMININFO 消 息来跟踪, 响应它,在 OnGetMAXMININFO 中写代码: (11) 如何使窗口不可见?很简单,用 SW_HIDE 隐藏窗口, 可以结合 FindWindow,ShowWindow 控 制.(12) 如何创建一个字回绕的 CEditView 重载 CWnd : : PreCreateWindow 和修改 CREATESTRU CT 结构,关闭 CEditView 对象的 ES_AUTOHSCROLL 和 WS_HSCROLL 风格位, 由于 CEditView : : PreCreateWindow 显示设置 cs. style,调用基类函数后要修改 cs . style。BOOL CSampleEDit View : : PreCreateWindow (CREATESTRUCT&cs){//First call basse class function .BOOL bResutl =CEditView : : PreCreateWindow (cs)// Now specify the new window style .cs.s tyle &= ~ (ES_AUTOHSCROLL |WS_HSCROLL)return bResult}(13) 如何使程序保持极小状态?这么办: 在恢复程序窗体大小时,Windows 会发送 WM_QUERY-OP EN 消息,用 ClassWizard 设置成员函数 OnQueryOpen() ,add following code:Bool CMainFram e:: OnQueryOpen( ){Return false}(14) 移动窗口调用 CWnd : : SetWindowPos 并指定 SWP_NOSIZE 标志。目的位置与父窗口有关 (顶层窗口与屏幕有关)。调用 CWnd : : MoveWindow 时必须要指定窗口的大小。//Move window to positoin 100 , 100 of its parent window .SetWindowPos (NULL, 100 , 100 , 0 , 0 , SWP_NOSIZE |SWP_NOAORDER)(15) 通用控件的显示窗口 MFC 提供了几个 CView 派生的视窗类, 封装了通用控件的功能,但仍然使 用工作框文档显示窗口体系结构:CEditView 封装了编辑控件,CTreeView 保持了树列表控件,CListVi ew 封装了列表显示窗口控件,CRichEditView 可以处理多种编辑控件。(16) 重置窗口的大小调用 CWnd: : SetWindowPos 并指定 SWP_NOMOVE 标志, 也可调用 CWn d : : MoveWindow 但必须指定窗口的位置。 // Get the size of the window .Crect reWindowG etWindowRect (reWindow )//Make the window twice as wide and twice as tall .SetWind owPos (NULL , 0 , 0 , reWindow . Width ( ) *2,reWindow . Height () * 2,SWP_NOMOV E |SWP_NOZORDER )(17) 如何单击除了窗口标题栏以外的区域使窗口移动当窗口需要确定鼠标位置时 Windows 向窗口发 送 WM_NCHITTEST 信息,可以处理该信息使 Windows 认为鼠标在窗口标题上。对于对话框和基于对 话的应用程序,可以使用 ClassWizard 处理该信息并调用基类函数, 如果函数返回 HTCLIENT 则表明 鼠标在客房区域,返回 HTCAPTION 表明鼠标在 Windows 的标题栏中。UINT CSampleDialog : : O nNcHitTest (Cpoint point ){UINT nHitTest =Cdialog: : OnNcHitTest (point )return (nHitT est = =HTCLIENT)? HTCAPTION : nHitTest}上述技术有两点不利之处,其一是在窗口的客户区域 双击时,窗口将极大;其二, 它不适合包含几个视窗的主框窗口。还有一种方法,当用户按下鼠标左键使 主框窗口认为鼠标在其窗口标题上,使用 ClassWizard 在视窗中处理 WM_LBUTTODOWN 信息并向主 框窗口发送一个 WM_NCLBUTTONDOWN 信息和一个单击测试 HTCAPTION。 void CSampleView : : OnLButtonDown (UINT nFlags , Cpoint point){CView : : OnLButtonDow (nFlags , pont )//Fool frame window into thinking somene clickedonits caption bar .GetParentFrame ( ) -& PostMessage (WM_NCLBUTTONDOWN ,HTCAPTION , MAKELPARAM (poitn .x , poi nt .y) )}该技术也适用于对话框和基于对的应用程序,只是不必调用 CWnd: :GetParentFrame 。voi d CSampleDialog : : OnLbuttonDown (UINT nFlags, Cpoint point ){Cdialog : : OnLButto nDow (nFlags, goint )//Fool dialog into thinking simeone clicked on itscaption bar .Post Message (WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARM (point.x, point. y) )}(18) 如何改变视窗的背景颜色 Windows 向窗口发送一个 WM_ERASEBKGND 消息通知该窗口擦除 背景,可以使用 ClassWizard 重载该消息的缺省处理程序来擦除背景(实际是画),并返回 TRUE 以防 止 Windows 擦除窗口。//Paint area that needs to be erased.BOOL CSampleView : : OnEra seBkgnd (CDC* pDC){// Create a pruple brush.CBrush Brush (RGB (128 , 0 , 128) )// Select the brush into the device context .CBrush* pOldBrush = pDC-&SelcetObject (&br ush)// Get the area that needs to be erased .CRect reClippDC-&GetCilpBox (&rcClip)//P aint the area.pDC-& PatBlt (rcClip.left , rcClip.top , rcClip.Width ( ) , rcClip.Height( ) , PATCOPY )//Unselect brush out of device context .pDC-&SelectObject (pOldBrush )// Re turn nonzero to half fruther processing .return TRUE}(19) 如何改变窗口标题调用 CWnd : : SetWindowText 可以改变任何窗口(包括控件)的标题。// Set title for application's main frame window .AfxGetMainWnd ( ) -& SetWindowText (_ T(&Application title&) )//Set title for View's MDI child frame window .GetParentFrame ( ) -& SetWindowText (&_T (&MDI Child Frame new title&))//Set title for dialog's push butt on control.GetDigitem (IDC_BUTTON) -& SetWindowText (_T (&Button new title &) )如果 需要经常修改窗口的标题(注:控件也是窗口),应该考虑使用半文档化的函数 AfxSetWindowText。 该函数在 AFXPRIV.H 中说明,在 WINUTIL.CPP 中实现,在联机帮助中找不到它,它在 AFXPRIV.H 中 半文档化, 在以后发行的 MFC 中将文档化。AfxSetWindowText 的实现如下:voik AFXAPI AfxSet WindowText (HWND hWndCtrl , LPCTSTR IpszNew ){itn nNewLen= Istrlen (Ipaznew)TC HAR szOld [256]//fast check to see if text really changes (reducesflash in thecontrols )i f (nNewLen &_contof (szOld)|| : : GetWindowText (hWndCrtl, szOld , _countof (szOl d) !=nNewLen|| Istrcmp (szOld , IpszNew)! = 0{//change it: : SetWindowText(hWnd Ctrl , IpszNew )}}(20) 如何防止主框窗口在其说明中显示活动的文档名创建主框窗口和 MDI 子窗口进通常具有 FWS_A DDTOTITLE 风格位,如果不希望在说明中自动添加文档名, 必须禁止该风格位, 可以使用 ClassWiza rd 重置 CWnd: : PreCreateWindow 并关闭 FWS_ADDTOTITLE 风格。 BOOL CMainFrame : : Pr eCreateWindow (CREATESTRUCT&cs){//Turn off FWS_ADDTOTITLE in main frame .cs.st yel & = ~FWS_ADDTOTITLE return CMDIFrameWnd : : PreCreateWindow (cs )}关闭 MDI 子窗口的 FWS _ADDTOTITLE 风格将创建一个具有空标题的窗口,可以调用 CWnd: : SetWindo wText 来设置标题。记住自己设置标题时要遵循接口风格指南(21) 如何获取有关窗口正在处理的当前消息的信息调用 CWnd: : GetCurrentMessage 可以获取一 个 MSG 指针。例如,可以使用 ClassWizard 将几个菜单项处理程序映射到一个函数中,然后调用 GetC urrentMessage 来确定所选中的菜单项。 viod CMainFrame : : OnCommmonMenuHandler ( ){/ /Display selected menu item in debug window .TRACE (&Menu item %u was selected . \n& ,(22) 如何在代码中获取工具条和状态条的指针缺省时, 工作框创建状态条和工具条时将它们作为主框 窗口的子窗口,状态条有一个 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 to olbar .CToolBar * pToolBar = (CToolBar * ) AfxGetMainWnd ( )-& GetDescendantWindo w(AFX_IDW_TOOLBAR) (23) 如何使能和禁止工具条的工具提示如果设置了 CBRS_TOOLTIPS 风格位,工具条将显示工具提 示,要使能或者禁止工具提示,需要设置或者清除该风格位。下例通过调用 CControlBar : : GetBarSt yle 和 CControlBar : : SetBarStyle 建立一个完成此功能的成员函数:void CMainFrame : : Enab leToolTips ( BOOL bDisplayTips ){ASSERT_VALID (m_wndToolBar)DWORD dwStyle = m _wndToolBar.GetBarStyle ( )if (bDisplayTips) dwStyle |=CBRS_TOOLTIPSelsedwStyle & = ~CBRS_TOOLTIPSm_wndToolBar.SetBarStyle (dwStyle )}(24) 如何创建一个不规则形状 的窗口可以使用新的 SDK 函数 SetWindowRgn。 该函数将绘画和鼠标消息限定在窗口的一个指定的区域, 实际上使窗口成为指定的不规则形状。 使用 AppWizard 创建一个基于对的应用程序并使用资源编辑器从 主对话资源中删除所在的缺省控件、标题以及边界。给对话类增加一个 CRgn 数据成员,以后要使用该数 据成员建立窗口区域。Class CRoundDlg : public CDialog{…private :Crgn m_rgn : // window region…}修改 OnInitDialog 函数建立一个椭圆区域并调用 SetWindowRgn 将该区域分配给窗口:B OOL CRoundDlg : : OnInitDialog ( ){CDialog : : OnInitDialog ( )//Get size of dialog .C Rect rcDialogGetClientRect (rcDialog )// Create region and assign to window .m_rgn . C reateEllipticRgn (0 , 0 , rcDialog.Width( ) , rcDialog.Height ( ) )SetWindowRgn (GetSafe Hwnd ( ) , (HRGN) m_ rgn ,TRUE )return TRUE}通过建立区域和调用 SetWindowRgn, 已经建 立一个不规则形状的窗口,下面的例子程序是修改 OnPaint 函数使窗口形状看起来象一个球形体。voik CRoundDlg : : OnPaint ( ){CPaintDC de (this) // device context for painting.//draw ellip se with out any borderdc. SelecStockObject (NULL_PEN)//get the RGB colour componen ts of the sphere colorCOLORREF color= RGB( 0 , 0 , 255)BYTE byRed =GetRValue (col or)BYTE byGreen = GetGValue (color)BYTE byBlue = GetBValue (color)// get the size of the view windowCrect rectGetClientRect (rect)// get minimun number of unitsint nUnits =min (rect.right , rect.bottom )//calculate he horiaontal and vertical step sizefloat fltSt epHorz = (float) rect.right /nUnitsfloat fltStepVert = (float) rect.bottom /nUnitsint nEllip se = nUnits/3 // calculate how many todrawint nIndex// current ellipse that is being dr awCBrush brush// bursh used for ellipse fill colorCBrush *pBrushOld // previousbrush th at was selected into dc//draw ellipse , gradually moving towards upper-rightcornerfor (nIndex = 0 nIndes & + nEllipse nIndes++){//creat solid brushbrush . CreatSolidBrush (RGB ( ( (nIndex*byRed ) /nEllipse ).( ( nIndex * byGreen ) /nEllipse ), ( (nIndex * byBlue)/nEllipse ) ) )//select brush into dcpBrushOld= dc .SelectObject (&brhsh)//draw ellipsedc .Ellipse ( (int) fltStepHorz * 2, (int) fltStepVert * nIndex ,rect. right -( (int) fl tStepHorz * nIndex )+ 1,rect . bottom -( (int) fltStepVert * (nIndex *2) ) +1)//delete the brushbrush.DelecteObject ( )}}最后,处理 WM_NCHITTEST 消息,使当击打窗口的任何位置 时能移动窗口。UINT CRoundDlg : : OnNchitTest (Cpoint point ){//Let user move window by clickign anywhere on thewindow .UINT nHitTest = CDialog : : OnNcHitTest (point)re rurn (nHitTest = = HTCLIENT)? HTCAPTION: nHitTest}(25) 如何获取应用程序的 实例句柄?应用程序的实例句柄保存在 CWinApp m_hInstance 中,可以这 么调用 AfxGetInstancdHandle 获得句柄.Example: HANDLE hInstance=AfxGetInstanceHandle ()(26) 如何编程结束应用程序?这是个很简单又是编程中经常要遇到的问题.向窗口发送 WM_CLOSE 消 息,调用 CWnd::OnClose 成员函数.允许对用户提示是否保存修改过的数据.Example: AfxGetMainWi ndow()-&SendMessage(WM_CLOSE)还可以创建一个自定义的函数 Terminate Windowvoid Ter minate Window(LPCSTR pCaption){CWnd *pWnd=Cwnd::FindWindow(NULL,pCaption)if (pWnd)pWnd -&SendMessage(WM_CLOSE)}说明: FindWindow 函数不是提倡的做法,因为它无 法处理标题栏自动改变,比如我们要检测 Notepad 是不是已运行而事先不知道 Notepad 的标题栏,这时 FindWindow 就无能为力了,可以通过枚举 windows 任务列表的办法来实现。在机械出版社&Windows 95 API 开发人员指南&一书有比较详细的介绍,这里就不再多说乐。(27) 如何创建和使用无模式对话框 MFC 将模式和无模式对话封装在同一个类中,但是使用无模式对话 需要几个对话需要几个额处的步骤。首先,使用资源编辑器建立对话资源并使用 ClassWizard 创建一个 C Dialog 的派生类。模式和无模式对话的中止是不一样的:模式对话通过调用 CDialog : : EndDialog 来中止,无模式对话则是调用 CWnd: : DestroyWindow 来中止的,函数 CDialog : : OnOK 和 CDi alog : : OnCancel 调用 EndDialog ,所以需要调用 DestroyWindow 并重置无模式对话的函数。 void CSampleDialog : : OnOK ( ){// Retrieve and validate dialog data .if (! UpdateData (TR UE) ){// the UpdateData rountinewill set focus to correct item TRACEO (& UpdateData f ailed 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 t he C++ object that represents this dialog.delete this 最后,要创建无模式对话。可以调用 CDi alog : : DoModal 创建一个模式对放,要创建一个无模式对话则要调用 CDialog: : Create。下面的例 子说明 了应用程序是如何创建无模式对话的: 象;无模式对话不是同步的,创建函数调用后立即返回,v oid CMainFrame : : OnSampleDialog ( ){//Allocate a modeless dialog object .CSampleDi log * pDialog =new CSampleDialogASSERT_VALID (pDialog) Destroy ( )//Create the mo deless dialog . represents this dialog.BOOL bResult = pDialog -& Creste (IDD_IDALOG) ASSERT (bResult )}(28) 如何防止主框窗口在其说明中显示活动的文档名创建主框窗口和 MDI 子窗口进通常具有 FWS_A DDTOTITLE 风格位,如果不希望在说明中自动添加文档名, 必须禁止该风格位, 可以使用 ClassWiza rd 重置 CWnd: : PreCreateWindow 并关闭 FWS_ADDTOTITLE 风格。 BOOL CMainFrame : : Pr eCreateWindow (CREATESTRUCT&cs){//Turn off FWS_ADDTOTITLE in main frame .cs.st yel & = ~FWS_ADDTOTITLE return CMDIFrameWnd : : PreCreateWindow (cs )}关闭 MDI 子窗口的 FWS _ADDTOTITLE 风格将创建一个具有空标题的窗口,可以调用 CWnd: : SetWindo wText 来设置标题。记住自己设置标题时要遵循接口风格指南。(29) 如何在代码中获取工具条和状态条的指针缺省时, 工作框创建状态条和工具条时将它们作为主框 窗口的子窗口,状态条有一个 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 to olbar .CToolBar * pToolBar = (CToolBar * ) AfxGetMainWnd ( )-& GetDescendantWindo w(AFX_IDW_TOOLBAR)(30) 怎样加载其他的应用程序?三个 SDK 函数 winexec, shellexecute,createprocess 可以使用。 WinExec 最简单,两个参数,前一个指定路径,后一个指定显示方式.后一个参数值得说一下,比如泥用 SW_SHOWMAXMIZED 方式去加载一个无最大化按钮的程序,就是 Neterm,calc 等等,就不会出现正 常的窗体,但是已经被加到任务列表里了。ShellExecute 较 WinExex 灵活一点,可以指定工作目录,下 面的 Example 就是直接打开 c:\temp.txt,而不用加载与 txt 文件关联的应用程序,很多安装程序完成后 都会打开一个窗口,来显示 Readme or Faq,我猜就是这么作的啦.ShellExecute(NULL,NULL,_T(&1.t xt&),NULL,_T(&c:\temp&),SW_SHOWMAXMIZED)CreateProcess 最复杂, 一共有十个参数, 不过大 部分都可以用 NULL 代替,它可以指定进程的安全属性,继承信息,类的优先级等等.来看个很简单的 Ex ample:STARTUPINFO stinfo//启动窗口的信息 PROCESSINFO procinfo //进程的信息 CreateProc ess(NULL,_T(&notepad.exe&),NULL,NULL.FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL, &s tinfo,&procinfo)(31) 如何在代码中获取工具条和状态条的指针缺省时, 工作框创建状态条和工具条时将它们作为主框 窗口的子窗口,状态条有一个 AFX_IDW_STATUS_BAR 标识符,工具条有一个 AFX_IDW_TOOLBAR 标识符, 下例说明了如何通过一起调用 CWnd: : GetDescendantWindow 和 AfxGetMainWnd 来获取 这些子窗口的指针: //Get pointer to status bar .CStatusBar * pStatusBar = (CStatusBar *) AfxGetMainWnd ( )-& GetDescendantWindow(AFX_IDW_STUTUS_BAR)(32) 如何使能和禁止工具条的工具提示如果设置了 CBRS_TOOLTIPS 风格位,工具条将显示工具提 示,要使能或者禁止工具提示,需要设置或者清除该风格位。下例通过调用 CControlBar : : GetBarSt yle 和 CControlBar : : SetBarStyle 建立一个完成此功能的成员函数:void CMainFrame : : Enab leToolTips ( BOOL bDisplayTips ){ASSERT_VALID (m_wndToolBar)DWORD dwStyle = m _wndToolBar.GetBarStyle ( )if (bDisplayTips) dwStyle |=CBRS_TOOLTIPSelsedwStyle & = ~CBRS_TOOLTIPSm_wndToolBar.SetBarStyle (dwStyle )}//Get pointer to toolbar .CTo olBar * pToolBar = (CToolBar * ) AfxGetMainWnd ( )-& GetDescendantWindow(AFX_ID W_TOOLBAR)(33) 如何设置工具条标题工具条是一个窗口,所以可以在调用 CWnd : : SetWindowText 来设置标 题,例子如下:int CMainFrame : : OnCreate (LPCREATESTRUCT lpCreateStruct ){…// Set the caption of the toolbar .m_wndToolBar.SetWindowText (_T &Standdard&)(34) 如何使窗口始终在最前方?BringWindowToTop(Handle)SetWindowPos 函数,指定窗口的 最顶风格,用 WS_EX_TOPMOST 扩展窗口的风格 Example:void ToggleTopMost(CWnd *pWnd){A SSERT_VALID(pWnd)pWnd -&SetWindowPos(pWnd-& GetStyle( ) &WS_EX_TOPMOST)?& wndNoTopMOST: &wndTopMost,0,0,0,0,SSP_NOSIZE|WSP_NOMOVE}} (35) 如何在对话框中显示一个位图这要归功于 Win 32 先进的静态控件和 Microsoft 的资源编辑器, 在对话框中显示位图是很容易的, 只需将图形控件拖到对话中并选择适当属性即可, 用户也可以显示图标、 位图以及增强型元文件。(36) 如何改变对话或窗体视窗的背景颜色调用 CWinApp : : SetDialogBkColor 可以改变所有应用 程序的背景颜色。第一个参数指定了背景颜色,第二个参数指定了文本颜色。下例将应用程序对话设置为 蓝色背景和黄色文本。BOOL CSampleApp : : InitInstance ( ){…//use blue dialog with yello w text .SetDialogBkColor (RGB (0, 0, 255 ), RGB ( 255 ,255 , 0 ) )…}需要重画对话 (或对 话的子控件)时,Windows 向对话发送消息 WM_CTLCOLOR,通常用户可以让 Windows 选择绘画背 景的刷子,也可重置该消息指定刷子。下例说明了创建一个红色背景对话的步骤。首先,给对话基类增加 一人成员变量 CBursh :class CMyFormView : public CFormView{…private :CBrush m_ brus h // background brush…}其次, 在类的构造函数中将刷子初始化为所需要的背景颜色。CMyFormV iew : : CMyFormView ( ){// Initialize background brush .m_brush .CreateSolidBrush (R GB ( 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 . O therwise let windows handle it .if (nCtlColor = = CTLCOLOR _ DLG )return (HBRUSH) m_brush.GetSafeHandle ( )return CFormView : : OnCtlColor (pDC, pWnd , nCtlColor)}(37) 如何获取一个对话控件的指针有两种方法。其一,调用 CWnd: : GetDlgItem,获取一个 CWn d*指针调用成员函数。下例调用 GetDlgItem,将返回值传给一个 CSpinButtonCtrl*以便调用 CSpinB uttonCtrl : : SetPos 函数: BOOL CSampleDialog : : OnInitDialog ( ){CDialog : : OnInitDi alog ( )//Get pointer to spin button .CSpinButtonCtrl * pSpin - ( CSpinButtonCtrl *) Ge tDlgItem(IDC_SPIN)ASSERT _ VALID (pSpin)//Set spin button's default position .pSpin -& SetPos (10)return TRUE}其二, 可以使用 ClassWizard 将控件和成员变量联系起来。在 Class Wizard 中简单地选择 Member Variables 标签, 然后选择 Add Variable …按钮。 如果在对话资源编辑 器中,按下 Ctrl 键并双击控件即可转到 Add Member Variable 对话。 (38) 如何禁止和使能控件控件也是窗口,所以可以调用 CWnd : : EnableWindow 使能和禁止控件。 //Disable button controls .m_wndOK.EnableWindow (FALSE )m_wndApply.EnableWindow (FALSE )(39) 如何改变控件的字体由于控件是也是窗口,用户可以调用 CWnd: : SetFont 指定新字体。该函 数用一个 Cfont 指针,要保证在控件撤消之前不能撤消字体对象。下例将下压按钮的字体改为 8 点 Arial 字体://Declare font object in class declaration (.H file ).private : Cfont m_font// Set fo nt in class implementation (.Cpp file ). Note m_wndButton is a//member variable adde d by ClassWizard.DDX routines hook the member//variable to a dialog button contrlo.B OOL CSampleDialog : : OnInitDialog ( ){…//Create an 8 -point Arial fontm_font . Create Font (MulDiv (8 , -pDC-& GetDeviceCaps(LOGPIXELSY) ,72). 0 , 0 , 0 , FW_NORMAL , 0 , 0,0, ANSI_CHARSER, OUT_STROKE_PRECIS ,CLIP_STROKE _PRECIS , DRAFT _QUAL ITYVARIABLE_PITCH |FF_SWISS, _T(&Arial&) )//Set font for push button .m_wndButton . SetFont (&m _font )…}(40) 如何在 OLE 控件中使用 OLE_COLOR 数据类型诸如 COleControl : : GetFortColor 和 COle Control : : GetBackColor 等函数返回 OLE _COLOR 数据类型的颜色,而 GDI 对象诸如笔和刷子使 用的是 COLORREF 数据类型,调用 COleControl : : TranslateColor 可以很容易地将 OLE_COLOR 类型改为 COLORREF 类型。下例创建了一个当前背景颜色的刷子:void CSampleControl : : OnDra w (CDC* pdcconst Crect& rcBounds , const Crect& rcInvalid){//Create a brush of the c uttent background color.CBrush brushBack (TranslateColor (GetBackColor () ) )//Paint t he background using the current backgroundcolor .pdc-& FilllRect (rcBounds , &brushBa ck)//other drawign commands…}(41) 在不使用通用文件打开对话的情况下如何显示一个文件列表调用 CWnd: : DlgDirList 或者 CWn d: : DlgDirListComboBox,Windows 将自动地向列表框或组合框填充可用的驱动器名或者指定目录 中的文件, 下例将 Windows 目录中的文件填充在组合框中: BOOL CSampleDig : : OnInitDialog ( ) {CDialog : : OnInitDialog ( )TCHAR szPath [MAX_PATH] = {&c:\windows&}int nReslt = DlgDirListComboBox (szPath, IDC_COMBO , IDC_CURIDIR, DDL_READWRITE |DDL_REA DONLY|DDL_HIDDEN| DDL_SYSTEM|DDL_ARCHIVE)return TRUE} (42) 为什么旋转按钮控件看起来倒转需要调用 CSpinCtrl : : SetRange 设置旋转按钮控件的范围, 旋转按钮控件的缺省上限为 0,缺省下限为 100,这意味着增加时旋转按控件的值由 100 变为 0。下例将 旋转按钮控件的范围设置为 0 到 100:BOOL CAboutDlg : : OnInitDialog ( ){CDialog : : OnIni tDialog ( )//set the lower and upper limit of the spin buttonm_wndSpin . SetRange ( 0 ,100 )return TRUE}Visual C++ 4.0 Print 对话中的 Copise 旋转按钮控件也有同样的问题: 按下 U p 按钮时拷贝的数目减少,而按下 Down 按钮时拷贝的数目增加。(43) 为什么旋转按钮控件不能自动地更新它下面的编辑控件如果使用旋转按钮的 autu buddy 特性, 则必须保证在对话的标记顺序中 buddy 窗口优先于旋转按钮控件。从 Layout 菜单中选择 Tab Order 菜 单项(或者按下 Crtl+D)可以设置对话的标签顺序。(44) 如何用位图显示下压按钮 Windows 95 按钮有几处新的创建风格,尤其是 BS_BITMAP 和 BS_ ICON, 要想具有位图按钮, 创建按钮和调用 CButton : : SetBitmap 或 CButton : : SetIcon 时要指 定 BS_BITMAP 或 BS_ICON 风格。首先,设置按钮的图标属性。然后,当对话初始化时调用 CButton: : SetIcon。注意:下例用图标代替位图,使用位图时要小心,因为不知道背景所有的颜色--并非每个人 都使用浅灰色。BOOL CSampleDlg : : OnInitDialog ( ){CDialog : : OnInitDialog ( )//set th e images for the push buttons .BOOL CSampleDlg : : OnInitDialog ( ){CDialog : : OnI nitDialog ( )//set the images for the push buttons .m_wndButton1.SetIcon (AfxGetApp ( ) -& LoadIcon (IDI _ IPTION1))m_wndButton2.SetIcon (AfxGetApp ( ) -& LoadIcon (I DI _ IPTION2))m_wndButton3.SetIcon (AfxGetApp ( ) -& LoadIcon (IDI _ IPTION3))ret urn TRUE}(45) 如何一个创建三态下压按钮可以使用新的 BS_PUSHBUTTON 风格位和检测框以及按钮来创建一 个三态下压按钮。这很容易,只需将检测框和按钮拖拉到对话中并指定属性 Push-like 即可。不用任何附 加程序就可以成为三态下压按钮。(46)如何动态创建控件分配一个控件对象的实例并调用其 Create 成员函数。 开发者最容易忽略两件事: 忘记指定 WS_VISBLE 标签和在栈中分配控件对象。下例动态地创建一个下压按钮控件://In class de claration (.H file ).private : CButton* m _pButton//In class implementation (.cpp file ) . m_pButton =new CButtonASSERT_VALID (m_pButton)m_pButton -&Create (_T (&Button Title &) , WS_CHILD |WS_VISIBLE |BS_PUSHBUTTON. Crect ( 0, 0, 100 , 24) , this , IDC _MYBUTTON )(47) 如何限制编辑框中的准许字符如果用户在编辑控件中只允许接收数字,可以使用一个标准的编辑 控件并指定新的创建标志 ES_NUMBERS,它是 Windows 95 新增加的标志,该标志限制 编辑控件只按 收数字字符。如果用户需要复杂的编辑控件,可以使用 Microsoft 的屏蔽编辑控件,它是一个很有用的 O LE 定制控件。如果希望不使用 OLE 定制控件自己处理字符,可以派生一个 CEdit 类并处理 WM_CHAR 消息,然后从编辑控件中过滤出特定的字符。首先,使用 ClassWizard 建立一个 CEdit 的派生类,其次, 在对话类中指定一个成员变量将编辑控件分类在 OnInitdialog 中调用 CWnd: : SubclassDlgItem .// In your dialog class declaration (.H file )private : CMyEdit m_wndEdit // Instance of yo ur new edit control .//In you dialog class implementation (.CPP file )BOOL CSampleDial og : : OnInitDialog ( ){…//Subclass the edit lontrod .m_wndEdit .SubclassDlgItem (IDC _EDIT,this)…}使用 ClassWizard 处理 WM_CHAR 消息,计算 nChar 参量并决定所执行的操作,用户 可以确定是否修改、传送字符。下例说明了如何显示字母字符,如果字符是字母字符,则调用 CWnd On Char,否则不调用 OnChar.//Only display alphabetic dharacters .void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UITN nFlags ){//Determine if nChar is an alphabetic cha racter.if (: : IsCharAlpha ( ( TCHAR) nChar ) )CEdit : : OnChar (nChar, nRepCnt , nFla gs )}如果要修改字符,则不能仅仅简单地用修改过的 nChar 调用 CEdit: : OnChar,然后 CEdit: : O nChar 调用 CWnd: : Default 获取原来的 wParam 和 lParam 的值, 这样是不行的。 要修改一个字符, 需要首先修改 nChar,然后用修改过的 nChar 调用 CWnd: : DefWindowProc。下例说明了如何将字 符转变为大写://Make all characters uppercasevoid CMyEdit : : OnChar (UINT nChar , UI NT nRepCnt , UINT nFlags ){//Make sure character is uppercase .if (: : IsCharAlpha ( . ( TCHAR) nChar)nChar=: : CharUpper(nChar )//Bypass default OnChar processing and directly call//default window proc.DefWindProc (WM_CHAR, nChar , MAKELPARAM (nRep Cnt, nFlags )))VC 常用技巧总结 2(48) 如何改变控件的颜色有两种方法。其一,可以在父类中指定控件的颜色,或者利用 MFC4.0 新的 消息反射在控件类中指定颜色。 当控件需要重新着色时,工作框调用父窗口(通常是对话框)的 CWnd: : OnCrtlColor,可以在父窗口类中重置该函数并指定控件的新的绘画属性。例如,下述代码将对话中的 所有编辑控件文本颜色改为红色: HBRUSH CAboutDig : : OnCtlColor (CDC * pDCM , CWnd * pWnd , UINT nCtlColor){HBRUSH hbr = CDialog : : OnCtlColor (pDC, pWnd , nCtlColor )//Draw red text for all edit controls .if (nCtlColor= = CTLCOLOR_EDIT )pDC -& SetTe xtColor (RGB (255, 0 , 0 , ) )return hbr}然而,由于每个父窗口必须处理通知消息并指定每个控 件的绘画属性,所以,这种方法不是完全的面向对象的方法。控件处理该消息并指定绘画属性更合情合理。 消息反射允许用户这样做。通知消息首先发送给父窗口,如果父窗口没有处理则发送给控件。创建一个定 制彩色列表框控件必须遵循下述步骤。首先,使用 ClassWizard 创建一个 CListBox 的派生类并为该类 添加下述数据成员。class CMyListBox publilc CListBox{…privateCOLORREF m_clrFor // foreg round colorCOLORREF m_clrBack //background colorCbrush m_brush //background brus h…}其次,在类的构造函数中,初始化数据中。CMyListBox : : CMyListBox (){//Initialize data members .m_clrFore =RGB (255 , 255 , 0) //yellow textm_clrBack=RGB (0 , 0 , 255) // blue backgroundm_brush . CreateSolidBrush (m _clrBack )}最后,使用 ClassWizard 处理 反射的 WM_CTLCOLOR(=WM_CTLCOLOR)消息并指定新的绘画属性。 HBRUSH CMyListBox : : C tlColor (CDC* pDC, UINT nCtlColor ){pDC-&SetTextColor (m_clrFore)pDC-&SetBkColor (m_clrBack)return (HBRUSH) m_brush.GetSafeHandle ()}现在,控件可以自己决定如何绘画, 与父窗口无关。(49) 当向列表框中添加多个项时如何防止闪烁调用 CWnd::SetRedraw 清除重画标志可以禁止 CLis tBox(或者窗口)重画。当向列表框添加几个项时,用户可以清除重画标志,然后添加项,最后恢复重画 标志。为确保重画列表框的新项,调用 SetRedraw (TRUE) 之后调用 CWnd::Invalidate。//Disable redrawing.pListBox-&SetRedraw (FALSE)//Fill in the list box gere//Enable drwing and m ake sure list box is redrawn.pListBox-&SetRedraw (TRUE)pListBox-&Invalidate ()(50) 如何向编辑控件中添加文本由于没有 CEdit:: AppendText 函数,用户只好自己做此项工作。调 用 CEdit:: SetSel 移动到编辑控件末尾,然后调用 CEdit:: ReplaceSel 添加文本。下例是 AppendTe xt 的一种实现方法:void CMyEdit:: AppendText (LPCSTR pText){int nLen=GetWindowTextL ength ()SetFocus ()SetSel (nLen, nLen)ReplaceSel (pText)}(51) 如何访问预定义的 GDI 对象可以通过调用 CDC:: SlectStockObject 使用 Windows 的几个预 定义的对象,诸如刷子、笔以及字体。下例使用了 Windows 预定义的笔和刷子 GDI 对象在视窗中画一个 椭圆。//Draw ellipse using stock black pen and gray brush.void CSampleView:: OnDraw (CDC* pDC){//Determine size of view.CRect rcViewGetClientRect (rcView)//Use stock bl ack pen and stock gray brush to draw ellipse.pDC-&SelectStockObject (BLACK_PEN)pDC -&SelectStockObject (GRAY_BRUSH)//Draw the ellipse.pDC-&Ellipse (reView)}也可以调用 新的 SDK 函数 GetSysColorBrush 获取一个系统颜色刷子,下例用背景色在视窗中画一个椭圆:void CsampleView:: OnDraw (CDC* pDC){//Determine size of view.CRect rcViewGetClientRec t (rcView)//Use background color for tooltips brush.CBrush * pOrgBrush=pDC-&SelectO bject ( CBrush ::FromHandle( ::GetSysColorBrush (COLOR_INFOBK)))//Draw the ellipse. pDC-&Ellipse (rcView)//Restore original brush.pDC-&SelectObject (pOrgBrush)}(52) 如何获取 GDI 对象的属性信息可以调用 GDIObject:: GetObject。这个函数将指定图表设备的 消息写入到缓冲区。下例创建了几个有用的辅助函数。//Determine if font is bold.BOOL IsFontBol d (const CFont&font){LOGFONT stFontfont.GetObject (sizeof (LOGFONT), &stFont)return (stFont.lfBold)? TRUE: FALSE}//Return the size of a bitmap.CSize GetBitmapSize (cons t CBitmap&bitmap){BITMAP stBitmapbitmap.GetObject (sizeof (BITMAP), &stBitmap)retu rn CSize (stBitmap.bmWidth, stBitmap.bmHeight)}//Create a pen with the same color a s a brush.BOOL CreatePenFromBrush (Cpen&pen, cost Cbrush&brush){LOGBRUSH stBru shbrush.Getobject (sizeof (LOGBRUSH), &stBrush)return pen. Createpen (PS_SOLID, 0, stBrush.ibColor)}(53) 如何实现一个橡皮区矩形 CRectTracker 是一个很有用的类,可以通过调用 CRectTracker::Tr ackRubberBand 响应 WM_LBUTTONDOWN 消息来创建一个橡皮区矩形。下例表明使用 CRectTrack er 移动和重置视窗中的蓝色椭圆的大小是很容易的事情。首先,在文件档中声明一个 CRectTracker 数据 成员:class CSampleView : Public CView{…public :CrectTracker m_tracker…}其次,在文档 类的构造函数中初始化 CRectTracker 对象:CSampleDoc:: CSampleDOC (){//Initialize tracker position, size and style.m_tracker.m_rect.SetRect (0, 0, 10, 10)m_tracker.m_nStyle=C RectTracker:: resizeInside | CRectTracker ::dottedLine}然后, 在 OnDraw 函数中画椭圆和踪迹 矩形: void CSampleView:: OnDraw (CDC* pDC){CSampleDoc* pDoc=GetDocument ()ASS ERT_VALID (pDoc)//Select blue brush into device context.CBrush brush (RGB (0, 0, 25 5))CBrush* pOldBrush=pDC-&SelectObject (&brush)//draw ellipse in tracking rectangle. Crect rcEllipsepDoc-&m_tracker.GetTrueRect (rcEllipse)pDC-&Ellipse (rcEllipse)//Draw tra cking rectangle.pDoc-&m_tracker.Draw (pDC)//Select blue brush out of device context.p DC-&Selectobject (pOldBrush)}最后,使用 ClassWizard 处理 WM_LBUTTONDOWN 消息,并增 加下述代码。该段代码根据鼠标击键情况可以拖放、移动或者重置椭圆的大小。void CSampleView::O nLButtonDown (UINT nFlags, CPoint point){//Get pointer to document.CSampleDoc* pD oc=GetDocument ()ASSERT_VALID (pDoc)//If clicked on ellipse, drag or resize it.Other wise create a//rubber-band rectangle nd create a new ellipse.BOOL bResult=pDoc-&m_t racker.HitTest (point)!= CRectTracker::hitNothing//Tracker rectangle changed so update views.if (bResult){pDoc-&m_tracker.Track (this,point,TRue)pDoc-&SetModifiedFlag ()pD oc-&UpdateAllViews (NULL)}elsepDoc-&m-tracker.TrackRubberBand(this,point,TRUE)CVie w:: onLButtonDown (nFlags,point)}(54) 如何更新翻转背景颜色的文本调用 CDC:: SetBkmode 并传送 OPAQUE 用当前的背景颜色填充 背景,或者调用 CDC::SetBkMode 并传送 TRANSPAARENT 使背景保持不变,这两种方法都可以设置 背景模式。下例设置背景模式为 TRANSPARENT,可以两次更新串,用花色带黑阴影更新文本。黑色串 在红色串之后,但由于设置了背景模式仍然可见。void CSampleView:: OnDraw (CDC* pDC){//D etermint size of view.CRect rcViewGetClientRect (rcVieew)//Create sample string to disp lay.CString str (_T (&Awesome Shadow Text...&))//Set the background mode to trans parent.pDC-&SetBKMode (TRANSPARENT)//Draw black shadow text.rcView.OffsetRect (1, 1)pDc-&SetTextColor (RGB (0, 0, 0))pDC-&DrawText (str, str.GetLength (), rcView, DT_SINGLELINE | DT_CENTER | DT_VCENTER)//Draw red text.rcView.OffsetRect (-1,-1) pDc-&SetTextColor (RGB (255, 0, 0))pDC-&DrawText (str, str.GetLength (), rcView, DT _SINGLELINE | DT_CENTER | DT_VCENTER)}(55) 如何创建一个具有特定点大小的字体可以指定字体逻辑单位的大小,但有时指定字体的点的大小 可能会更方便一些。可以如下将字体的点转换为字体的高度:int nHeigth=mulDiv (nPointSize, -dc. GetDeviceCaps (LOGPIXELSY), 72)下例创建了一个 8 点的 Apial 字体:…CClientDC dc (AqfxGe tMainWnd ())m_font. CreateFont (MulDiv (8, -dc.GetDeviceCaps (LOGPIXELSY), 72), 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_STROKE_PRECIS, CLIP_STROKE_PREC IS, DRAFT_QUALITY, VARIABLE_PITCH | FF-SWISS,_T(&Arial&)) (56) 如何计算一个串的大小函数 CDC:: Det text Extent 根据当前选择的字体计算一个串的高度和 宽度。如果使用的不是系统字体而是其他字体,则在调用 GetTextExtent 之前将字体选进设备上下文中 是很重要的,否则计算高度和宽度时将依据系统字体,由}

我要回帖

更多关于 activex控件下载 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信