· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› DBLCLK

Посл.отвђт Сообщенiе


Дата: Апр 5, 2004 22:56:43

Привет всем, посмотрите пожалуйста на этот кусок программы.

;***************************************
mov eax,[Hwndlst]
cmp [lparam],eax
jne NOLIST

cmp word [esp+12h],LBN_DBLCLK
jne NOLIST

invoke SendMessage,[Hwndlst],LB_GETCURSEL,0,0
invoke SendMessage,[Hwndlst],LB_GETTEXT,eax,Buf
invoke MessageBox,[lparam],Buf,Cap1,0
;***************************************

Вот эти строки
cmp word [esp+12h],LBN_DBLCLK
jne NOLIST
должни по идее обрабатывать двойной клик,
ПЛЗ подскажите что я делаю не так

Заранее благодарен.
С Уважением i2k


Дата: Апр 6, 2004 03:59:06

_i2k_
Указанные строки скорее всего проверяют было ли LBN_DBLCLK.
Покажи, как определена оконная процедура - ты используешь lparam и тут же word [esp+12h].
Что за переменная Buf, в SendMessage передается ее адрес?


Дата: Апр 6, 2004 07:31:00 · Поправил: _i2k_

Привет q_q

Вот тебе листинг.
Вся вот это процедура :
invoke SendMessage,[Hwndlst],LB_GETCURSEL,0,0
invoke SendMessage,[Hwndlst],LB_GETTEXT,eax,Buf
invoke MessageBox,[lparam],Buf,Cap1,0
Короче она должна находить выделенный в данный момент
элемент, потом помещать его в Buf, после чего появляется
мессага, в которой написан выбранный элемент




;***************************************************
;Listing list.asm
format PE GUI 4.0
entry start

include '%include%\win32axp.inc'

section '.data' data readable writeable

NewHwnd dd 0
msg MSG
wc WNDCLASS
Hinst dd 0
Titlename db 'Primer',0
Classname db 'CLASS32',0
Cpbut db 'Exit',0
Cplst db '',0
CLSbut db 'BUTTON',0
CLSlst db 'LISTBOX',0
Hwndbtn dd 0
Hwndlst dd 0
Cap db 'Message',0
Cap1 db 'Select',0
Mes db 'End Work',0

str1 db 'Red',0
str2 db 'Green',0
str3 db 'Blue',0
str4 db 'Yellow',0
str5 db 'Black',0
str6 db 'White',0

PS dd str1
dd str2
dd str3
dd str4
dd str5
dd str6
Buf :times 30 db 0

section '.code' code readable executable
start:

invoke GetModuleHandle,0
mov [Hinst],eax

Reg_Class:
invoke LoadIcon,eax,17
mov [wc.hIcon],eax
invoke LoadCursor,0,IDC_ARROW
mov [wc.hCursor],eax
mov [wc.style],0
mov [wc.lpfnWndProc],WindowProc
mov [wc.cbClsExtra],0
mov [wc.cbWndExtra],0
mov eax,[Hinst]
mov [wc.hInstance],eax
mov [wc.hbrBackground],COLOR_WINDOW+1
mov [wc.lpszMenuName],0
mov [wc.lpszClassName],Classname
invoke RegisterClass,wc

invoke LoadMenu,[Hinst],37

invoke CreateWindowEx,0,Classname,Titlename,WS_VISIBLE+WS_OVERLAPPEDWINDOW,\


100,100,250,200,NULL,eax,[Hinst],NULL

mov [NewHwnd],eax

invoke ShowWindow,[NewHwnd],SW_SHOWNORMAL
invoke UpdateWindow,[NewHwnd]

msg_loop:
invoke GetMessage,msg,NULL,0,0
or eax,eax
jz end_loop
invoke TranslateMessage,msg
invoke DispatchMessage,msg

jmp msg_loop

end_loop:
invoke ExitProcess,[msg.wParam]

proc WindowProc, hwnd,wmsg,wparam,lparam
enter
push ebx esi edi
cmp [wmsg],WM_CREATE
je wmcreate
cmp [wmsg],WM_SIZE
je wmsize
cmp [wmsg],WM_SETFOCUS
je wmsetfocus
cmp [wmsg],WM_COMMAND
je wmcommand
cmp [wmsg],WM_DESTROY
je wmdestroy
defwndproc:
invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
jmp finish
wmcreate:
invoke CreateWindowEx,0,CLSbut,Cpbut,WS_CHILD+BS_DEFPUSHBUTTON+WS_VISIBLE+WS_ TABSTOP,\
10,10,60,20, dword [ebp+08h],0,[Hinst],NULL
mov [Hwndbtn],eax

invoke CreateWindowEx,0,CLSlst,Cplst,WS_THICKFRAME+LBS_NOTIFY\
+WS_CHILD+BS_DEFPUSHBUTTON+WS_VISIBLE+WS_TABSTOP+WS_VSCROLL+WS_BORDER, \
10,50,150,90, dword [ebp+08h],0,[Hinst],NULL
mov [Hwndlst],eax

invoke SendMessage,[Hwndlst],LB_ADDSTRING,0,[PS]
invoke SendMessage,[Hwndlst],LB_ADDSTRING,0,[PS+4]
invoke SendMessage,[Hwndlst],LB_ADDSTRING,0,[PS+8]
invoke SendMessage,[Hwndlst],LB_ADDSTRING,0,[PS+12]
invoke SendMessage,[Hwndlst],LB_ADDSTRING,0,[PS+16]
invoke SendMessage,[Hwndlst],LB_ADDSTRING,0,[PS+20]

jmp finish
failed:
or eax,-1
jmp finish
wmsize:
jmp finish
wmsetfocus:
invoke SetFocus,[NewHwnd]
xor eax,eax
jmp finish
wmcommand:
mov eax,[Hwndbtn]
cmp [lparam],eax
je wmdestroy

mov eax,[Hwndlst]
cmp [lparam],eax
jne NOLIST

cmp word [esp+12h],LBN_DBLCLK
jne NOLIST

invoke SendMessage,[Hwndlst],LB_GETCURSEL,0,0
invoke SendMessage,[Hwndlst],LB_GETTEXT,eax,Buf
invoke MessageBox,[lparam],Buf,Cap1,0

NOLIST:
mov eax,0
jmp finish
wmdestroy:
invoke PostQuitMessage,0
xor eax,eax
finish:
pop edi esi ebx
return


section '.idata' import data readable writeable

library kernel,'KERNEL32.DLL',\
user,'USER32.DLL'

import kernel,\
GetModuleHandle,'GetModuleHandleA',\
CreateFile,'CreateFileA',\
ReadFile,'ReadFile',\
WriteFile,'WriteFile',\
CloseHandle,'CloseHandle',\
VirtualAlloc,'VirtualAlloc',\
GetFileSize,'GetFileSize',\
ExitProcess,'ExitProcess'

import user,\
RegisterClass,'RegisterClassA',\
CreateWindowEx,'CreateWindowExA',\
DefWindowProc,'DefWindowProcA',\
SetWindowLong,'SetWindowLongA',\
RedrawWindow,'RedrawWindow',\
GetMessage,'GetMessageA',\
TranslateMessage,'TranslateMessage',\
DispatchMessage,'DispatchMessageA',\
SendMessage,'SendMessageA',\
LoadCursor,'LoadCursorA',\
LoadIcon,'LoadIconA',\
LoadMenu,'LoadMenuA',\
GetClientRect,'GetClientRect',\
MoveWindow,'MoveWindow',\
SetFocus,'SetFocus',\
MessageBox,'MessageBoxA',\
wvsprintf,'wvsprintfA',\
ShowWindow,'ShowWindow',\
UpdateWindow,'UpdateWindow',\
PostQuitMessage,'PostQuitMessage'
;***************************************************


Дата: Апр 6, 2004 09:21:36

_i2k_
Fasm'а у меня нет, поэтому проверить ответ не могу, однако использование cmp word [esp+12h],LBN_DBLCLK
противоречит
proc WindowProc, hwnd,wmsg,wparam,lparam 
enter 
push ebx esi edi 
...
замени на cmp word [wparam],LBN_DBLCLK или на cmp word [ebp+12h],LBN_DBLCLK, что вполне в духе dword [ebp+08h], используемом, вместо [hwnd] при создании дочерних окон.


Дата: Апр 6, 2004 18:09:18

esp + 12h точно не указывает на wParam, на него указывает esp + 18h, значит на верхнее слово wParam, где идентификатор сообщения будет указывать esp + 1Ah. И вообще, проще написать cmp word [wparam + 2], LBN_DBLCLK.


Дата: Апр 6, 2004 21:34:22

Короче, заменил я так(cmp word [wparam + 2], LBN_DBLCLK)
и так (cmp word [wparam],LBN_DBLCLK), и много еще как,
но ничего не получается, так что я не знаю.......


Дата: Апр 7, 2004 05:11:44

_i2k_
так что я не знаю
Вынудил меня тянуть fasm.

Условие: cmp word [wparam+2],LBN_DBLCLK + убери стиль BS_DEFPUSHBUTTON при создании listbox'а и будет тебе счастье.


Дата: Апр 8, 2004 21:12:02

Спасибо


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.084