Если пользователь определяет имя файла и щелкает мышью по кнопке OK, возвращаемое значение не нуль. Буфер, указанный в элементе lpstrFile структуры OPENFILENAME содержит полный путь и имя файла, определенного пользователем.
Чтобы получить дополнительную информацию об ошибке, можно вызвать функцию CommDlgExtendedError, которая может возвратить одно из ниже перечисленных значений:
CDERR_FINDRESFAILURE
CDERR_NOHINSTANCE
CDERR_INITIALIZATION
CDERR_NOHOOK
CDERR_LOCKRESFAILURE
CDERR_NOTEMPLATE
CDERR_LOADRESFAILURE
CDERR_STRUCTSIZE
CDERR_LOADSTRFAILURE
FNERR_BUFFERTOOSMALL
CDERR_MEMALLOCFAILURE
FNERR_INVALIDFILENAME
CDERR_MEMLOCKFAILURE
FNERR_SUBCLASSFAILURE
Выполнить самостоятельно на практике_1:
Cоздать окно с двумя статическими элементами и двумя окнами редактирования и кнопкой. В первое поле редактирования (элемент управления edit) вводится текст, затем заменяются во введенной строке все пробелы на дефис. После чего выводится результат в окно второго поля редактирования. Преобразование выполняется при нажатии на кнопку (элемент управления button). (прога не работает)
_________________________________________________
.386
|
|
.model flat, stdcall
WM_COMMAND equ 111h
WM_DESTROY equ 2
WM_CREATE equ 1
WM_PAINT equ 0Fh
WM_LBUTTONDOWN equ 201h
CS_VREDRAW equ 1h
CS_HREDRAW equ 2h
CS_GLOBALCLASS equ 4000h
WS_OVERLAPPEDWINDOW equ 000CF0000H
style equ CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
IDI_APPLICATION equ 32512
IDC_ARROW equ 32512
SW_SHOWNORMAL equ 1
WHITE_BRUSH equ 0
CW_USEDEFAULT equ 80000000h
WS_EX_CLIENTEDGE equ 200h
WS_CHILD equ 40000000h
WS_BORDER equ 800000h
WS_VISIBLE equ 10000000h
ES_LEFT equ 0h
ES_HSCROLL equ 100000h
BS_DEFPUSHBUTTON equ 1h
ButtonID equ 1
EditID1 equ 1
EditID2 equ 2
LabelID1 equ 4
LabelID2 equ 5
BN_CLICKED equ 0h
extrn MessageBoxA:PROC
extrn CreateWindowExA:PROC
extrn DefWindowProcA:PROC
extrn DispatchMessageA:PROC
extrn ExitProcess:PROC
extrn GetMessageA:PROC
extrn GetModuleHandleA:PROC
extrn GetStockObject:PROC
extrn LoadCursorA:PROC
extrn LoadIconA:PROC
extrn LoadImageA:PROC
extrn PostQuitMessage:PROC
extrn RegisterClassA:PROC
extrn SelectObject:PROC
extrn ShowWindow:PROC
extrn TranslateMessage:PROC
extrn UpdateWindow:PROC
extrn SetFocus:PROC
extrn SetWindowTextA:PROC
extrn GetWindowTextA:PROC
MSGSTRUCT STRUC
MSHWND DD?; идентификатор окна, получающего сообщение
MSMESSAGE DD?; идентификатор сообщения
MSWPARAM DD?; доп. информация о сообщении
MSLPARAM DD?; доп. информация о сообщении
MSTIME DD?; время посылки сообщения
MSPT DD?; положение курсора, во время посылки сообщения
MSGSTRUCT ENDS
WNDCLASS STRUC
clsStyle DD?; стиль окна
clsLpfnWndProc DD?; указатель на процедуру окна
clsCbClsExtra DD?; информация о доп. байтах для данной структуры
clsCbWndExtra DD?; информация о доп. байтах для окна
clsHInstance DD?; дескриптор приложения
clsHIcon DD?; идентификатор иконы окна
clsHCursor DD?; идентификатор курсора окна
clsHbrBackground DD?; идентификатор кисти окна
clsLpszMenuName DD?; имя-идентификатор меню
clsLpszClassName DD?; специфицирует имя класса окон
WNDCLASS ENDS
BITMAP struct
bmType dd?
bmWidth dd?
bmHeight dd?
bmWidthBytes dd?
bmPlanes dw?
bmBitsPixel dw?
bmBits dd?
BITMAP ends
PAINTSTRUCT STRUC
hdc DWORD 0
fErase DWORD 0
left DWORD 0
top DWORD 0
right DWORD 0
bottom DWORD 0
fRes DWORD 0
fIncUp DWORD 0
Reserv DB 32 dup(0)
PAINTSTRUCT ENDS
RECT STRUC
L DWORD?
T DWORD?
R DWORD?
B DWORD?
RECT ENDS
LR_LOADFROMFILE = 010h
|
|
SRCCOPY = 00CC0020h
IMAGE_BITMAP = 0
.data
newhwnd dd 0
MSG MSGSTRUCT <?>
wc WNDCLASS <?>
CAP DB 'Сообщение',0
MES1 DB 'Вы нажали левую кнопку мыши',0
AppName db ' ',0
CommandLine dd 0
hDC dd?
hCompatibleDC dd?
Ps PAINTSTRUCT <?>
hBitmap dd?
hOldBitmap dd?
Rect RECT <?>
Bitmap BITMAP <?>
hInstance dd 0
szTitleName db 'DCDemo', 0
szClassName db 'ASMCLASS32',0
szImg db 'IMG2.bmp',0
ButtonClassName db 'BUTTON',0
ButtonText db 'Preobrazovat',0
hwndButton dd 0
LabelClassName db 'STATIC',0
LabelText1 db ' Isxodniu text',0
LabelText2 db ' Preobrazovanniu text',0
hwndLabel1 dd 0
hwndLabel2 dd 0
EditClassName db 'edit',0
hwndEdit1 dd 0
hwndEdit2 dd 0
bytesWritten dd 0
buffer db 512 dup(?)
.code
;-----------------------------------------------------------------------------
start:
call GetModuleHandleA,0
mov [hInstance],eax
; initialize the WndClass structure
mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW
mov [wc.clsLpfnWndProc], offset DCDemoWndProc
mov [wc.clsCbClsExtra], 0
mov [wc.clsCbWndExtra], 0
mov eax, [hInstance]
mov [wc.clsHInstance], eax
call LoadIconA, 0, IDI_APPLICATION
mov [wc.clsHIcon], eax
call LoadCursorA, 0,IDC_ARROW
mov [wc.clsHCursor], eax
call GetStockObject, WHITE_BRUSH
mov [wc.clsHbrBackground], eax
mov [wc.clsLpszMenuName], 0
mov [wc.clsLpszClassName], offset szClassName
call RegisterClassA, offset wc
call CreateWindowExA, 0,offset szClassName,offset szTitleName, \
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, \
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,0,0, \
[hInstance], 0
mov [newhwnd],eax
call ShowWindow, [newhwnd], SW_SHOWNORMAL
call UpdateWindow, [newhwnd]
msg_loop:
PUSH 0
PUSH 0
PUSH 0
PUSH OFFSET MSG
CALL GetMessageA
CMP EAX, 0
JE END_LOOP
PUSH OFFSET MSG
CALL TranslateMessage
PUSH OFFSET MSG
CALL DispatchMessageA
JMP msg_loop
END_LOOP:
; выход из программы (закрыть процесс)
PUSH [MSG.MSWPARAM]
CALL ExitProcess
;-----------------------------------------------------------------------------
DCDemoWndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD,\
wparam:DWORD, lparam:DWORD
cmp [wmsg], WM_DESTROY
je wmdestroy
cmp [wmsg], WM_CREATE
je wmcreate
call DefWindowProcA, [hwnd],[wmsg],[wparam],[lparam]
jmp finish
wmcreate:
call CreateWindowExA, WS_EX_CLIENTEDGE, offset LabelClassName,0, \
WS_CHILD,200,35,220,25,hwnd,LabelID2, \
[hInstance], 0
mov [hwndLabel1],eax
call CreateWindowExA, WS_EX_CLIENTEDGE,offset LabelClassName,0, \
WS_CHILD,20,35,170,25,hwnd,LabelID1, [hInstance], 0
mov [hwndLabel2],eax
call CreateWindowExA, WS_EX_CLIENTEDGE,offset EditClassName,0, \
WS_CHILD,20,65,170,25,hwnd,EditID1, [hInstance],0
mov [hwndEdit1],eax
call CreateWindowExA, WS_EX_CLIENTEDGE,offset EditClassName,0, \
WS_CHILD,200,65,220,25,hwnd,EditID2, [hInstance], 0
mov [hwndEdit2],eax
call CreateWindowExA,0,offset ButtonClassName,offset ButtonText, \
[hInstance],0
mov [hwndButton],eax
call ShowWindow, [hwnd], SW_SHOWNORMAL
call SetFocus,[hwndEdit1]
call SetWindowTextA,[hwndLabel1],offset LabelText1
call SetWindowTextA,[hwndLabel2],offset LabelText2
ret
next_1:
CMP [wmsg],WM_COMMAND
jne next_2
mov EAX,wparam
cmp lparam,0
je ex_wmcom
cmp AX,ButtonID
jne ex_wmcom
shr EAX,16
cmp AX,BN_CLICKED
jne ex_wmcom
call GetWindowTextA,[hwndEdit1], offset buffer,512
mov [bytesWritten],EAX
call ReplaceSpace
call SetWindowTextA,[hwndEdit2],offset buffer
ex_wmcom:
ret
next_2:
cmp [wmsg],WM_DESTROY
jne next_3
push 0
call PostQuitMessage
mov eax, 0
ret
next_3:
PUSH [lparam]
PUSH [wparam]
PUSH [wmsg]
PUSH [hwnd]
CALL DefWindowProcA
jmp finish
wmdestroy:
push 0
call PostQuitMessage
mov eax, 0
finish:
POP EDI
POP ESI
POP EBX
POP EBP
RET 16
DCDemoWndProc endp
ReplaceSpace proc
lea EDI,buffer
mov ECX,bytesWritten
cld
mov AL,20h
next_ch:
scasb
je repSpace
cont:
loop next_ch
ret
repSpace:
mov byte ptr [EDI-1],'-'
jmp cont
ReplaceSpace endp
end start
ends