关于GetDlgItemInt

FateDier 2012-08-20 10:56:59
我用CreateWindowEx创建了一个窗口,然后在WM_CREATE消息中用CreateWindowEx创建了一个Edit控件。
现在用GetWindowText可以获取到这个Edit编辑框的文本。
但是用GetDlgItemText和GetDlgItemInt就无法获取,后者返回值一直是0,报错。是不是用CreateWindowEx创建的窗口只能用GetWindowText而不能用GetDlgItemText和GetDlgItemInt?
我现在想直接获取一个整数值,有什么可以用的API函数吗?不然就只能用GetWindowText获取再转换成整数了,不过这样要处理的错误情况比较多,不太方便。
...全文
260 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2012-08-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
CreateWindowEx() 用来创建子窗口时,其 hMenu/hCtrlId 参数即为子控件的 Id 。这一点对程序来说,当然是知道其 ID 的。上面 #5楼 那个示例中,1023 就是这个。
[/Quote]
哦。谢指教。
那应该是传的句柄错误了,是窗口句柄,不是控件句柄
invoke GetDlgItemInt,hwnd,ID_EDITH,NULL,FALSE
「已注销」 2012-08-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
CreateWindowEx() 用来创建子窗口时,其 hMenu/hCtrlId 参数即为子控件的 Id 。这一点对程序来说,当然是知道其 ID 的。上面 #5楼 那个示例中,1023 就是这个。
[/Quote]
哦。谢指教。
那应该是传的句柄错误了,是窗口句柄,不是控件句柄
invoke GetDlgItemInt,hwnd,ID_EDITH,NULL,FALSE
「已注销」 2012-08-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
CreateWindowEx() 用来创建子窗口时,其 hMenu/hCtrlId 参数即为子控件的 Id 。这一点对程序来说,当然是知道其 ID 的。上面 #5楼 那个示例中,1023 就是这个。
[/Quote]
哦。谢指教。
那应该是传的句柄错误了,是窗口句柄,不是控件句柄
invoke GetDlgItemInt,hwnd,ID_EDITH,NULL,FALSE
zara 2012-08-22
  • 打赏
  • 举报
回复
GetWindowText() 能得到文本,GetDlgItemText() 只要 hWnd 和 dCtrId 正确,就肯定也能得到文本,因为 GetDlgItemText() 就是先有这两参数通过 GetDlgItem() 得到子控件的窗口句柄,然后是 GetWindowText() 。
; 下面的是在 Masm32 的 generic 例子中添加了几个语句示意了下。添加的语句为 ;*** 打头
; 运行的话在窗口的左上角有个 EDIT 窗口,里面输入数字,关闭窗口的确认对话框的标题即为该 EDIT
; 中的内容
.386 ; minimum processor needed for 32 bit
.model flat, stdcall ; FLAT memory model & STDCALL calling
option casemap :none ; set code to case sensitive


include E:\masm32\include\windows.inc
include E:\masm32\include\user32.inc
include E:\masm32\include\kernel32.inc

includelib E:\masm32\lib\user32.lib
includelib E:\masm32\lib\kernel32.lib


szText MACRO Name, Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM

m2m MACRO M1, M2
push M2
pop M1
ENDM

return MACRO arg
mov eax, arg
ret
ENDM


WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
TopXY PROTO :DWORD,:DWORD


.data
szClassEdit db 'EDIT', 0
szFmt_d db '%d', 0
szDisplayName db "Generic",0
CommandLine dd 0
hWnd dd 0
hInstance dd 0
szBuf db 16 dup ( 0 )



.code

start:
invoke GetModuleHandle, NULL ; provides the instance handle
mov hInstance, eax

invoke GetCommandLine ; provides the command line address
mov CommandLine, eax

invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT

invoke ExitProcess,eax ; cleanup & return to operating system



WinMain proc hInst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD

;====================
; Put LOCALs on stack
;====================

LOCAL wc :WNDCLASSEX
LOCAL msg :MSG

LOCAL Wwd :DWORD
LOCAL Wht :DWORD
LOCAL Wtx :DWORD
LOCAL Wty :DWORD

szText szClassName,"Generic_Class"

;==================================================
; Fill WNDCLASSEX structure with required variables
;==================================================

mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW \
or CS_BYTEALIGNWINDOW
mov wc.lpfnWndProc, offset WndProc ; address of WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
m2m wc.hInstance, hInst ; instance handle
mov wc.hbrBackground, COLOR_BTNFACE+1 ; system color
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, offset szClassName ; window class name
invoke LoadIcon,hInst,500 ; icon ID ; resource icon
mov wc.hIcon, eax
invoke LoadCursor,NULL,IDC_ARROW ; system cursor
mov wc.hCursor, eax
mov wc.hIconSm, 0

invoke RegisterClassEx, ADDR wc ; register the window class

;================================
; Centre window at following size
;================================

mov Wwd, 500
mov Wht, 350

invoke GetSystemMetrics,SM_CXSCREEN ; get screen width in pixels
invoke TopXY,Wwd,eax
mov Wtx, eax

invoke GetSystemMetrics,SM_CYSCREEN ; get screen height in pixels
invoke TopXY,Wht,eax
mov Wty, eax

; ==================================
; Create the main application window
; ==================================
invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,
ADDR szClassName,
ADDR szDisplayName,
WS_OVERLAPPEDWINDOW,
Wtx,Wty,Wwd,Wht,
NULL,NULL,
hInst,NULL

mov hWnd,eax ; copy return value into handle DWORD

invoke LoadMenu,hInst,600 ; load resource menu
invoke SetMenu,hWnd,eax ; set it to main window

invoke ShowWindow,hWnd,SW_SHOWNORMAL ; display the window
invoke UpdateWindow,hWnd ; update the display

;===================================
; Loop until PostQuitMessage is sent
;===================================

StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0 ; get each message
cmp eax, 0 ; exit if GetMessage()
je ExitLoop ; returns zero
invoke TranslateMessage, ADDR msg ; translate it
invoke DispatchMessage, ADDR msg ; send it to message proc
jmp StartLoop
ExitLoop:

return msg.wParam

WinMain endp


WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD


.if uMsg == WM_COMMAND

.if wParam == 1000
invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL
.elseif wParam == 1900
szText TheMsg,"Assembler, Pure & Simple"
invoke MessageBox,hWin,ADDR TheMsg,ADDR szDisplayName,MB_OK
.endif

.elseif uMsg == WM_CREATE

;*** 下面是我增加的个语句,在主窗口的左上角建了个 EDIT 子窗口
invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr szClassEdit, NULL, ES_NUMBER or WS_CHILD or WS_VISIBLE, 4, 4, 64, 24, hWin, 1023, hInstance, NULL

.elseif uMsg == WM_CLOSE

szText TheText,"Please Confirm Exit"
;*** 获得 EDIT 子控件内的数值
invoke GetDlgItemInt, hWin, 1023, NULL, FALSE
;*** 将数值转换为字符串
invoke wsprintf, addr szBuf, addr szFmt_d, eax
;*** 数值显示在下面确认窗口的标题
invoke MessageBox,hWin,ADDR TheText,ADDR szBuf,MB_YESNO
.if eax == IDNO
return 0
.endif

.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
return 0
.endif

invoke DefWindowProc,hWin,uMsg,wParam,lParam

ret

WndProc endp


TopXY proc wDim:DWORD, sDim:DWORD


shr sDim, 1 ; divide screen dimension by 2
shr wDim, 1 ; divide window dimension by 2
mov eax, wDim ; copy window dimension into eax
sub sDim, eax ; sub half win dimension from half screen dimension

return sDim

TopXY endp

end start

zara 2012-08-22
  • 打赏
  • 举报
回复
CreateWindowEx() 用来创建子窗口时,其 hMenu/hCtrlId 参数即为子控件的 Id 。这一点对程序来说,当然是知道其 ID 的。上面 #5楼 那个示例中,1023 就是这个。
「已注销」 2012-08-22
  • 打赏
  • 举报
回复
HWND 跟 资源ID是不同的
GetDlgItemText和GetDlgItemInt 第二个是传资源的ID,你那个是用CreateWindowEx创建的控件,你怎么知道ID呢。这就是症结所在。
GetWindowText第一个参数是那个edit控件的hwnd当然可以取。
用这个也可以的 invoke SendMessage Edit控件hwnd, WM_GETTEXT, size, offset buffer

你用DialogBoxParam创建的窗口是使用资源的,资源段里面有指定哪个资源ID是多少,这个可以直接用GetDlgItemText和GetDlgItemInt取数据。

zara 2012-08-21
  • 打赏
  • 举报
回复
应该没有这样的问题吧,尤其是 GetDlgItemText() 不也无法获取?
总也返回 0 ,GetLastError() 有什么提示吗?这个函数出错,无非就是几个参数合法和合理的问题。源程序比较简单的话,贴上来看看?
FateDier 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

按照你的说法,贴这点儿代码是看不出问题来的。
我觉得在 GetDlgItemInt() 上设断点,在这里核实 HEditH 是否确实是对话框的窗口句柄、ID_EDITH 是否确实为对话框内那个控件的 ID,这些可以通过 vc 里的 Spy++ 程序来实现。或者,给 lpTranslated 参数个内容,其返回是 TRUE 还是 FALSE 。可能的错误也就这些了。
[/Quote]
hEditH和ID_EDITH应该是没有问题的,因为我用GetWindowText试过,可以获取到文本。至于lpTranslated这个参数,我设为NULL了,因为每次返回都是0,肯定是FALSE了。。。
或者能不能给个使用GetDlgItemInt这个API的例子,我看下是怎么使用的。
zara 2012-08-21
  • 打赏
  • 举报
回复
按照你的说法,贴这点儿代码是看不出问题来的。
我觉得在 GetDlgItemInt() 上设断点,在这里核实 HEditH 是否确实是对话框的窗口句柄、ID_EDITH 是否确实为对话框内那个控件的 ID,这些可以通过 vc 里的 Spy++ 程序来实现。或者,给 lpTranslated 参数个内容,其返回是 TRUE 还是 FALSE 。可能的错误也就这些了。
FateDier 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

应该没有这样的问题吧,尤其是 GetDlgItemText() 不也无法获取?
总也返回 0 ,GetLastError() 有什么提示吗?这个函数出错,无非就是几个参数合法和合理的问题。源程序比较简单的话,贴上来看看?
[/Quote]
源程序比较长就不贴了啊,关键的部分如下:

.elseif eax == WM_COMMAND ;处理按键消息
mov eax,wParam
.if ax == ID_SET ;设置按钮
invoke GetDlgItemInt,hEditH,ID_EDITH,NULL,FALSE
;这边返回的eax一直为0
.elseif ax == ID_STOP ;停止按钮

.endif

hEditH为编辑框控件句柄,ID_EDITH为控件ID
如果有错的话,这个函数的参数要如何设置呢?

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧