【专题】VisualStudio2005(4)
添加时间: 2007-4-8 5:57:24 作者: 程序员认证参考 阅读次数:57 来源: http://www.d9soft.com
循序渐进:visual studio 2005 中的新增本机开发功能许多典型问题应已涵盖在 msdn 上的“what's new in visual studio 2005 for native developers”和“将 microsoft embedded visual c++ 项目迁移到 visual studio 2005”两篇文章中。
如果您按 ctrl + 空格键使用 intellisense 技术来完成一行代码,则 ide 可能冻结。这是一个已知错误;因此,请不要按 ctrl + 空格键。
此体验的目标是使用 visual studio 2005 来创建用于 pocket pc 的 atl activex 控件,以及该 activex 控件对应的 mfc 宿主设备应用程序。该 activex 控件将是具有一种填充颜色的三角形,单击该控件时,填充颜色会发生变化。相应的宿主应用程序将是一个基于对话框的应用程序,用来驻留该 activex 控件。此外,还将用一个测试证书对控件和宿主应用程序都进行签名。
在此体验中,您将执行以下练习:
• 创建 atl activex 控件
• 创建 mfc activex 宿主应用程序
练习 1:创建 atl activex 控件在此练习中,您将使用 visual studio 2005 来创建一个用于 pocket pc 的 atl activex 控件。
完成 atl 智能设备项目向导的步骤
1.
在 visual studio 2005 中,单击 file new project(文件 新建 项目)。
2.
展开 visual c++,然后选择 smart device(智能设备)。
3.
选择 atl smart device project(atl 智能设备项目),然后在 name(名称)框中键入 ctl1。
4.
单击 ok(确定)。
5.
在 atl smart device project wizard(atl 智能设备项目向导)页中,选择 platforms(平台)。
6.
确保 windows mobile 5.0 pocket pc sdk 和 pocket pc 2003 都位于 selected sdks(选定的 sdk)区域中。如果它们不在该区域中,则在 installed sdks(已安装的 sdk)区域中选择它们,然后单击 add selected platform sdk to project(将选定的 platform sdk 添加到项目中)按钮。
7.
选择 application settings(应用程序设置)。
8.
确保在 server type(服务器类型)下选择了 dynamic-link library (dll)(动态链接库 [dll]),且在 additional options(附加选项)下没有选中任何复选框。
9.
单击 finish(完成)。
创建 activex 类的步骤
1.
在 solution explorer(解决方案资源 管理 器)中,右键单击 ctrl1 项目,然后单击 add class(添加 类)。
2.
展开 visual c++,然后选择 smartdevice(智能设备)。
3.
在 visual studio installed templates(visual studio 已安装的模板)下,选择 atl control(atl 控件),然后单击 add(添加)。
4.
在 names(名称)页上,在 shortname(简称)框中键入 myctl。
5.
选择 stockproperties(常用属性)。
6.
在 not supported(不受支持)列表中,选择 fillcolor(填充颜色)。
7.
单击 add selected property to the supported list(将选定的属性添加到受支持列表中)按钮将它添加到 supported(受支持)列表中。
8.
单击 finish(完成)。请不要更改其他任何选项。
向 activex 类添加属性的步骤
1.
单击 class view(类视图)选项卡,然后展开 ctl1。
2.
右键单击 imyctl,再单击 add(添加),然后单击 addproperty(添加属性)。
3.
在 propertytype(属性类型)框中,选择 short。
4.
在 propertyname(属性名称)框中,键入 sides。
5.
单击 finish(完成)。
向 activex 类添加代码的步骤
1.
在 solution explorer(解决方案资源管理器)中,双击 myctl.h。
2.
在 imyctl 界面末尾查找以下代码。
public:stdmethod(get_sides)(short* pval);public:stdmethod(put_sides)(short newval);
3.
将以下代码添加在步骤 2 中的代码之后。这些成员用于绘制控件的边。
private:short m_nsides;point m_arrpoint[100];int m_currentcolor;
4.
将以下代码添加到 cmyctl() 构造函数主体。这会将控件初始化,使其具有三个边和一种填充颜色。m_currentcolor 用于跟踪当前颜色,以便单击控件时,该控件可以切换为其他颜色。
m_nsides = 3;m_clrfillcolor = rgb(0, 0xff, 0);m_currentcolor = 2;
5.
删除 ondraw(atl_drawinfo& di) 方法的主体。
6.
然后,在该方法声明的末尾添加一个分号(因为您将执行自己的 ondraw)。ondraw 方法应如下所示。
hresult ondraw(atl_drawinfo& di);
7.
在消息映射段中插入以下消息处理程序:begin_msg_map(cmyctl)。此代码使得 activex 控件可以相应地处理自己的用户单击和响应。
message_handler(wm_lbuttondown, onlbuttondown);
8.
cmyctl 类的完整消息映射段应如下所示。
begin_msg_map(cmyctl)message_handler(wm_lbuttondown, onlbuttondown);chain_msg_map(ccomcontrol<cmyctl>)default_reflection_handler()end_msg_map()
9.
在 messagemap 段下面添加以下处理程序原型。
lresult onlbuttondown(uint, wparam, lparam, bool&){
switch(m_currentcolor) {case 1:m_currentcolor = 2;m_clrfillcolor = rgb(0, 0xff, 0);break;case 2:m_currentcolor = 1;m_clrfillcolor = rgb(0xff, 0xff, 0);break; } put_fillcolor(m_clrfillcolor);return 0;}
10.
打开 myctl.cpp。
11.
将以下代码复制并粘贴到 myctl.cpp。此代码用于绘制 activex 控件。
#define gsc_mask 0x80000000l#define gsc_setbit 0x04000000l
inline hresult wce_oletranslatecolor(ole_color clr, hpalette, colorref *retclr){
*retclr = (clr & gsc_mask) ?getsyscolor(clr & (~gsc_mask) gsc_setbit) :(colorref)(clr & 0x00ffffff);return s_ok;}
hresult cmyctl::ondraw(atl_drawinfo& di){
rect& rc = *(rect*)di.prcbounds;hdc hdc = di.hdcdraw;
colorref colfore;hbrush holdbrush, hbrush;hpen holdpen, hpen;
// 将 m_colfore 转换为 colorref 类型wce_oletranslatecolor(m_clrfillcolor, null, &colfore);// 创建并选择颜色来绘制圆hpen = (hpen)getstockobject(black_pen);holdpen = (hpen)selectobject(hdc, hpen);
const double pi = 3.14159265358979;point ptcenter;double dblradiusx = (rc.right - rc.left) / 2;double dblradiusy = (rc.bottom - rc.top) / 2;double dblangle = 3 * pi / 2; // 从顶端开始double dbldiff = 2 * pi / m_nsides; // 使每条边转动角度将 // 使ptcenter.x = (rc.left + rc.right) / 2;ptcenter.y = (rc.top + rc.bottom) / 2; // 计算每条边对应的点for (int i = 0; i < m_nsides; i++) {m_arrpoint[i].x = (long)(dblradiusx * cos(dblangle) + ptcenter.x + 0.5);m_arrpoint[i].y = (long)(dblradiusy * sin(dblangle) + ptcenter.y + 0.5);dblangle += dbldiff; }
// 创建并选择将用于填充多边形的 // 画笔hbrush = createsolidbrush(colfore);holdbrush = (hbrush)selectobject(hdc, hbrush);selectobject(hdc, hbrush);polygon(hdc, &m_arrpoint[0], m_nsides);
// 选择回原来的笔和画笔,删除我们创建的 // 画笔selectobject(hdc, holdpen);selectobject(hdc, holdbrush);deleteobject(hbrush);
return s_ok;}
12.
查找以下属性 get 函数。
stdmethodimp cmyctl::get_sides(short* pval)
13.
然后,将以下代码添加到函数主体(在 return s_ok 之前)
*pval = m_nsides;
14.
查找以下属性 put 函数:
stdmethodimp cmyctl::put_sides(short newval)
15.
然后,将以下代码添加到函数主体(在 return s_ok 之前)
atlassert(newval > 2 && newval < 101);m_nsides = newval;fireviewchange();
16.
打开 stdafx.h。
17.
在 stdafx.h 开头附近,在 #pragma once 之下添加以下代码。此代码将防止 atl 8.0 for devices 在针对非 dcom 平台使用线程模型编译项目时抛出 #error。
#define _ce_allow_single_threaded_objects_in_mta
18.
单击 build(生成),然后单击 buildsolution(生成解决方案)以生成项目。确保不存在任何编译或链接错误。
对 activex 项目进行签名的步骤
1.
在 solution explorer(解决方案资源 管理 器)中,右键单击 ctl1 项目,然后单击 properties(属性)。
2.
展开 authenticode signing(authenticode 签名),然后选择 general(常规)。
3.
将 authenticode signature(authenticode 签名)属性更改为 yes(是)。
4.
在 certificate(证书)列表中,单击省略号按钮。
5.
在 select certificate(选择证书)对话框中,单击 managecertificates(管理证书)。
6.
在 managecertificates(管理证书)对话框中,单击 import(导入)。
certificate import wizard(证书导入向导)将打开。
7.
单击 next(下一步)。
8.
在 file to import(要导入的文件)页中,单击 browse(浏览)。
9.
浏览到 c:program filesmicrosoft visual studio 8smartdevicessdksdktools estcertificates。
10.
在 files of type(文件类型)组合框中,将文件类型更改为 personal information exchange (*.pfx,*.p12),如下图所示。

11.
选择 testcert_privileged。
12.
单击 open(打开)。
13.
在 file to import(要导入的文件)页中,单击 next(下一步)。
14.
保留密码为空,然后单击 next(下一步)。
15.
确保选择了 place all certificates in the following store(将所有证书放置在以下存储区中)选项按钮,并将 certificate store(证书存储区)属性设置为 personal(个人)。
16.
单击 next(下一步)。
17.
单击 finish(完成)。
18.
当 import was successful(导入成功)对话框出现时,单击 ok(确定)。
19.
关闭 managed certificates(托管证书)对话框。
20.
在 select certificate(选择证书)对话框中,您现在应该会看到 smartphone 2003 privileged test 证书,选择该证书,然后单击 ok(确定)。
每次生成该项目时都应该使用此证书对其进行签名。
21.
在 ctl1 property pages(ctl1 属性页)上,在 provision device(供应设备)列表中选择 privileged certificate store(特许证书存储区),如下图所示。

22.
单击 ok(确定)。
每次部署该项目时,都会为设备的 privileged certificate store(特许证书存储区)配置选定的证书。
部署和注册 activex 控件的步骤
• 在 solution explorer(解决方案资源管理器)中,右键单击 ctl1 项目,然后选择 deploy(部署)。仿真器将打开,并将部署和注册 activex 控件。
上一篇文章: 04年下半年 软件设计师上午试卷 下一篇文章: 历年高级程序员试题 五
相关文章:
相关软件:

