您的位置:首页 > 编程语言 > C语言/C++

C++调用微软actieX控件实现远程桌面实例

2017-11-01 14:41 1056 查看
工程下载: http://download.csdn.net/download/wochendaixin/10048581  点击打开链接

系统:win10;

工具:vs2017

主要的工作部分:

1.  新建MFC的activax控件工程;

    一切都是默认走下去。直接编译。然后为这个自动生成的activeX控件添加一个MFC dialog对话框。

     参考网址:http://blog.csdn.net/wangzhiyang925/article/details/38715605  点击打开链接

     遇到问题:

(1)我使用的vs2017一直无法为插入的对话框右键添加类。总是提示defulit.js找不到。

查了很多资料没有解决【参考:https://social.msdn.microsoft.com/Forums/zh-CN/6d6f1f3a-2b14-4194-a53d-7a0c72108f8a/mfc?forum=vstudiozhchs&forum=vstudiozhchs 

点击打开链接】

最后我换了一台机器就可以右键添加类。所以我也不知道这个问题怎么解决。已经为了这个问题重装了多次vs2017,连系统都重装了一次还是不行。但是你在vs2015中是可以为对话框右键添加类的。

2.在刚才新建的对话框中添加一个微软的远程桌面 activeX控件。

   参考网址:http://blog.csdn.net/linlin003/article/details/52922741  点击打开链接

   遇到问题:之前因为vs2017无法右键添加对话框类,所以中间换了2015,结果悲剧法发现vs2015无法为activeX控件右键添加变量。。。结果又是一顿调。最后还是解决不了。    直接放弃了,换了之前好用的的一台装了vs2017的机器。

3.写一个html文件,来调用第一步生成的activeX控件。

主要的运行流程:

     html中通过classid来加载我们所建立并注册的activex控件,控件显示的是一个mfc的对话框,对话框里面加入了微软的
Microsoft RDP Client Contorl 这个ActiveX控件,远程连接之后的桌面显示在这个控件范围区中。

主要代码改动地方:

(1) hetml文件内容:

<HTML>
<HEAD>
<TITLE>TestActiveX</TITLE>
</HEAD>
<OBJECT ID="TestMfcAtl Control" WIDTH=100%  HEIGHT=100% classid="CLSID:2FB3C11A-DB50-4E62-9D82-757AD5CD8923"></OBJECT>
</HTML>

因为我想让插件的界面铺满浏览器的界面,所以有100%的语句。这只是限定了网页中显示插件的界面大小,可以替换成固定的数字。后面的classid是编译完MFC Activex控件,并且注册完毕后的ocx的ID.

(2)建立整个MFC Activex控件工程,和插入的MFC dialog对话框之间的关系   参考网址:http://blog.csdn.net/linlin003/article/details/52922741点击打开链接

   我的工程中,是想让插入的dialog对话框可以读取html文件中设置的 width,heigh,然后改动这个对话框的大小。就比如在我的html中设置的大小是铺满整个浏览器界面,所以对话框读取到这个大小,然后就将自己原本的尺寸(就是你添加对话框时,自动生成了一个大小的框),改变为新的尺寸。

在 MFC Activx控件工程下的   .....crl.h 文件中

#include"ViewDialog.h"

class   ..{

.....
//添加消息
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
}
然后在对应的   ...crl.cpp文件中

void CTestMfcAtlDebugCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& /* rcInvalid */)
{
if (!pdc)
return;

// TODO:  用您自己的绘图代码替换下面的代码。
//pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
//pdc->Ellipse(rcBounds);

m_VideoDlg.MoveWindow(rcBounds, TRUE);//(the dialog's size depends on the WIDTH and HEIGHT specified in the HTML file):
}

int CTestMfcAtlDebugCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO:  在此添加您专用的创建代码

AfxEnableControlContainer();
m_VideoDlg.Create(IDD_VIEW_DIALOG,this);

return 0;
}


这两处更改就可以让对话框和所创建的active控件联系起来。反映到实际的效果就是,控件在初始的绘图时已经不再是画一个圆圈了(在 ondraw函数中被注释掉了),而是绘制了一个对话框,这个框界面大小是由html决定。

(3)框界面大小随html决定,那么,框里的控件大小也应该随之变化,不然多丑。

这一部分,我主要是参考  http://www.cnblogs.com/hikeepgoing/p/6017526.html 
点击打开链接

在插入对话框时不是有一个步骤:右键,给这个对话框添加类。

这时,右键添加类之后,生成一个ViewDialog.h和Viewdialog.cpp

在Viewdialog.h文件中:
class  ....{

........
protected:
CRect m_rect;
void ReSize();
POINT old;
........
public:
virtual BOOL OnInitDialog();
afx_msg void OnSize(UINT nType, int cx, int cy);

.....
}
上面的onInitdialog()函数在你插入对话框时并不是直接生成的,需要你自己去一番操作,afx_msg void OnSize()是通过类向导中的消息加入的。

在viewdialog.cpp文件中;;

BOOL CViewDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();

// TODO:  在此添加额外的初始化
CRect rect;
GetClientRect(&rect);//取客户区大小    
old.x = rect.right - rect.left;
old.y = rect.bottom - rect.top;

return TRUE;  // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}

void CViewDialog::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);

// TODO: 在此处添加消息处理程序代码
if (nType != SIZE_MINIMIZED)  //判断窗口是不是最小化了,因为窗口最小化之后 ,窗口的长和宽会变成0,当前一次变化的时就会出现除以0的错误操作
{
ReSize();
}
}

void CViewDialog::ReSize()
{
float fsp[2];
POINT Newp; //获取现在对话框的大小
CRect recta;
GetClientRect(&recta);     //取客户区大小
Newp.x = recta.right - recta.left;
Newp.y = recta.bottom - recta.top;
fsp[0] = (float)Newp.x / old.x;
fsp[1] = (float)Newp.y / old.y;
CRect Rect;
int woc;
CPoint OldTLPoint, TLPoint; //左上角
CPoint OldBRPoint, BRPoint; //右下角
HWND  hwndChild = ::GetWindow(m_hWnd, GW_CHILD);  //列出所有控件
while (hwndChild) {
woc = ::GetDlgCtrlID(hwndChild);//取得ID
GetDlgItem(woc)->GetWindowRect(Rect);
ScreenToClient(Rect);
OldTLPoint = Rect.TopLeft();
TLPoint.x = long(OldTLPoint.x*fsp[0]);
TLPoint.y = long(OldTLPoint.y*fsp[1]);
OldBRPoint = Rect.BottomRight();
BRPoint.x = long(OldBRPoint.x *fsp[0]);
BRPoint.y = long(OldBRPoint.y *fsp[1]);
Rect.SetRect(TLPoint, BRPoint);
GetDlgItem(woc)->MoveWindow(Rect, TRUE);
hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT);
}
old = Newp;
}

这样就会是的我们在插入的对话框中的一些控件,按钮等等,都可随着对话框大小改变而动态变化。

(4)对话框的环境已经准备好,接下来就是在对话框中添加微软的远程控件
这里主要参考:http://blog.csdn.net/linlin003/article/details/52922741 点击打开链接

应为远程控件是放在对话框界面里的,所以必然对话框会和这个远程控件产生一些调用关系。所以;
在viewdialog.h文件中

#include "mstscax1.h"
#include"CMsRdpClientAdvancedSettings6.h"

class...{

....
public:
// RDP控件变量
CMstscax1 m_RDP;
...
}


在viewdialog.cpp文件中:
我的对话框中保留了初始生成时的 确定和取消 按钮。所以我把 启动连接 写在了确定按钮响应函数体里,断开连接 写在了 取消按钮响应函数体里

void CViewDialog::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//CDialogEx::OnOK();

//获取控件当前的区域大小,决定远程桌面显示的大小
CRect rectRdpTemp;
GetDlgItem(IDC_MSTSCAX1)->GetWindowRect(rectRdpTemp);
long RdpHeight = rectRdpTemp.Height();
long RdpWidth = rectRdpTemp.Width();

CMsRdpClientAdvancedSettings6 m_MsRdpClientAdvancedSettings(m_RDP.get_AdvancedSettings());
m_RDP.put_Server(_T("192.168.10.182"));//远程目标主机的IP  
m_RDP.put_UserName(_T("work"));//登陆用户名  
m_RDP.put_DesktopHeight(RdpHeight);
m_RDP.put_DesktopWidth(RdpWidth);
m_RDP.put_ColorDepth(32);
m_MsRdpClientAdvancedSettings.put_Compress(1);
m_MsRdpClientAdvancedSettings.put_BitmapPeristence(1);
m_MsRdpClientAdvancedSettings.put_ClearTextPassword(_T("work"));//登陆密码  
m_MsRdpClientAdvancedSettings.put_singleConnectionTimeout(30);//连接时延  
m_RDP.put_ConnectingText(_T("连接中..."));//连接时显示在界面的文字  
m_RDP.Connect();
//GetDlgItem(IDOK)->EnableWindow(FALSE);

}

void CViewDialog::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
//CDialogEx::OnCancel();
m_RDP.Disconnect();
}

结束l

其实整个流程很少,主要是一直都在纠结:
1.为什么vs2017无法为对话框添加类,卸载重装。。。都不好使,能装的组件都装了。。
2.为什么vs2015,可以为对话框添加类,却无法给对话框中的一个ActiveX控件右键添加变量
3.自己之前装了一个本里的vs2017却都可以实现添加类和添加变量。这是最骚的。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: