Если пользователь прерывает работу или закрывает диалоговое окно Сохранить (Save) или происходит ошибка, возвращаемое значение - нуль

Если пользователь определяет имя файла и щелкает мышью по кнопке 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



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: