通过控件ID获取控件变量(无论是哪种变量)是不可能实现的。
控件变量和控件窗口(包括指针、句柄、ID)之间,是“弱”关联关系,没有真正的实现整合,它们之间的关联,是通过DoDataExchange实现的,具体过程是这样:
对话框界面的初始化和界面变化,都会调用UpdateData函数,而这个函数之中,会调用DoDataExchange,从每个对话框的成员函数DoDataExchange中,我们可以看到,在这里才实现了控件和变量的关联,类似形式如下:
DDX_Control(pDX, IDC_BUTTON2, m_bn2);DDX_Radio(pDX, IDC_RADIO1, m_radio);
这个关联是通过一系列API函数DDX_实现的,那么这里做了什么呢?可以在MFC源代码中看一看具体实现:
void AFXAPI DDX_Text(CDataExchange pDX, int nIDC, LPTSTR value, int nMaxLen){
ASSERT(nMaxLen != 0);
HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);
if (pDX->m_bSaveAndValidate)
{
int nLen = ::GetWindowTextLength(hWndCtrl);
int nRetrieved = ::GetWindowText(hWndCtrl, value, nMaxLen);
if (nLen > nRetrieved)
TRACE1("Text in control ID %d is too long Call DDV_MaxChars()!\n", nIDC);
}
else
{
AfxSetWindowText(hWndCtrl, value);
}
}
从这里可以看到,变量和控件窗口直接,没有直接关联关系,完全是通过一个函数进行的赋值和取值 *** 作,因此,无法通过控件ID或者指针获取其变量。
如楼上所说 如果 这个控件的句柄hWnd, 用GetWindowText
char szBuf[1000];
GetWindowText( hWnd, szBuf, 1000);
如果 有这个控件的ID 但是没有控件的句柄
先用GetDlgItem (传入窗口句柄和控件ID)得到控件的句柄 ,然后再去调 GetWindowText
还有一个方法
GetDlgItemText 传入窗口句柄和控件ID
多看看msdn吧
1设置位置可以使用setWindowPos
但是并没有函数GetWindowPos获取位置
2可以通过一下方法获得
相关函数
GetClientRect(); //获得client区域
GetWindowRect(); //获取window区域
ScreenToClient(); //相互转换
ClientToScreen();
3由于GetClientRect()获得的区域不包括位置,得到的rect的left,top必然为0
而GetWindowRect();获得的区域包括位置,但会发现获得值不准确,应该是加上了窗体边界。
4正确方法:
CRect rt;
GetWindowRect(&rt); //获得window区域
ScreenToClient(&rt); //转到client
你要想获得Repeater里服务器控件(runat="server")的值 必须先知道Repeater里服务器控件ID的命名方式 如果你的页面里的数据只是只读数据可以采用“pwroselove”提供的方法 去掉runat="server" 自己为控件的ID命名 如果你需要和后台交互 就可以用下面的方法
首先Repeater里服务器控件ID的命名方式是 RepeaterClientID_ctl行号_控件名 行号是从00开始的两位数00 01 02 如 Repeater1_ctl00_lblBegin 表示Repeater里第一行lblBegin的ID 给你写个例子你就明白了 代码如下
<%@ Page Language="C#" %>
<%@ Import Namespace="SystemData" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 10 Transitional//EN" ">
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
using (DataTable dataTable = new DataTable())
{
dataTableColumnsAddRange(new DataColumn[] { new DataColumn("Begin"), new DataColumn("Deadline") });
dataTableRowsAdd(new object[] { "123", "A" });
dataTableRowsAdd(new object[] { "234", "B" });
dataTableRowsAdd(new object[] { "345", "C" });
Repeater1DataSource = dataTable;
Repeater1DataBind();
}
}
</script>
<html xmlns=">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<input id="lblBegin" runat="server" value='<%# Eval("Begin")%>' type="text" />
<input id="lblDeadline" runat="server" value='<%# Eval("Deadline")%>' type="text" />
<br />
<br />
</ItemTemplate>
</asp:Repeater>
</div>
<script type="text/javascript">
var repeaterId = '<%=Repeater1ClientID %>';//Repeater的客户端ID
var rows = <%=Repeater1ItemsCount%>;//Repeater的行数
for (var i = 0; i < rows; i++) {
alert(documentgetElementById(repeaterId + "_ctl" + getrownumber(i) + "_lblBegin")value);
alert(documentgetElementById(repeaterId + "_ctl" + getrownumber(i) + "_lblDeadline")value);
}
function getrownumber(i) {
if (i > 10) {
return i;
}
else {
return '0' + i;
}
}
</script>
</form>
</body>
</html>
在制作eclipse插件的时候,时常需要对已经存在的视图做一些扩展,例如在project explorer中增加一个右键菜单,或者需要获取outline中当前选中项,等等。而这些 *** 作的前提,是获取这些视图的id,然后通过获取视图的语句获取到视图,并进行下一步 *** 作。
例如:如果是在view中:
IViewPartpart=getViewSite()getPage()findView("orgeclipseuiviewsContentOutline");
如果是在action中:
IViewPartpart=PlugingetDefault()getWorkbench()getActiveWorkbenchWindow()getActivePage()findView("orgeclipseuiviewsContentOutline");
可见获取到视图的id是很重要的。如何获取id呢,有很多方法,我觉得比较常用的是以下两种:
1通过手动查找目标视图所在的插件的pluginxml中对改视图的定义,获得视图id。
描述:我觉得这是最保险的办法,因为所有的视图都必定有一个pluginxml定义,但是找到这个pluginxml还是需要一些 *** 作,可能会耗费一些时间。
步骤:
a点击“工具栏”->“Search”->“Search”,或者热键“ctrl+h”。选“ Plugin Search”。
bSearch for 选"Extention Point",Limit to 选“references”,External Scope 选“Enabled Plug-ins only”。
c下面的scope选“Worksapaces”。
d上面的Search String框填入我们要搜索的插件的扩展点的名字,这里我们要找视图插件,所以填入:orgeclipseuiviews
e点击search以后,在底部Search视图内列出很多搜索结果,任意选中一个,双击,可以看到editor内打开了该pluginxml,选中编辑器底部的Extentions,用图形化的方式来查看会更快捷。
f可以看到该插件使用的扩展点已经以列表的形式列出,我们查找的orgeclipseuiviews扩展点也已经选中,展开选中的扩展点,可以看到它实现了哪些view,点击某一个,可以在页面右边看到该视图的详细信息,第一项即是视图的id。
我们无法知道目标视图在搜索结果中的哪个plugin中,所以可能会耗费一些时间,建议在查看搜索结果时,通过对视图的分类分析,确定一个大概范围再进行查看。
同时,用这种方法也可以查找其他扩展点的实现插件。
2通过代码直接读出该视图的id。
描述:通过这种方法,可以直接用鼠标点击某个你想知道的视图,控制台会打印出该视图的id和所属插件的id。
步骤:
a通过插件向导新建一个插件,并使用Available Templates中的Plugin with a view模板,点finish。
b对自动创建的SampleView代码进行修改,修改结果如下。其中主要步骤有三个:实现IPartListener2接口,编写isActivePart()方法,调用isActivePart()方法。
packagecomraullearnsampleviewviews;
importorgeclipseswtwidgetsComposite;
importorgeclipseuipart;
importorgeclipsejfaceviewers;
importorgeclipseswtgraphicsImage;
importorgeclipsejfaceaction;
importorgeclipsejfacedialogsMessageDialog;
importorgeclipseui;
importorgeclipseswtwidgetsMenu;
importorgeclipseswtSWT;
importcomraullearnsampleviewActivator;
/
Thissampleclassdemonstrateshowtoplug-inanew
workbenchviewTheviewshowsdataobtainedfromthe
modelThesamplecreatesadummymodelonthefly,
butarealimplementationwouldconnecttothemodel
availableeitherinthisoranotherplug-in(egtheworkspace)
Theviewisconnectedtothemodelusingacontentprovider
<p>
Theviewusesalabelprovidertodefinehowmodel
objectsshouldbepresentedintheviewEach
viewcanpresentthesamemodelobjectsusing
differentlabelsandicons,ifneededAlternatively,
asinglelabelprovidercanbesharedbetweenviews
inordertoensurethatobjectsofthesametypeare
presentedinthesamewayeverywhere
<p>
/
publicclassSampleViewextendsViewPartimplementsIPartListener2{
privateTableViewerviewer;
privateActionaction1;
privateActionaction2;
privateActiondoubleClickAction;
/
Thecontentproviderclassisresponsiblefor
providingobjectstotheviewItcanwrap
existingobjectsinadaptersorsimplyreturn
objectsas-isTheseobjectsmaybesensitive
tothecurrentinputoftheview,orignore
itandalwaysshowthesamecontent
(likeTaskList,forexample)
/
classViewContentProviderimplementsIStructuredContentProvider{
publicvoidinputChanged(Viewerv,ObjectoldInput,ObjectnewInput){
}
publicvoiddispose(){
}
publicObject[]getElements(Objectparent){
returnnewString[]{"One","Two","Three"};
}
}
classViewLabelProviderextendsLabelProviderimplementsITableLabelProvider{
publicStringgetColumnText(Objectobj,intindex){
returngetText(obj);
}
publicImagegetColumnImage(Objectobj,intindex){
returngetImage(obj);
}
publicImagegetImage(Objectobj){
returnPlatformUIgetWorkbench()
getSharedImages()getImage(ISharedImagesIMG_OBJ_ELEMENT);
}
}
classNameSorterextendsViewerSorter{
}
/
Theconstructor
/
publicSampleView(){
ActivatorgetDefault()getWorkbench()getActiveWorkbenchWindow()
getActivePage()addPartListener(this);
}
@Override
publicvoiddispose(){
//TODOAuto-generatedmethodstub
ActivatorgetDefault()getWorkbench()getActiveWorkbenchWindow()
getActivePage()removePartListener(this);
superdispose();
}
/
Thisisacallbackthatwillallowus
tocreatetheviewerandinitializeit
/
publicvoidcreatePartControl(Compositeparent){
viewer=newTableViewer(parent,SWTMULTI|SWTH_SCROLL|SWTV_SCROLL);
viewersetContentProvider(newViewContentProvider());
viewersetLabelProvider(newViewLabelProvider());
viewersetSorter(newNameSorter());
viewersetInput(getViewSite());
makeActions();
hookContextMenu();
hookDoubleClickAction();
contributeToActionBars();
}
privatevoidhookContextMenu(){
MenuManagermenuMgr=newMenuManager("#PopupMenu");
menuMgrsetRemoveAllWhenShown(true);
menuMgraddMenuListener(newIMenuListener(){
publicvoidmenuAboutToShow(IMenuManagermanager){
SampleViewthisfillContextMenu(manager);
}
});
Menumenu=menuMgrcreateContextMenu(viewergetControl());
viewergetControl()setMenu(menu);
getSite()registerContextMenu(menuMgr,viewer);
}
privatevoidcontributeToActionBars(){
IActionBarsbars=getViewSite()getActionBars();
fillLocalPullDown(barsgetMenuManager());
fillLocalToolBar(barsgetToolBarManager());
}
privatevoidfillLocalPullDown(IMenuManagermanager){
manageradd(action1);
manageradd(newSeparator());
manageradd(action2);
}
privatevoidfillContextMenu(IMenuManagermanager){
manageradd(action1);
manageradd(action2);
//Otherplug-inscancontributethereactionshere
manageradd(newSeparator(IWorkbenchActionConstantsMB_ADDITIONS));
}
privatevoidfillLocalToolBar(IToolBarManagermanager){
manageradd(action1);
manageradd(action2);
}
@Override
publicvoidpartBroughtToTop(IWorkbenchPartReferencepartRef){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidpartClosed(IWorkbenchPartReferencepartRef){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidpartDeactivated(IWorkbenchPartReferencepartRef){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidpartHidden(IWorkbenchPartReferencepartRef){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidpartInputChanged(IWorkbenchPartReferencepartRef){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidpartOpened(IWorkbenchPartReferencepartRef){
//TODOAuto-generatedmethodstub
}
privatevoidisActivePart(){
IWorkbenchPartpart=getViewSite()getPage()getActivePart();
//returnpart!=null&&partequals(this);
Systemoutprintln(partgetSite()getId());
partgetSite()getPluginId();
}
}
然后调插件,在运行环境中调出该视图,接着当你用鼠标点击你想知道的视图时,在开发环境中的控制台,就会打印出该视图的id以及所属插件的id。
以上就是关于VC++ 怎么通过控件的ID 获得对应的变量名全部的内容,包括:VC++ 怎么通过控件的ID 获得对应的变量名、win32(非MFC) 怎么获取在文本编辑框所输入的字符串、MFC怎么获取控件地址等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)