getdlgitem函数,知道一个窗口的ID,用什么函数得到它的句柄
getdlgitem函数,知道一个窗口的ID,用什么函数得到它的句柄详细介绍
本文目录一览: GetDlgItem的用法
CButton*
btn
=
(CButton*)GetDlgItem(IDC_BUTTON_SEND);
btn-SetWindowTextW(_T("hello"));如果想得到其他对话框中的控件,用GetDlgItem(hwnd,IDD);
CWnd::GetDlgItem(int
nID)
这个是一个类成员函数,可使用CWnd*
pWnd
=
GetDlgItem(ID_XXX);
而HWND
GetDlgItem(
HWND
hDlg,
//
handle
of
dialog
box
int
nIDDlgItem
//
identifier
of
control);
是一个sdk的函数
两个的主要区别是用的地方不一样
一个参数的是在窗口中调用的函数,两个参数的是在平台SDK中调用的
你在对话框类里面调用GetDlgItem(IDC_BOARD_SIZE),就是调用的类成员函数CWnd::GetDlgItem
获得某个控件的句柄GetDlgItem(IDC_BOARD_SIZE)-m_hWnd就可以了
如果要用到第二种用法,要这样
::GetDlgItem(this-
m_hWnd,IDC_BOARD_SIZE);效果一样的
那个IDC_BOARD_SIZE是你某个控件的id,
如果HWND
GetDlgItem(
HWND
hDlg,
//
handle
of
dialog
box
int
nIDDlgItem
//
identifier
of
control);的话,
第一个参数是窗体的句柄,第二个参数是某个控件的ID,和IDC_BOARD_SIZE是一个意思
GetDlgItem(IDC_..),GetDlgItem(HWND
hWnd,
GetDlgItem(IDC_..)是一个非静态方法,意思是你对话框内获取该控件指针,所以这里不需要获取对话框句柄,也就是说你如果在非对话框窗口里面调用这个方法就肯定会出错
GetDlgItem(HWND
hWnd,
IDC_..)是一个静态方法,它是一个让你指定从哪个对话框里获取控件指针
举个例子:你调用了上厕所这个函数,如果你在家里的话肯定是在自己家里上厕所,所以不需要知道在哪里上厕所(hwnd)
如果你在室外那么上厕所就一定要选一个地方(hwnd)。
如果说你上厕所的地方都不是一个房间,那么肯定会报错嘛,因为你在随地大小便,哈哈所以你先搞清楚这两个函数的使用环境区别
MFC 中GetDlgItem(ID)函数的问题!
“用哪个控件的指针指向GetDlgItem(IDC_LIST1)”
这个说法不准确。
GetDlgItem(IDC_LIST1)
这个函数获得的,是一个CWnd*
的窗口类指针,如果需要使用这个指针对控件进行操作,那么标准窗口操作(如:GetWindowText)是不需要强制类型转换的。如果操作是控件专有方法(如AddString),就要对指针进行强制转换,成为CListBox*
才能使用列表框类的专有方法(函数)。
m_tree是什么控件,标准clistctrl的话,没有四个参数的情况。主要是第一个参数没有是字符串的情况。
int
insertitem(
int
nitem,
lpctstr
lpszitem,
int
nimage
);
第一个参数是插入的第几项,从零开始,比如从第一项插入,此参数为零,最末一项则是
(nmaxcount
-
1).
第二个是插入项的文本显示。
第三项是该项对应的图标索引。应用此参数要先设置setimagelist来设置图标链表。
MFC的GetDlgItem怎么在外面调用到控件句柄??
在GetDlgItem函数前面加上双冒号试试看
HWND hwd = ::GetDlgItem(hwnd,IDC_ZHUATU)->m_hWnd 或者->GetSafeHwnd()
或
HWND hwd = pwnd->GetDlgItem(IDC_ZHUATU)->m_hWnd 或者->GetSafeHwnd()
GetDlgItem 函数定义如下:
CWnd* GetDlgItem ( intnID) const;
void CWnd::GetDlgItem( intnID, HWND*phWnd) const;
所以:
HWND hwd = GetDlgItem(hwnd,IDC_ZHUATU);
不正确,应该是HWND hwd = GetDlgItem(IDC_ZHUATU,hwnd);
GetDlgItem()--)EnableWindow()这两个函数的作用
功能是 是否禁用窗口,按钮也是一个窗口,按钮被禁用就是他变灰了,不再接受点击等输入操作了.
GetDlgItem(控件ID):返回该控件的指针
CWnd::EnableWindow(布尔值):True使控件可用,False则禁用控件。
知道一个窗口的ID,用什么函数得到它的句柄
::GetDlgItem(m_hWnd, nID);
GetDlgItem原形:
HWND (_stdcall *GetDlgItem)(HWND,int);
参数:
HWND 为窗口句柄
int 窗口句柄内的控件/子窗口 ID
返回值:
HWND 控件/子窗口 句柄
NULL 父窗口无效/ID无效,GetLastError()查询错误代码
::GetDlgItem(m_hWnd, nID);
::GetDlgItem(m_hWnd, nID);
GetDlgItem原形:
HWND (_stdcall *GetDlgItem)(HWND,int);
参数:
HWND 为窗口句柄
int 窗口句柄内的控件/子窗口 ID
返回值:
HWND 控件/子窗口 句柄
NULL 父窗口无效/ID无效,GetLastError()查询错误代码。
python pywin32 里面操作窗体,获取窗体里面的数据,在函数GetDlgItem函数中,怎么获取第二个参数的值?
1.如何利用句柄操作windows窗体
首先,获得窗体的句柄 win32api.FindWindows()
第二,获得窗体中控件的id号,spy++
第三,根据控件的ID获得控件的句柄(hwnd) GetDlgItem(hwnd,loginID)
最后,利用控件句柄进行操作
python可以通过win32api轻松获取控件的属性值
通过标签找到主窗口句柄,然后通过主句柄获取下属控件句柄
#-*- coding: utf-8 -*- ##设置编码方式
import win32api,win32gui,win32con
label = 'tt' #此处假设主窗口名为tt
hld = win32gui.FindWindow(None, label)
if hld > 0:
dlg = win32api.FindWindowEx(hld, None, 'Edit', None)#获取hld下第一个为edit控件的句柄
buffer = '0' *50
len = win32gui.SendMessage(dlg, win32con.WM_GETTEXTLENGTH)+1 #获取edit控件文本长度
win32gui.SendMessage(dlg, win32con.WM_GETTEXT, len, buffer) #读取文本
print buffer[:len-1]
#虚拟鼠标点击按钮(或者回车)
btnhld = win32api.FindWindowEx(hld, None,'Button', None)
# win32gui.PostMessage(btnhld, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
# win32gui.PostMessage(btnhld, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
win32gui.PostMessage(btnhld, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, 0)
win32gui.PostMessage(btnhld, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, 0)
#获取显示器屏幕大小
width = win32api.GetSystemMetrics(win32con.SM_CXSCREEN)
height = win32api.GetSystemMetrics(win32con.SM_CYSCREEN)
#点击窗口button
w=win32ui.FindWindow(clsname,windowtitle)
b=w.GetDlgItem(窗口id)
b.postMessage(win32con.BM_CLICK)
#关闭窗体
import win32ui
import win32con
wnd=win32ui.FindWindow(classname,None)
wnd.SendMessage(win32con.WM_CLOSE) 成功!
import win32ui
w=win32ui.FindWindow(classname,窗体title)
print w.GetDlgItemText(0xFFFF) # 获得弹窗里的消息文字
最小化窗体
w=win32gui.FindWindow()
win32gui.CloseWindow(w)
不知道你解决了没,最近正好研究python。
hwnd=win32gui.FindWindow()这个获取窗体句柄,大概都会用;
ctrl=win32gui.FindWindowEx(hwnd,None,'窗口类名',‘标题文本’)已知控件类名或控件名时获取控件句柄,这个标题文本不一定存在,所以使用None默认值获取的是该窗口类名中第一个顺位的控件句柄。
你使用b=win32gui.GetDlgItem(edit,资源ID)最终结果是获取的是句柄,这里的资源ID其实是spy++中的窗口ID,句柄是可变的,窗口ID是不可变的。这里似乎错了,你这样子大概获取的是控件中的子项(控件有子项的话,比如Combox中的edit框),我猜的,没试过。b=win32gui.GetDlgItem(hwnd,窗口ID)是已知ID下获取某控件句柄
如果你想获取某个控件的ID则ctrlid=win32gui.GetDlgCtrlID(ctrl)这是一只某控件句柄的情况下获取该控件在应用程序中的窗口ID。
如果不知控件句柄的情况下大概可以试试spy++获取窗口ID,把窗口ID(这个是16进制的)转化成10进制带进b=win32gui.GetDlgItem(hwnd,窗口ID)大概也可以得到控件句柄。
其实就是三个函数之间的转化
ctrl=win32gui.FindWindowEx(hwnd,None,'edit',None)控件句柄
ctrlid=win32gui.GetDlgCtrlID(ctrl)控件的窗口id
ctrl2=win32gui.GetDlgItem(hwnd,ctrlid)控件句柄
print "%x" %ctrllist
print "%x" %ctrlid
print "%x" %ctrl
输出,看一下数据与spy++是否一致。然后ctrl=ctrl2
mfc获取窗口句柄
在全局函数(即Windows
API)中,
GetDlgItem需要两个参数.
因为它不知道在哪个窗口(CWnd类下)中寻找控件.
但是,
在CWnd::GetDlgItem函数中,
它只需要一个参数.
第二个参数:
窗口句柄为该窗口本身.
照你的程序来看,ReadTime
是全局函数,所以要获取主窗口句柄应该:
h_d
=
AfxGetMainWnd()->GetSafeHwnd();
::SetWindowText(::GetDlgItem(h_d,
IDC_STATIC),
str);
顺便说一句,IDC_STATIC很多static
control都是用的这个ID,建议改一下。
这一句还是错的:GetDlgItem(IDC_STATIC)->SetWindowText(str);
因为全局函数GetDlgItem不仅需要两个参数,而且返回值是HWND,是不能调用的。
vc api 使用GetDlgItem() 时编译出错。
GetDlgItem(ID_MYBUT51) -> EnableWindow(FALSE);
这样写就可以了,不懂可以问我哦,愿交朋友
((CButton*)GetDlgItem(ID_MYBUT51))-> EnableWindow(FALSE);
MFC里面EnableWindow才可以那样调用,EnableWindow是CWnd的成员函数,而GetDlgItem 是 API不是MFC封装的函数,返回的是控件 HWND。
那很简单了,直接调用API
EnableWindow(GetDlgItem(hWnd,ID_MYBUT51),FALSE);
解析一下这句函数
* 是指针类型标志. 若指针变量pWnd的值不是0(即不是null)且它所指的成员值不是0就执行花括号的语句
CWnd* pWnd //是定义一个CWnd类型的指针。MFC里调用GetDlgItem函数,调用的是CWnd类的成员函数GetDlgItem,这个函数的返回值是对话框控件的窗口类,也就是它返回的是CWnd的指针。
if(pWnd && pWnd->GetSafeHwnd()) //意思是,如果pWnd不等于0,并且pWnd所指的CWnd对象中的窗口句柄也是有效的话,就执行下一步.
先打好C++的基础,再来学MFC吧。
error C2660: 'GetDlgItem' : function does not take 1 parameters错误怎么办?
大概你的问题已经解决了,不过我还是说一下,其实就是你代码放的位置出错了吧
我遇到的情况也是这样
后来我发现,
我创建控件的地方,和我放代码的地方不一样。
意思是说,不如我是在 一个窗口这个窗口对应的类是 cDlg下建立了 IDC_message 这个ID的控件,然后
我把
CEdit *messageCtrl = (CEdit*)GetDlgItem(IDC_message);
放在了另外一个类AboutDlg中。
那么它没办法自动关联
你尝试一下把代码放在另外一个 初始化函数 中。