找回密码
 加入
搜索
查看: 31609|回复: 62

[AU3基础] (已解决)控件XTPReport的内容如何读取

 火.. [复制链接]
发表于 2011-10-4 14:37:07 | 显示全部楼层 |阅读模式
本帖最后由 fisher 于 2011-11-5 12:53 编辑

图1是某软件的资金窗口,想读取里面的数据。
图2、3是用窗口工具看见的句柄,“可见文本”“隐藏文本”均没有数据。
和SysListView32类似,均是原窗口有显示,而窗口工具看不见。

坛子也没搜到XTPReport的任何信息,有请DX指点怎么才能读到XTPReport里的数据。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2011-10-4 14:41:11 | 显示全部楼层
别‘某’了,这样让别人猜,不好!
在别的大多数语言里,类名可以随便定义的,你当然搜不到
 楼主| 发表于 2011-10-4 15:25:34 | 显示全部楼层
直接写,怕被认为做广告,被封。
 楼主| 发表于 2011-10-4 15:26:05 | 显示全部楼层
搜来的,看的似懂非懂



xtreme toolkit pro——CXTPReportControl控件教程

CXTPReportControl控件是xtreme toolkit pro中的一个控件,它用来显示表格,可以显示表头表尾,可以对各列排序,拖放,等等,,也可以对各个单元格进行编辑,功能非常强大。下面介绍一下他的使用:
1. 在工程中头文件“stdafx.h”中添加:
#include <XTToolkitPro.h> // Xtreme Toolkit Pro component library
2. 如果要使用静态连接的方式,还应该:
Add the following line to your application's .rc2 file. This will link in the toolkit resources so they are available to your application.
#include <XTToolkitPro.rc>
如果是动态连接的方式,需要xtreme toolkit的.dll拷贝到exe的输出目录下。
3. 添加CXTPReportControl控件:
(1)在对话框中添加一个自定义控件,将该控件的class属性改为XTPReport,ID改为;IDC_REPORTCTRL_LIST。
(2)添加一个自定义变量:CXTPReportControl m_wndReportCtrl;
(3)将控件和变量联系起来,在对话框初始化函数OnInitDialog()中添加如下代码:
m_wndReportCtrlList.SubclassDlgItem(IDC_REPORTCTRL_LIST,this);
4. 设置控件的外观:
//初始化报表的外观
m_wndReportCtrl.AllowEdit(FALSE);
//m_wndReportCtrl.EditOnClick(FALSE);
//m_wndReportCtrl.EnableDragDrop(NULL, xtpReportAllowDrag | xtpReportAllowDrop);//允许拖曳行
m_wndReportCtrl.EnableToolTips(TRUE);//在列头显示提示tooltips
//m_wndReportCtrl.ShowHeader(TRUE);//显示头部(默认显示)
//m_wndReportCtrl.ShowHeaderRows(TRUE);//显示头行
//m_wndReportCtrl.ShowFooter(TRUE);//显示页脚footer,即界面下边,与header对应
//m_wndReportCtrl.ShowFooterRows(TRUE);//显示页脚行
//m_wndReportCtrl.HeaderRowsAllowEdit(TRUE);//允许编辑HeaderRows
//m_wndReportCtrl.FooterRowsAllowEdit(TRUE);//允许编辑FooterRows
//     COLORREF clrNew;
// clrNew = RGB(0, 255, 0);
// m_wndReportCtrl.SetGridColor(clrNew);//设置网格线颜色
m_wndReportCtrl.SetGridStyle(TRUE,XTPReportGridStyle(xtpReportGridSolid));//设置垂直网格线风格
m_wndReportCtrl.SetGridStyle(FALSE,XTPReportGridStyle(xtpReportGridSolid));//设置垂直网格线风格
//m_wndReportCtrl.SetFreezeColumnsCount(2);//左侧两列冻住,注意,此方法必须在添加了列之后才能使用
m_wndReportCtrl.GetPaintManager()->SetColumnStyle(XTPReportColumnStyle(xtpReportColumnOffice2007));//设置列的风格
//m_wndReportCtrl.GetPaintManager()->SetGridColor(clrNew);//设置网格线颜色
m_wndReportCtrl.GetReportHeader()->AllowColumnRemove(FALSE);//不允许移除列
m_wndReportCtrl.GetReportHeader()->AllowColumnResize(TRUE);//允许改变列的宽度
m_wndReportCtrl.GetReportHeader()->AllowColumnSort(TRUE);//允许对列中的各行排序
m_wndReportCtrl.GetReportHeader()->AllowColumnReorder(FALSE);//不允许列之间重新排序(通过拖拽列头部)
m_wndReportCtrl.GetReportHeader()->SetAutoColumnSizing(TRUE);//不允许各列自动调节宽度
//设置列宽自动调整为false,这样一来,所有列宽不是随reportControl的宽度变化而自动变化。
//如果所有的列宽之和大于reportControl的宽度,就会自动显示横向工具条
m_wndReportCtrl.SetFullColumnScrolling(FALSE);//按像素水平滚动,而不是逐列滚动(即滚动一下就移动一列)
//m_wndReportCtrl.SetFullColumnScrolling(TRUE);//逐列滚动(即滚动一下就移动一列)
m_wndReportCtrl.SetMultipleSelection(TRUE);//允许多选
5. 添加列:
///添加列
CXTPReportColumn* pCol1=new CXTPReportColumn(0, _T("序号"), 80);
pCol1->SetHeaderAlignment(DT_CENTER);
pCol1->SetAlignment(DT_CENTER);
//pCol1->SetEditable(FALSE);//不可编辑
m_wndReportCtrl.AddColumn(pCol1);
6. 添加行
CXTPReportRecord *pRecord = new CXTPReportRecord();
pRecord->AddItem(new CXTPReportRecordItemNumber(i+1));//行号
pRecord->AddItem(new CXTPReportRecordItemText(m_pDataGroup->m_arrDataTable[i].m_sBusInfo));//基本信息
pRecord->AddItem(new CXTPReportRecordItemNumber(m_pDataGroup->m_arrDataTable[i].m_dMw1,KEY_FORMAT_NUMBER));
pRecord->AddItem(new CXTPReportRecordItemNumber(m_pDataGroup->m_arrDataTable[i].m_dMw2,KEY_FORMAT_NUMBER));
pRecord->AddItem(new CXTPReportRecordItemNumber(m_pDataGroup->m_arrDataTable[i].m_dMw2-m_pDataGroup->m_arrDataTable[i].m_dMw1,KEY_FORMAT_NUMBER));
m_wndReportCtrl.AddRecord(pRecord);
7. 显示
m_wndReportCtrl.Populate();
8. 添加报表行焦点改变事件:
(1)在报表所在对话框的头文件中添加消息映射函数:
afx_msg void OnReportFocusChanging(NMHDR* pNMHDR, LRESULT* result);
(2)在报表所在对话框的源文件中将消息映射函数和报表控件联系起来,即在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间添加:
ON_NOTIFY(XTP_NM_REPORT_FOCUS_CHANGING, IDC_REPORTCTRL_LIST, OnReportFocusChanging)
(3)实现消息映射函数,如下:
//表中焦点行改变时的事件(包括用鼠标单击和用键盘的方向键)
void CWEReportDlg::OnReportFocusChanging(NMHDR * pNotifyStruct, LRESULT * /*result*/)
{
XTP_NM_REPORTRECORDITEM* pItemNotify = (XTP_NM_REPORTRECORDITEM*) pNotifyStruct;
if (!pItemNotify)        return;
CXTPReportRow* pRowSel=pItemNotify->pRow;
if (!pRowSel)        return;
TRACE(_T("Click on row %d\n"),pRowSel->GetIndex());
CXTPReportRecord* pRecordSel=pRowSel->GetRecord();
if(!pRecordSel) return;
CXTPReportRecordItemText* pText=(CXTPReportRecordItemText*)(pRecordSel->GetItem(0));
if(!pText) return;
if (pText->GetValue().Trim()==m_sTableNameNow)
{
return;//如果单击的行和上一次是同一行,就不用进行下面的操作
}
//更新当前记录和ATC
m_sTableNameNow=pText->GetValue().Trim();
if (m_sTableNameNow!="")
{
FindTableByName(m_sTableNameNow);
//更改选择的报表后,更新相应的已选框和待选框中的内容
UpdateReportTable();
}
}
发表于 2011-10-4 15:45:16 | 显示全部楼层
这种时候,通过读取内存来获取内容最方便,用ce5之类的内存软件查找数据在内存中的位置,注意,必须找到基址为止,不然软件下次启动后内存位置是不一样的,然后让au3读取对应数据的内存地址(基址+偏移)即可
 楼主| 发表于 2011-10-4 16:18:18 | 显示全部楼层
需要一个既懂xtreme toolkit pro,又精通AU3的高手,做个接口函数,我是这么理解的
 楼主| 发表于 2011-10-4 18:09:02 | 显示全部楼层
// XTPReportRecordItemProgress.cpp : implementation of the CXTPReportRecordItemProgress class.
//
// This file is a part of the XTREME REPORTCONTROL MFC class library.
// (c)1998-2008 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#include "XTPReportRecordItemProgress.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//////////////////////////////////////////////////////////////////////////
// CXTPReportRecordItemProgress

IMPLEMENT_SERIAL(CXTPReportRecordItemProgress, CXTPReportRecordItemText, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT)

CXTPReportRecordItemProgress::CXTPReportRecordItemProgress(LPCTSTR szText)
        : CXTPReportRecordItemText(szText)
{
        m_clrProgress = RGB(0, 0, 0);
        m_nProgressWidth = 1;
        m_nProgressLower = 0;
        m_nProgressUpper = 100;
        m_nProgressStep = 3;
        m_nProgressPos = 0;
}

CXTPReportRecordItemProgress::CXTPReportRecordItemProgress(LPCTSTR szText, COLORREF clrProgress, int nWidth, int nLower, int nUpper, int nStep, int nPos)
        : CXTPReportRecordItemText(szText)
{
        m_clrProgress = clrProgress;
        m_nProgressWidth = nWidth;
        m_nProgressLower = nLower;
        m_nProgressUpper = nUpper;
        m_nProgressStep = nStep;
        m_nProgressPos = nPos;
}

/*
void CXTPReportRecordItemText::DoPropExchange(CXTPPropExchange* pPX)
{
        CXTPReportRecordItem::DoPropExchange(pPX);

        PX_String(pPX, _T("Text"), m_strText, _T(""));
        PX_String(pPX, _T("Color"), m_clrProgress, _T(""));
        PX_String(pPX, _T("Width"), m_nProgressWidth, _T(""));
        PX_String(pPX, _T("Lower"), m_nProgressLower, _T(""));
        PX_String(pPX, _T("Upper"), m_nProgressUpper, _T(""));
        PX_String(pPX, _T("Step"), m_nProgressStep, _T(""));
        PX_String(pPX, _T("Position"), m_nProgressPos, _T(""));
}
*/
void CXTPReportRecordItemProgress::SetProgressColor(COLORREF clrProgress)
{
        m_clrProgress = clrProgress;
}

COLORREF CXTPReportRecordItemProgress::GetProgressColor()
{
        return m_clrProgress;
}

void CXTPReportRecordItemProgress::SetProgressWidth(int nWidth)
{
        m_nProgressWidth = nWidth;
}

int CXTPReportRecordItemProgress::GetProgressWidth()
{
        return m_nProgressWidth;
}

void CXTPReportRecordItemProgress::SetProgressRange(int nLower, int nUpper)
{
        m_nProgressLower = nLower;
        m_nProgressUpper = nUpper;
}

void CXTPReportRecordItemProgress::GetProgressRange(int& nLower, int& nUpper)
{
        nLower = m_nProgressLower;
        nUpper = m_nProgressUpper;
}

void CXTPReportRecordItemProgress::SetProgressStep(int nStep)
{
        m_nProgressStep = nStep;
}

int CXTPReportRecordItemProgress::GetProgressStep()
{
        return m_nProgressStep;
}

int CXTPReportRecordItemProgress::SetProgressPos(int nPos)
{
        int nPrevPos = m_nProgressPos;
        m_nProgressPos = nPos;
        m_nProgressPos = min(m_nProgressPos, m_nProgressUpper);
        m_nProgressPos = max(m_nProgressPos, m_nProgressLower);
        return nPrevPos;
}

int CXTPReportRecordItemProgress::GetProgressPos()
{
        return m_nProgressPos;
}

int CXTPReportRecordItemProgress::GetProgressPosPercent()
{
        return (m_nProgressPos - m_nProgressLower) * 100 / (m_nProgressUpper - m_nProgressLower);
}

int CXTPReportRecordItemProgress::OffsetProgressPos(int nOffset)
{
        int nPrevPos = m_nProgressPos;
        m_nProgressPos += nOffset;
        m_nProgressPos = min(m_nProgressPos, m_nProgressUpper);
        m_nProgressPos = max(m_nProgressPos, m_nProgressLower);
        return nPrevPos;
}

int CXTPReportRecordItemProgress::StepProgressPos()
{
        int nPrevPos = m_nProgressPos;
        m_nProgressPos += m_nProgressStep;
        m_nProgressPos = min(m_nProgressPos, m_nProgressUpper);
        m_nProgressPos = max(m_nProgressPos, m_nProgressLower);
        return nPrevPos;
}

void CXTPReportRecordItemProgress::OnDrawCaption(XTP_REPORTRECORDITEM_DRAWARGS* pDrawArgs, XTP_REPORTRECORDITEM_METRICS* pMetrics)
{
        if(!(pDrawArgs && pMetrics))
                return;
        // draw text
        CXTPReportRecordItemText::OnDrawCaption(pDrawArgs, pMetrics);
        // draw progress
        int nWidth = min(m_nProgressWidth, pDrawArgs->rcItem.Height());
        int nLength = pDrawArgs->rcItem.Width() * m_nProgressPos / (m_nProgressUpper - m_nProgressLower);
        pDrawArgs->pDC->FillSolidRect(pDrawArgs->rcItem.left, pDrawArgs->rcItem.top, nLength, nWidth, m_clrProgress);
}
 楼主| 发表于 2011-10-4 18:10:43 | 显示全部楼层
下了一个,这是自带的有关XTPReport的CPP
 楼主| 发表于 2011-10-9 17:58:06 | 显示全部楼层
高手在哪里?
好几天上不来了,耽误了
发表于 2011-10-9 19:38:04 | 显示全部楼层
这种时候,通过读取内存来获取内容最方便,用ce5之类的内存软件查找数据在内存中的位置,注意,必须找到基址 ...
飘云 发表于 2011-10-4 15:45



    这种办法最好,但一般人不会呀!有教程吗?
 楼主| 发表于 2011-10-9 22:02:16 | 显示全部楼层
看了半天ce弄游戏的,还是不会
 楼主| 发表于 2011-10-10 23:31:09 | 显示全部楼层
得来个高手弄个UDF才行
 楼主| 发表于 2011-10-12 22:54:39 | 显示全部楼层
努力学习中。。。。。。。。。。。。。。。。。。。。。
发表于 2011-10-13 04:52:48 | 显示全部楼层
想做雷凯模拟的外挂啊
 楼主| 发表于 2011-10-13 05:34:55 | 显示全部楼层
已经做好,缺权益监控,闭环少了最后一环
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-28 04:13 , Processed in 0.084954 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表