1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Сказки дядюшки Римуса

Тема в разделе "WASM.ARTICLES", создана пользователем Mikl___, 19 дек 2016.

Метки:
  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.993
    Код (ASM):
    1. include win64a.inc
    2. HINST_COMMCTRL   equ -1
    3. ID_MENU        equ 600
    4. ID_EXIT        equ 15
    5. ID_ABOUT     equ 16
    6. STD_CUT         equ 0
    7. STD_COPY        equ 1
    8. STD_PASTE       equ 2
    9. STD_UNDO        equ 3
    10. STD_REDOW       equ 4
    11. STD_DELETE      equ 5
    12. STD_FILENEW     equ 6
    13. STD_FILEOPEN    equ 7
    14. STD_FILESAVE    equ 8
    15. STD_PRINTPRE    equ 9
    16. STD_PROPERTIES  equ 10
    17. STD_HELP        equ 11
    18. STD_FIND        equ 12
    19. STD_REPLACE     equ 13
    20. STD_PRINT       equ 14
    21. TB_AUTOSIZE     equ WM_USER + 33
    22. TB_ADDBUTTONS   equ WM_USER + 20
    23. TB_ADDBITMAP    equ WM_USER + 19
    24. TBADDBITMAP STRUCT
    25.   hInst          QWORD      ?
    26.   nID            QWORD      ?
    27. TBADDBITMAP ENDS
    28. .code
    29. WinMain proc
    30. local msg:MSG
    31.  
    32.     xor ebx,ebx
    33.     mov esi,IMAGE_BASE
    34.     mov edi,offset wTitle
    35.         mov eax,10027h
    36.  
    37. ; registering the window class |
    38.  
    39.         push rax    ;hIconSm
    40.     push rdi    ;lpszClassName
    41.     push ID_MENU    ;lpszMenuName
    42.     push COLOR_BTNFACE+1;hbrBackground
    43.     push 10005h    ;hCursor
    44.     push rax         ;hIcon
    45.     push rsi    ;hInstance
    46.     push rbx        ;cbClsExtra & cbWndExtra
    47.     db 68h
    48.     dd WndProc ;lpfnWndProc
    49.     push sizeof WNDCLASSEX;cbSize & style
    50.     invoke RegisterClassEx,esp
    51.  
    52. ; creating the main window
    53.  
    54.     push rbx
    55.     push rsi
    56.     shl esi,9
    57.         push rbx
    58.     push rbx
    59.     push rsi
    60.     push rsi
    61.     push rsi
    62.     push rsi
    63.     sub rsp,20h
    64.     invoke CreateWindowEx,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    65.     lea edi,msg
    66.  
    67. ; entering the message loop
    68.  
    69. message_loop: invoke GetMessage,edi,0,0,0
    70.     invoke DispatchMessage,edi
    71.     jmp message_loop
    72. WinMain endp
    73.  
    74. ; the window procedure
    75.  
    76. WndProc proc hwnd:qword,uMsg:qword,wParam:qword,lParam:qword
    77. local caW:qword
    78. local caH:qword
    79. local Rct:RECT
    80. local tbb:TBBUTTON
    81. local Tba:TBADDBITMAP
    82. local Paint:PAINTSTRUCT
    83.  
    84.     mov hwnd,rcx
    85.     mov wParam,r8
    86.     mov lParam,r9
    87.  
    88.     cmp edx,WM_CREATE
    89.     je wmCREATE
    90.     cmp edx,WM_DESTROY
    91.     je wmDESTROY
    92.     cmp edx,WM_SIZE
    93.     je wmSIZE
    94.     cmp edx,WM_PAINT
    95.     je wmPAINT
    96.     cmp edx,WM_CLOSE
    97.     je wmCLOSE
    98.     cmp edx,WM_COMMAND
    99.     jne default1
    100. wmCOMMAND: mov rdi,wParam
    101.     cmp edi,14
    102.     ja @f
    103.     invoke SendMessage,hStatus,SB_SETTEXT,0,[handler+rdi*8]
    104.     invoke MessageBox,hwnd,[handler+rdi*8],&aYou,MB_OK
    105.     jmp default1
    106. @@:    cmp edi,15
    107.     jnz @f
    108.     invoke SendMessage,hwnd,WM_SYSCOMMAND,SC_CLOSE,0
    109.     jmp default1
    110. @@:    invoke MessageBox,hwnd,&aAssembler,&wTitle,MB_OK
    111.     jmp default1
    112. wmDESTROY: invoke ExitProcess,0;завершение программы
    113. wmCLOSE: invoke MessageBox,hwnd,&aPlease,&wTitle,MB_YESNO
    114.     cmp eax,IDNO; 7
    115.     jnz wmDESTROY
    116. end_wm_check: leave
    117.     xor eax,eax
    118.     retn
    119. wmPAINT:lea edx,Paint
    120.     invoke BeginPaint
    121.     invoke Paint_Proc,rax,hwnd
    122.     lea edx,Paint
    123.     invoke EndPaint,hwnd       ;Освобождаем контекст отображения
    124.     jmp end_wm_check
    125. wmCREATE:lea edi,tbb
    126.     mov tbb.iBitmap,ebx;0
    127.     mov tbb.idCommand,ebx;0
    128.     mov tbb.fsState,bl;0
    129.     mov tbb.fsStyle,bl;0
    130.     mov tbb.dwData,ebx;0
    131.     mov tbb.iString,ebx;0
    132.     mov word ptr tbb.fsState,TBSTATE_ENABLED + 256*TBSTYLE_SEP;or WS_CLIPSIBLINGS
    133.     invoke CreateToolbarEx,,WS_CHILD  or WS_VISIBLE,\
    134.         300,1,ebx,ebx,edi,1,10h,10h,ebx,ebx,sizeof(TBBUTTON)
    135.     mov hToolBar,rax
    136.  
    137.     or Tba.hInst,HINST_COMMCTRL; 0FFFFFFFFh
    138.     mov Tba.nID,1; btnsize 1=big 2=small
    139.     invoke SendMessage,rax,TB_ADDBITMAP,1,&Tba
    140.  
    141.     mov tbb.fsStyle,bl;TBSTYLE_BUTTON=0
    142.     or tbb.idCommand,-1
    143.     or ebx,15
    144. @@:    mov rax,[handler1+rbx*8-8]
    145.     mov tbb.iBitmap,eax
    146.     inc tbb.idCommand
    147.     invoke SendMessage,hToolBar,TB_ADDBUTTONS,1,edi
    148.     dec ebx
    149.     jnz @b
    150.  
    151. ; Create the status bar
    152.     invoke CreateStatusWindow,WS_CHILD or WS_VISIBLE or SBS_SIZEGRIP,\
    153.     ebx,hwnd,200
    154.     mov hStatus,rax
    155.     jmp default1
    156. wmSIZE: invoke SendMessage,hToolBar,TB_AUTOSIZE,0,0
    157.     mov rax,caW
    158.     mov dword ptr lParam,eax
    159.     mov caH,rax
    160.     mov eax,dword ptr lParam+2
    161.     lea edx,Rct
    162.     invoke GetWindowRect,hStatus
    163.     mov eax,Rct.bottom
    164.     sub eax,Rct.top
    165.     sub caH,rax
    166.     invoke MoveWindow,hStatus,ebx,caH,caW,caH,TRUE
    167. ;все сообщения, не обрабатываемые в функции
    168. ;WndProc, направляются на обработку по умолчанию
    169. default1: leave
    170.     jmp DefWindowProc
    171.  
    172. WndProc endp
    173.  
    174. Paint_Proc proc hWin:QWORD, hDC:QWORD
    175. local Rct:RECT
    176. local caW:dword
    177. local caH:dword
    178. local tbH:dword
    179. local sbH:dword
    180.  
    181.     mov hWin,rcx
    182.     mov hDC,rdx
    183.  
    184.     lea edi,Rct
    185.     invoke GetClientRect,hWin,edi
    186.     mov eax,Rct.right
    187.     mov caW,eax
    188.     mov eax,Rct.bottom
    189.     mov caH,eax
    190.     invoke GetWindowRect,hToolBar,edi
    191.     mov eax,Rct.bottom
    192.     sub eax,Rct.top
    193.     mov tbH,eax
    194.     invoke GetWindowRect,hStatus,edi
    195.     mov eax,Rct.bottom
    196.     sub eax,Rct.top
    197.     mov sbH,eax
    198.     sub caH,eax
    199.     mov Rct.left,0
    200.     mov eax,tbH
    201.     mov Rct.top,eax
    202.     mov eax,caW
    203.     mov Rct.right,eax
    204.     mov eax,caH
    205.     mov Rct.bottom,eax
    206.     invoke DrawEdge,hDC,edi,EDGE_SUNKEN,BF_RECT
    207.     leave
    208.     retn
    209. Paint_Proc endp
    210.  
    211. aPlease db "Please Confirm Exit",0
    212. aNewFile db 'New File',0
    213. aOpenFile db 'Open File',0
    214. aSaveFile db 'Save File',0
    215. aRedow      db 'Redow',0
    216. aDelete     db 'Delete',0
    217. aCut     db 'Cut',0
    218. aCopy     db 'Copy',0
    219. aPaste      db 'Paste',0
    220. aUndo     db 'Undo',0
    221. aSearch     db 'Search',0
    222. aReplace db 'Replace',0
    223. aPrint      db 'Print',0
    224. aPreview db 'Previw',0
    225. aProperties db 'Properties',0
    226. aHelp     db 'Help',0
    227. aAbout    db "О программе",0
    228. aAssembler db "Assembler, Pure & Simple",0
    229. aYou db "You have selected",0
    230. handler dq aNewFile,aOpenFile,aSaveFile,aRedow
    231.     dq aDelete,aCut,aCopy,aPaste,aUndo
    232.     dq aSearch,aReplace,aPrint,aPreview
    233.     dq aProperties,aHelp
    234. handler1 dq STD_HELP,STD_PROPERTIES,STD_PRINTPRE,STD_PRINT,STD_REPLACE,STD_FIND
    235. dq STD_UNDO,STD_PASTE,STD_COPY,STD_CUT,STD_DELETE,STD_REDOW,STD_FILESAVE
    236. dq STD_FILEOPEN,STD_FILENEW
    237. wTitle db 'Iczelion Tutorial #8k: инструментальная панель в MASM64',0
    238. hStatus       dq ?
    239. hToolBar      dq ?
    240. end
    © Mikl___ 2017

    Глава двадцать вторая. Братец Кролик подключает стандартные диалоги к инструментальной панели

    [​IMG]

    [​IMG]

    Теория ― мать склероза

    Подключаем к инструментальной панели модальные диалоги «Открыть файл», «Сохранить как...», «Выбор параметров страницы», «Печать» и немодальные диалоги «Поиск» и «Замена».

    Диалоговые окошки поиска и замены текста

    Функции FindText и ReplaceText используют структуру типа FINDREPLACE. Так как окна диалога являются немодальными, поэтому в случае их вывода на экран придется изменять главный цикл обработки сообщений, чтобы вызвать функцию IsDialogMessage. Структура FINDREPLACE передаваемая функциям FindText и ReplaceText должна быть задана как статическая переменная, а так как окна диалога являются немодальными, то функции должны заканчивать свою работу уже после того, как окна диалога выведены на экран, а не после того как они будут закрыты. И несмотря на это, необходимо продолжать обеспечивать возможность доступа к структуре из процедуры окна диалога.
    До тех пор пока ока диалога остаются на экране функции FindText и ReplaceText взаимодействуют с окном владельцем посредством специального сообщения. Номер этого сообщения может быть получен с помощью вызова функции RegisterWindowMessage с параметром FINDMSGSTRING. Это делается при обработке сообщения WM_CREATE, полученный номер сохраняется в статической переменной hSearch.
    При обработке очередного сообщения, номер сообщения сравнивается со значением в hSearch. Параметр lParam такого сообщения ― это указатель на структуру FINDREPLACE поле Flags которого показывает, использовал ли пользователь окно для поиска/замены или пользователь закрыл окно.

    Чтобы использовать диалоги «Поиск» или «Замена» необходимо проделать следующие операции:
    1. Получить идентификатор для зарегистрированного сообщения FINDMSGSTRING
    2. Отобразить диалоговое окошко
    3. Обработать сообщение FINDMSGSTRING когда диалог откроется
    При инициализации приложения регистрируем и получаем идентификатор сообщения FINDMSGSTRING при помощи функции RegisterWindowMessage в дескриптор hSearch.
    Перед отображением диалога «Поиска/Замены текста» заполняем структуру FINDREPLACE, а затем вызываем функцию FindText или ReplaceText. Структура FINDREPLACE и буфер для строки поиска объявлены глобально, чтобы они не вышли за пределы видимости, до того, как диалоговое окошко будет закрыто. Для указания, какое окно будет получать зарегистрированные сообщения, необходимо присвоить его дескриптор переменной hwndOwner.
    Чтобы диалоговое окно «Поиск/Замена текста» обрабатывало сообщения от клавиатуры ― в главный цикл сообщений включен вызов функции IsDialogMessage, которой в качестве параметра передается дескриптор диалога hSearch.

    Практика ― сестра шизофрении

     

    Вложения:

    • tut_08l.png
      tut_08l.png
      Размер файла:
      84,6 КБ
      Просмотров:
      1.118
    • 03.png
      03.png
      Размер файла:
      131,5 КБ
      Просмотров:
      1.067
    Последнее редактирование: 7 май 2019
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.993
    Код (ASM):
    1. include win64a.inc
    2. HINST_COMMCTRL   equ -1
    3. ID_MENU        equ 600
    4. ID_EXIT        equ 6
    5. ID_ABOUT     equ 7
    6. TB_AUTOSIZE     equ WM_USER + 33
    7. TB_ADDBUTTONS   equ WM_USER + 20
    8. TB_ADDBITMAP    equ WM_USER + 19
    9. TBADDBITMAP STRUCT
    10.   hInst          QWORD      ?
    11.   nID            QWORD      ?
    12. TBADDBITMAP ENDS
    13. PAGESETUPDLG STRUCT       ;(sizeof=0x78, align=0x8, standard type)
    14.   lStructSize          DWORD ?,?
    15.   hwndOwner          QWORD ?
    16.   hDevMode          QWORD ?
    17.   hDevNames          QWORD ?
    18.   Flags           DWORD ?
    19.   ptPaperSize          POINT <>
    20.   rtMinMargin          RECT <>
    21.   rtMargin          RECT <>
    22.               DWORD ?
    23.   hInstance          QWORD ?
    24.   lCustData          DWORD ?,?
    25.   lpfnPageSetupHook      QWORD ?
    26.   lpfnPagePaintHook      QWORD ?
    27.   lpPageSetupTemplateName QWORD ?
    28.   hPageSetupTemplate      QWORD ?
    29. PAGESETUPDLG ENDS
    30. PRINTDLG STRUCT
    31.   lStructSize          DWORD ?,?
    32.   hwndOwner          QWORD ?
    33.   hDevMode          QWORD ?
    34.   hDevNames          QWORD ?
    35.   hDC              QWORD ?  
    36.   Flags           DWORD ?
    37.   nFromPage          WORD ?  
    38.   nToPage          WORD ?  
    39.   nMinPage          WORD ?  
    40.   nMaxPage          WORD ?  
    41.   nCopies          WORD ?,?
    42.   hInstance          QWORD ?
    43.   lCustData          QWORD ?
    44.   lpfnPrintHook       QWORD ?
    45.   lpfnSetupHook       QWORD ?
    46.   lpPrintTemplateName QWORD ?
    47.   lpSetupTemplateName QWORD ?
    48.   hPrintTemplate      QWORD ?
    49.   hSetupTemplate      QWORD ?
    50. PRINTDLG ENDS
    51. FINDREPLACE STRUCT
    52.   lStructSize       DWORD      ?,?
    53.   hwndOwner         QWORD      ?
    54.   hInstance         QWORD      ?
    55.   Flags             DWORD      ?,?
    56.   lpstrFindWhat     QWORD      ?
    57.   lpstrReplaceWith  QWORD      ?
    58.   wFindWhatLen       WORD      ?
    59.   wReplaceWithLen    WORD      ?
    60.   lCustData         DWORD      ?
    61.   lpfnHook          QWORD      ?
    62.   lpTemplateName    QWORD      ?,?
    63. FINDREPLACE ENDS
    64. .code
    65. WinMain proc
    66. local msg:MSG
    67.  
    68.         xor ebx,ebx
    69.         mov esi,IMAGE_BASE
    70.         mov edi,offset wTitle
    71.         mov eax,10027h
    72. ;------------------------------+
    73. ; registering the window class |
    74. ;------------------------------+
    75.         push rax        ;hIconSm
    76.         push rdi        ;lpszClassName
    77.         push ID_MENU    ;lpszMenuName
    78.         push COLOR_BTNFACE+1;hbrBackground
    79.         push 10005h     ;hCursor
    80.         push rax        ;hIcon
    81.         push rsi        ;hInstance
    82.         push rbx        ;cbClsExtra & cbWndExtra
    83.         pushaddr WndProc;lpfnWndProc
    84.         push sizeof WNDCLASSEX;cbSize & style
    85.         invoke RegisterClassEx,esp  
    86. ;--------------------------+
    87. ; creating the main window |
    88. ;--------------------------+
    89.         push rbx
    90.         push rsi
    91.         shl esi,9
    92.         push rbx
    93.         push rbx
    94.         push rsi
    95.         push rsi
    96.         push rsi
    97.         push rsi
    98.         sub rsp,20h
    99.         invoke CreateWindowEx,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    100. ;---------------------------+
    101. ; entering the message loop |
    102. ;---------------------------+
    103.         lea edi,msg
    104. @@: invoke GetMessage,edi,0,0,0
    105.     invoke IsDialogMessage,hSearch,edi
    106.     or eax,eax
    107.     jnz @b
    108.         invoke DispatchMessage,edi
    109.         jmp @b
    110. WinMain endp
    111. ;----------------------+
    112. ; the window procedure |
    113. ;----------------------+
    114. WndProc proc hwnd:qword,uMsg:qword,wParam:qword,lParam:qword
    115. local caW:qword
    116. local caH:qword
    117. local Rct:RECT
    118. local tbb:TBBUTTON
    119. local Tba:TBADDBITMAP
    120. local Paint:PAINTSTRUCT
    121. local ofn:OPENFILENAME
    122. local tbH:dword;<-- align 8 for FINDREPLACE, PRINTDLG, PAGESETUPDLG
    123. local fr:FINDREPLACE
    124. local pd:PRINTDLG
    125. local psd:PAGESETUPDLG
    126. local sbH:dword
    127. local hDC:qword
    128.    
    129.         mov hwnd,rcx
    130.         mov wParam,r8
    131.         mov lParam,r9
    132.         xor ebx,ebx
    133.  
    134.         cmp edx,WM_CREATE
    135.         je wmCREATE
    136.         cmp edx,WM_DESTROY
    137.         je wmDESTROY
    138.         cmp edx,WM_SIZE
    139.         je wmSIZE
    140.         cmp edx,WM_PAINT
    141.         je wmPAINT
    142.         cmp edx,WM_CLOSE
    143.         je wmCLOSE
    144.         cmp edx,WM_COMMAND
    145.         jne default
    146. wmCOMMAND: mov rdi,wParam
    147.         invoke SendMessage,hStatus,SB_SETTEXT,0,[handlers+rdi*8]
    148.         xor eax,eax
    149.         jmp [handler+rdi*8]
    150. wmCLOSE::mov edx,offset aPlease
    151.         mov r8d,offset wTitle
    152.         invoke MessageBox,,,,MB_YESNO
    153.         cmp eax,IDNO
    154.         jz end_wm_check
    155. wmDESTROY:: invoke ExitProcess,0;завершение программы
    156. wmPAINT:lea edx,Paint
    157.         invoke BeginPaint
    158.         mov hDC,rax
    159.         lea edi,Rct
    160.         invoke GetClientRect,hwnd,edi
    161.         mov eax,Rct.right
    162.         mov caW,rax
    163.         mov eax,Rct.bottom
    164.         mov caH,rax
    165.         invoke GetWindowRect,hToolBar,edi
    166.         mov eax,Rct.bottom
    167.         sub eax,Rct.top
    168.         mov tbH,eax
    169.         invoke GetWindowRect,hStatus,edi
    170.         mov eax,Rct.bottom
    171.         sub eax,Rct.top
    172.         mov sbH,eax
    173.         sub caH,rax
    174.         mov Rct.left,ebx;0
    175.         mov eax,tbH
    176.         mov Rct.top,eax
    177.         mov rax,caW
    178.         mov Rct.right,eax
    179.         mov rax,caH
    180.         mov Rct.bottom,eax
    181.         invoke DrawEdge,hDC,edi,EDGE_SUNKEN,BF_RECT
    182.         lea edx,Paint
    183.         invoke EndPaint,hwnd;Освобождаем контекст отображения
    184. end_wm_check: leave
    185.         xor eax,eax
    186.         retn
    187. wmCREATE:lea edi,tbb
    188.         mov tbb.iBitmap,ebx;0
    189.         mov tbb.idCommand,ebx;0
    190.         mov tbb.fsState,bl;0
    191.         mov tbb.fsStyle,bl;0
    192.         mov tbb.dwData,ebx;0
    193.         mov tbb.iString,ebx
    194.         mov word ptr tbb.fsState,TBSTATE_ENABLED + 256*TBSTYLE_SEP;or WS_CLIPSIBLINGS
    195.         invoke CreateToolbarEx,,WS_CHILD  or WS_VISIBLE or WS_CLIPSIBLINGS,\
    196.         300,1,ebx,ebx,edi,1,10h,10h,ebx,ebx,sizeof(TBBUTTON)
    197.         mov hToolBar,rax
    198.  
    199.         or Tba.hInst,HINST_COMMCTRL; 0FFFFFFFFh
    200.         mov Tba.nID,1; btnsize 1=big 2=small
    201.         invoke SendMessage,rax,TB_ADDBITMAP,1,&Tba
    202.  
    203.         mov tbb.fsStyle,bl;TBSTYLE_BUTTON=0
    204.         or tbb.idCommand,-1
    205.         or ebx,6
    206. @@:     mov rax,handler1[rbx*8-8]
    207.         mov tbb.iBitmap,eax
    208.         inc tbb.idCommand
    209.         invoke SendMessage,hToolBar,TB_ADDBUTTONS,1,edi
    210.         dec ebx
    211.         jnz @b
    212. ; Create the status bar
    213.         invoke CreateStatusWindow,WS_CHILD or WS_VISIBLE or SBS_SIZEGRIP,\
    214.         0,hwnd,200
    215.         mov hStatus,rax
    216.     mov ecx,offset FINDMSGSTRING
    217.         invoke RegisterWindowMessage
    218.     mov hSearch,rax
    219.         jmp default
    220. wmSIZE: invoke SendMessage,hToolBar,TB_AUTOSIZE,0,0
    221.         mov rax,caW
    222.         mov dword ptr lParam,eax
    223.         mov caH,rax
    224.         mov eax,dword ptr lParam+2
    225.         lea edx,Rct
    226.         invoke GetWindowRect,hStatus
    227.         mov eax,Rct.bottom
    228.         sub eax,Rct.top
    229.         sub caH,rax
    230.         invoke MoveWindow,hStatus,0,caH,caW,caH,TRUE
    231.         jmp    default
    232. SaveFile::
    233. _OpenFile::push rdi
    234.         mov ecx,(sizeof OPENFILENAME)/8
    235.         lea edi,ofn
    236.         rep stosq;обнулили структуру OPENFILENAME
    237.         pop rdi
    238. ;заполняем "ненулевые" поля OPENFILENAME
    239.         mov ofn.lStructSize,size OPENFILENAME
    240.         mov rax,hwnd
    241.         mov ofn.hwndOwner,rax
    242.         mov eax,OFFSET szFile
    243.         mov ofn.lpstrFile,rax
    244.         mov ofn.nMaxFile,SIZEOF szFile
    245.         mov eax,OFFSET strFilter
    246.         mov ofn.lpstrFilter,rax
    247.         mov ofn.nFilterIndex,1
    248.         mov ofn.Flags,OFN_PATHMUSTEXIST
    249.         lea ecx,ofn
    250.         or edi,edi; rdi = ID open_file ?
    251.         jnz @f
    252.         invoke GetOpenFileName
    253.         jmp default
    254. @@:     invoke GetSaveFileName
    255.         jmp default
    256. Replace::
    257. Search::push rdi
    258.         mov ecx,(sizeof FINDREPLACE)/8
    259.         lea edi,fr
    260.         rep stosq;обнулили структуру FINDREPLACE
    261.         pop rdi
    262. ;заполняем "ненулевые" поля FINDREPLACE
    263.         mov fr.lStructSize,SIZEOF fr
    264.         mov rax,hwnd
    265.         mov fr.hwndOwner,rax
    266.         mov eax,OFFSET szFindWhat
    267.         mov fr.lpstrFindWhat,rax
    268.         mov fr.wFindWhatLen,80
    269.         lea ecx,fr
    270.         cmp edi,5; edi = ID Replace ?
    271.         jnz @f
    272.         mov eax,OFFSET szReplaceWith
    273.         mov fr.lpstrReplaceWith,rax
    274.         mov fr.wReplaceWithLen,80
    275.         mov fr.Flags,FR_WHOLEWORD
    276.         invoke ReplaceText
    277.     xor eax,eax
    278.         jmp default
    279. @@:     mov fr.Flags,FR_DOWN or FR_WHOLEWORD
    280.         invoke FindText
    281.     xor eax,eax
    282.         jmp default
    283. Properties::lea edi,psd
    284.         mov ecx,sizeof(PAGESETUPDLG)/8
    285.         rep stosq;обнулили структуру PAGESETUPDLG
    286. ;заполняем "ненулевые" поля PAGESETUPDLG
    287.         mov psd.lStructSize,sizeof(PAGESETUPDLG)
    288.         mov rax,hwnd
    289.         mov psd.hwndOwner,rax
    290.         lea ecx,psd
    291.         invoke PageSetupDlg
    292.         jmp default
    293. Print:: mov ecx,(sizeof PRINTDLG)/8
    294.         lea edi,pd
    295.         rep stosq  ;обнулили структуру PRINTDLG
    296. ;заполняем "ненулевые" поля PRINTDLG
    297.         mov pd.lStructSize,sizeof PRINTDLG
    298.         mov rax,hwnd
    299.         mov pd.hwndOwner,rax
    300.         mov pd.Flags,PD_ALLPAGES
    301.         mov pd.nCopies,1
    302.         mov pd.nFromPage,1
    303.         mov pd.nToPage,1
    304.         mov pd.nMinPage,1
    305.         mov pd.nMaxPage,2
    306.         lea ecx,pd
    307.         invoke PrintDlg
    308.         jmp default
    309. About:: invoke ShellAbout,hwnd,&wTitle,&aAssembler,10027h
    310. ;все сообщения, не обрабатываемые в функции
    311. ;WndProc, направляются на обработку по умолчанию
    312. default:leave
    313.         jmp DefWindowProc
    314. WndProc endp
    315. ;--------------------------------------------
    316. aPlease     db "Please Confirm Exit",0
    317. aReplace        db 'Replace',0    
    318. aOpenFile       db 'Open File',0  
    319. aSaveFile       db 'Save File',0
    320. aSearch         db 'Search',0        
    321. aProperties     db 'Properties',0
    322. aPrint          db 'Print',0
    323. aAbout          db 'О программе',0
    324. aAssembler      db "Assembler, Pure & Simple",0
    325. aYou            db "You have selected",0
    326. handlers        dq aOpenFile,aSaveFile,aPrint,aProperties
    327.             dq aSearch,aReplace,0,aAbout
    328. handler         dq _OpenFile,SaveFile,Print,Properties
    329.             dq Search,Replace,wmDESTROY,About
    330. szFile          db "*.*",256 dup (0)    
    331. strFilter       db "All Files",0
    332. handler1        dq STD_REPLACE,STD_FIND,STD_PROPERTIES
    333.             dq STD_PRINT,STD_FILESAVE,STD_FILEOPEN
    334. wTitle          db 'Iczelion Tutorial #8l: инструментальная панель в MASM64',0
    335. hStatus         dq ?
    336. hToolBar        dq ?
    337. szFindWhat      db "Masm is",73 dup (0)
    338. szReplaceWith   db "Great !",73 dup (0)
    339. hSearch     dq ?
    340. FINDMSGSTRING   db "commdlg_FindReplace",0
    341. end
    © Mikl___ 2016
     
    Последнее редактирование: 23 янв 2017
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.993

    Глава двадцать третья. Пример использования диалога «Открыть файл»

    [​IMG]
    Предопределенные диалоговые окна находятся в comdlg32.dll. Эти диалоговые окна создаются вызовом соответствующих функций. Для диалога «Открыть файл» существует функция GetOpenFileName, для сохранения ― GetSaveFileName, функция вызывающая диалог для работы с принтером ― PrintDlg и так далее. Каждая из этих функций в качестве параметра получает указатель на соответствующую структуру. В этой главе демонстрируется инициализация и использование диалога «Открыть файл».
    Прототип функции GetOpenFileName.
    Код (C):
    1.  BOOL WINAPI GetOpenFileName(
    2.   _Inout_ LPOPENFILENAME lpofn
    3. );
    Функция в качестве единственного параметра получает указатель на структуру OPENFILENAME. Если функция вернула TRUE значит пользователь выбрал файл, если функция вернула FALSE значит пользователь нажал на «Отменить» или закрыл диалог. Рассмотрим структуру OPENFILENAME:
    Код (ASM):
    1. OPENFILENAME STRUC
    2.   lStructSize DWORD ?,?
    3.   hwndOwner QWORD ?
    4.   hInstance QWORD ?
    5.   lpstrFilter QWORD ?
    6.   lpstrCustomFilter QWORD ?
    7.   nMaxCustFilter DWORD ?
    8.   nFilterIndex DWORD ?
    9.   lpstrFile QWORD ?
    10.   nMaxFile DWORD ?,?
    11.   lpstrFileTitle QWORD ?
    12.   nMaxFileTitle DWORD ?,?
    13.   lpstrInitialDir QWORD ?
    14.   lpstrTitle QWORD ?
    15.   Flags DWORD ?
    16.   nFileOffset WORD ?
    17.   nFileExtension WORD ?
    18.   lpstrDefExt QWORD ?
    19.   lCustData DWORD ?,?
    20.   lpfnHook QWORD ?
    21.   lpTemplateName QWORD ?
    22. OPENFILENAME ENDS
    Значения часто используемых параметров.
    lStructSizeразмер структуры OPENFILENAME в байтах.
    hwndOwnerдескриптор файлового диалогового окна.
    hInstanceдескриптор процесса, который создает файловое диалоговое окно.
    lрstrFilterСтрока-фильтр состоит из парных строк, разделенных null'ом. Первая строка в каждой паре ― это описание. Вторая строка ― это шаблон фильтра. Например: FilterString db "All Files (*.*)",0, "*.*",0 db "Text Files (*.txt)",0,"*.txt",0,0 Отметьте, что шаблон во второй строке каждой пары действительно используется для фильтрации файлов. Также отметьте, что вам нужно добавить дополнительный 0 в конце фильтровых строк, чтобы указать конец.
    Определите, какая пара фильтровых строк будет использоваться при первом отображении файлового диалогового окна. Индекс основывается на единице, то есть первая пара ― 1, вторая ― 2 и так далее. Поэтому в вышеприведенном экземпляре, если мы укажем nFilterIndex как 2, будет использован второй шаблон ― "*.txt".
    lpstrFileУказатель на буфер, который содержит имя файла, используемого для инициализации edit control'а имени файла на диалоговом окне. Буфер должен быть длиной по крайней мере 260 байтов.
    После того, как пользователь выберет файл для открытия, имя файла с полным путем будет сохранено в этом буфере. Вы можете извлечь информацию из него позже.
    nMaxFileразмер буфера.
    lpstrTitleУказатель на заголовок открытого файлового диалогового окна.
    FlagsОпределите стили и характеристики диалогового окна.
    nFileOffsetПосле того, как пользователь выбрал файл для открытия, этот параметр содержит индекс первого символа собственно названия файла. Например, если полное имя с путем "c:\windows\system\lz32.dll", то этот параметр будет содержать значение 18.
    nFileExtensionПосле того, как пользователь выберет файл для открытия, этот параметр содержит индекс первого символа расширения файла.

    Практика ― сестра шизофрении

    Скачайте пример здесь.
    Нижеприведенная программа отображает диалог «Открыть файл», когда пользователь выбирает пункт «File»«Open» в меню. Когда пользователь выберет файл в диалоговом окне, программа отобразит сообщение, содержащее полное имя, имя файла и расширение выбранного файла.
    Код (ASM):
    1. include win64a.inc
    2. IMAGE_BASE equ 400000h
    3. ZZZ_OPEN   equ  0
    4. ZZZ_EXIT   equ  1
    5. MAXSIZE         equ 256
    6. OUTPUTSIZE equ 512
    7. IDR_MAINMENU equ 30
    8. .code
    9. WinMain proc
    10. local msg:MSG
    11.  
    12.        xor ebx,ebx
    13.        mov edi,offset ClassName
    14.        mov esi,IMAGE_BASE
    15.        mov eax,10029h
    16.        push rax ;hIconSm
    17.        push rdi ;lpszClassName
    18.        push IDR_MAINMENU;lpszMenuName
    19.        push COLOR_WINDOW;hbrBackground
    20.        push 10005h ;hCursor
    21.        push rax        ;hIcon
    22.        push rsi ;hInstance
    23.        push rbx        ;cbClsExtra & cbWndExtra
    24.        db 68h
    25.        dd WndProc;lpfnWndProc
    26.        push sizeof WNDCLASSEX;cbSize & style
    27.        invoke RegisterClassEx,esp ;addr WNDCLASSEX
    28.        push rbx
    29.        push rsi ;rsi=400000h
    30.        shl esi,9 ;rsi=CW_USEDEFAULT
    31.        push rbx
    32.        push rbx
    33.        push rsi
    34.        push rsi
    35.        push rsi
    36.        push rsi
    37.        mov r9d,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    38.        sub esp,20h
    39.        invoke CreateWindowEx,WS_EX_CLIENTEDGE,edi,edi
    40.        lea edi,msg
    41. @@:invoke GetMessage,edi,0,0,0
    42.         invoke DispatchMessage,edi
    43.         jmp @b
    44. WinMain endp
    45. WndProc proc hWnd:HWND, uMsg, wParam, lParam
    46. local dlgOpenBuffer [MAXSIZE]:BYTE
    47. strMsgSize     equ  512
    48. local strMsg [strMsgSize]:BYTE
    49.  
    50.        mov esi,offset dlgOpenOfn
    51.        mov hWnd,rcx
    52.        cmp  edx,WM_DESTROY
    53.        je   wmDESTROY
    54.        cmp  edx,WM_COMMAND
    55.        je   wmCOMMAND
    56.        cmp  edx,WM_CREATE
    57.        je   wmCREATE
    58.        leave
    59.        jmp DefWindowProc
    60. wmDESTROY:invoke DestroyWindow
    61.         invoke ExitProcess,0
    62. wmCOMMAND:cmp r8d,ZZZ_OPEN
    63.         jnz wmDESTROY
    64.        invoke GetOpenFileName,esi;offset dlgOpenOfn.lStructSize
    65.        or eax,eax
    66.        jz wmBYE
    67.        mov ecx,OUTPUTSIZE
    68.        lea rdi,strMsg
    69.        mov esi,offset FullPathName
    70.        call StringOut1
    71.        mov rsi,dlgOpenOfn.lpstrFile
    72.        call StringOut1
    73.        mov esi,offset FullName
    74.        call StringOut1
    75.        movzx rsi,dlgOpenOfn.nFileOffset
    76.        add rsi,dlgOpenOfn.lpstrFile
    77.        call StringOut1
    78.        mov esi,offset ExtensionName
    79.        call StringOut1
    80.        movzx rsi,dlgOpenOfn.nFileExtension
    81.        add rsi,dlgOpenOfn.lpstrFile
    82.        call StringOut1
    83.        mov [rdi],bl
    84.        mov r8d,offset ClassName
    85.        lea edx,strMsg
    86.        invoke MessageBox,hWnd,,,MB_OK
    87.        jmp wmBYE
    88. wmCREATE:lea eax,dlgOpenBuffer
    89.        mov [rsi+OPENFILENAME.lpstrFile],rax
    90. wmBYE:  leave
    91.        retn
    92. WndProc endp
    93. StringOut1 proc
    94. @@: movsb
    95.        cmp [rsi],bl
    96.        loopnz @b
    97.        retn
    98. StringOut1 endp
    99. ;---------------------------------------
    100. ClassName db 'Win64 Iczelion''s lesson #11: More about Dialog Box',0
    101. dlgOpenTitle db 'Open File',0
    102. dlgOpenOfn     OPENFILENAME <<sizeof OPENFILENAME>,,IMAGE_BASE,\
    103. FilterString,,,,,MAXSIZE>
    104. FilterString  db 'All Files (*.*)',0,'*.*',0
    105.      db 'Text Files (*.txt)',0,'*.txt',0,0
    106. FullPathName  db 'The Full Filename with Path is : ',0
    107. FullName      db 10,'The Filename is : ',0
    108. ExtensionName db 10,'The Extension is : ',0
    109. end
     

    Вложения:

    • 36.png
      36.png
      Размер файла:
      173,7 КБ
      Просмотров:
      1.090
    • tut_23.zip
      Размер файла:
      2,9 КБ
      Просмотров:
      267
    Последнее редактирование: 14 июн 2019
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.993

    Разбор полётов

    Поля структуры dlgOpenOfn уже заполнены.
    Код (ASM):
    1. dlgOpenTitle db 'Open File',0
    2. dlgOpenOfn     OPENFILENAME <<sizeof OPENFILENAME>,,IMAGE_BASE,\
    3. FilterString,,,,,MAXSIZE>
    FilterString ― это фильтр имен файлов, который мы определяем следующим образом.
    Код (ASM):
    1. FilterString db "All Files",0,"*.*",0
    2.   db "Text Files",0,"*.txt",0,0
    Заметьте, что каждая строка заканчивается нулем. Первая строка ― это описание следующей строки. В качестве фильтра мы можем определить все, что захотим. После последнего фильтра нужно добавить дополнительный ноль , чтобы указать конец. Мы указываем, куда диалоговое окно поместит имена файлов, выбранные пользователем. Мы должны указать размер буфера в nMaxFile. Затем извлечем имя файла из этого буфера. Флаги определяющие характеристики окна.
    • OFN_FILEMUSTEXIST и OFN_PATHMUSTEXIST ― указывают то, что имя файла и путь, который пользователь набирает в edit control'е имени файла, должен существовать.
    • OFN_LONGNAMES ― указывает диалоговому окну показывать длинные имена.
    • OFN_EXPLORER ― указывает на то, что появление диалогового окна должно быть похоже на explorer.
    • OFN_HIDEREADONLY ― прячет неизменяемый checkbox на диалоговом окне.
    Есть много других флагов, которые вы можете использовать.
    Код (ASM):
    1.      invoke GetOpenFileName,esi;offset dlgOpenOfn
    2.    or eax,eax
    3.    jz wmBYE
    В качестве параметра функции GetOpenFileName передается указатель на структуру OPENFILENAME. После этого диалог "открыть файл" появляется на экране. Функция возвратит TRUE, если пользователь выбрал файл, если пользователь нажмет кнопку 'Cancel' или закрыл окно диалога в этом случае функция вернет FALSE. В случае, если пользователь выбирает файл, мы подготавливаем строку вывода, которая будет отображаться в окне сообщения.
    Код (ASM):
    1.      mov ecx,OUTPUTSIZE
    2.        lea rdi,strMsg
    3.        mov esi,offset FullPathName
    4.        call StringOut1
    5.      mov rsi,dlgOpenOfn.lpstrFile
    6.      call StringOut1
    7.      mov esi,offset FullName
    8.      call StringOut1
    9.      movzx rsi,dlgOpenOfn.nFileOffset
    10.      add rsi,dlgOpenOfn.lpstrFile
    11.      call StringOut1
    12.      mov esi,offset ExtensionName
    13.      call StringOut1
    14.      movzx rsi,dlgOpenOfn.nFileExtension
    15.      add rsi,dlgOpenOfn.lpstrFile
    16.      call StringOut1
    17.      mov [rdi],bl; завершающий ноль в строке
    Немного пояснений. dlgOpenOfn.nFileOffset содержит индекс в dlgOpenOfn.lpstrFile. Hо вы не можете непосредственно сложить их, так размерности этих переменных разные (размер dlgOpenOfn.lpstrFileQWORD, размер dlgOpenOfn.nFileOffset и dlgOpenOfn.nFileExtensionWORD) поэтому сперва используем movzx, а потом add.
    Код (ASM):
    1.        mov r8d,offset ClassName
    2.        lea edx,strMsg
    3.        invoke MessageBox,hWnd,,,MB_OK
    Мы отображаем строку в окне сообщения.
    © Mikl___ 2016

    Глава двадцать четвертая. Братец Кролик выводит картинки на экран

    [​IMG]
    В этой главе мы научимся использовать рисунки в своих программах. Если быть более точным, мы научимся отображать рисунок в клиентскую область нашей программы.
    Скачайте пример и рисунок.
     

    Вложения:

    • tut_25.zip
      Размер файла:
      316,4 КБ
      Просмотров:
      264
    • tut_25a.zip
      Размер файла:
      559 КБ
      Просмотров:
      242
    • 47__bmp.zip
      Размер файла:
      556,7 КБ
      Просмотров:
      245
    Последнее редактирование: 7 май 2019
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.993

    Теория ― мать склероза

    На компьютерах используется множество различных форматов изображений, но Windows естественным образом поддерживает только формат растровых изображений Windows (bmp). На этом уроке, когда речь будет идти о рисунках, будет подразумеваться именно этот формат. Самый простой способ использовать рисунок ― это использовать его как ресурс. Есть три способа это выполнить. Можно включить рисунок в файл определения ресурсов (.rc) следующим образом:
    Код (C):
    1. #define IDB_MYBITMAP   100
    2.        IDB_MYBITMAP  BITMAP  "c:\\project\\example.bmp"
    В этом методе для представления рисунка используется константа. В первой строчке просто задаётся константа с именем IDB_MYBITMAP и значением 100. По этому имени мы и будем обращаться к рисунку в нашей программе. В следующей строке объявляется ресурс-рисунок. Таким образом, компилятор узнаёт, где ему искать собственно сам bmp-файл.
    В другом методе для представления рисунка используется имя рисунка, делается это следующим образом:
    Код (C):
    1. MyBitMap  BITMAP "c:\\project\\example.bmp"
    При использовании этого метода, в вашей программе вам придётся ссылаться на рисунок по имени "MyBitMap". Это имя является идентификатором данного ресурса.
    Оба метода прекрасно работают, главное ― определиться, какой именно вы будете использовать. После включения рисунка в файл ресурсов, можно приступить к его отображению в клиентской области нашего окна:
    Для загрузки растрового изображения используется функция LoadBitmap
    Синтаксис:
    Код (C):
    1. HBITMAP LoadBitmap(
    2.   _In_ HINSTANCE hInstance, // дескриптор вашей программы
    3.   _In_ LPCTSTR   lpBitmapName /* указатель на строку, содержащую имя рисунка
    4. (необходимо при использовании 2-го метода).
    5. Если для обращения к рисунку вы используете константу (например,
    6. IDB_MYBITMAP), то её значение вы и должны сюда поместить
    7. (в нашем случае это было бы значение 100). */
    8. );
    Функция возвращает дескриптор рисунка.
    Не помешает небольшой пример:

    Первый метод:


    Код (ASM):
    1. IDB_MYBITMAP    equ 100
    2.            ............
    3.                invoke LoadBitmap,IMAGE_BASE,IDB_MYBITMAP

    Второй метод:

    Код (ASM):
    1. .data
    2.            BitmapName  db "MyBitMap",0
    3.            .............
    4.                mov edx,offset BitmapName
    5.                invoke LoadBitmap,IMAGE_BASE

    Третий метод:

    Если вы ассоциировали с вашим рисунком число 125, то можно загрузить его следующим образом
    Код (ASM):
    1. .data
    2.            BitmapName  db "#125",0
    3.            .............
    4.                invoke LoadBitmap,IMAGE_BASE,125
    1. Получить контекст устройствa (DC ― Device Context) для окна, в котором будет выводиться растровое изображение. Это можно сделать либо вызовом функции BeginPaint в ответ на сообщение WM_PAINT, либо вызовом GetDC в любое время.
    2. Получить эквивалентный контекст устройствa для памяти (memory DC), в которой будет храниться растровое изображение (растровое изображение хранится в памяти и оттуда копируется в окно) с теми же атрибутами, что и контекст устройствa, полученный на предыдущем шаге. Идея в том, чтобы создать некоторую "невидимую" поверхность, на которой мы можем отобразить рисунок.
    3. Выбрать растровое изображение в контексте устройства памяти.
    4. Скопировать растровое изображение из памяти в окно вывода, из контекста устройства памяти в контекст устройствa окна с помощью вызова одной-единственной функции. Это приведет к появлению растрового изображения на экране.
    Этот приём называется двойной буферизацией (double buffering) и используется для быстрого вывода изображений на экран. Создать "невидимую" поверхность можно вызовом CreateCompatibleDC:
    Код (C):
    1. HDC CreateCompatibleDC(
    2.   _In_ HDC hdc //контекст устройствa, с которым должен быть совместим DC в памяти
    3. );
    Функция возвращает дескриптор области памяти, совместимой с контекстом устройства окна, который задается в параметре hdc. Эта память будет использоваться для создания изображения перед выводом его на экран.
    После создания невидимой поверхности вы можете отобразить на ней рисунок с помощью вызова SelectObject, передав ей в качестве первого параметра дескриптор DC в памяти, а в качестве второго ― дескриптор рисунка.

    Синтаксис:

    Код (C):
    1. HGDIOBJ SelectObject(
    2.   _In_ HDC     hdc,
    3.   _In_ HGDIOBJ hgdiobj
    4. );
    Теперь рисунок отображен на контекст устройствa в памяти. Единственное, что осталось сделать ― это скопировать его на на устройство вывода, то есть на настоящий контекст устройствa. Этого можно добиться с помощью таких функций, как BitBlt и StretchBlt. BitBlt просто копирует содержимое одного DC в другой, поэтому она работает быстро; StretchBlt может сжимать или растягивать изображение по размерам того DC, куда копирует. Для простоты здесь мы будем использовать BitBlt.

    Синтаксис:

    Код (C):
    1. BOOL BitBlt(
    2.   _In_ HDC   hdcDest, //контекст устройствa вывода
    3.   _In_ int   nXDest,  //координаты верхнего левого угла прямоугольника, в который
    4.   _In_ int   nYDest, //будет выводится растровое изображение
    5.   _In_ int   nWidth,  //ширина и высота выводимого растрового изображения
    6.   _In_ int   nHeight,
    7.   _In_ HDC   hdcSrc,  //дескриптор исходного контекста устройства
    8.   _In_ int   nXSrc,   //координаты левого верхнего угла растрового изображения
    9.   _In_ int   nYSrc,
    10.   _In_ DWORD dwRop    // способ вывода растрового изображения на экран
    11. );
    После завершения работы с рисунком удалите его с помощью вызова DeleteObject.
    Вот и всё! Если коротко, то сначала добавьте рисунок в файл ресурсов. После этого загрузите его из ресурсов с помощью LoadBitmap. Вы получите дескриптор рисунка. Далее узнайте контекст устройствa, на которое собираетесь выводить изображение. Затем создайте контекст устройствa в памяти, совместимый с DC, на который вы хотите выводить. "Выберите" рисунок на DC в памяти (то есть отрисуйте его), затем скопируйте его содержимое в настоящий DC.

    Практика ― сестра шизофрении

    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. IMAGE_BASE      equ 400000h
    4. IDB_MYBITMAP   equ 100
    5. .code
    6. WinMain proc
    7. local msg:MSG
    8.  
    9.        xor ebx,ebx
    10.        invoke LoadCursorFromFile,&FileName
    11.        push rax ;hIconSm
    12.        mov edi,offset ClassName
    13.        push rdi ;lpszClassName
    14.        push rbx ;lpszMenuName
    15.        push COLOR_WINDOW;hbrBackground
    16.        push 10003h ;hCursor
    17.        push rax ;hIcon
    18.        mov esi,IMAGE_BASE
    19.        push rsi ;hInstance
    20.        push rbx        ;cbClsExtra & cbWndExtra
    21.        pushaddr WndProc      ;lpfnWndProc
    22.        push sizeof WNDCLASSEX;cbSize & style
    23.        invoke RegisterClassEx,esp ;addr WNDCLASSEX
    24.        push rbx            
    25.        push rsi ;rsi=400000h
    26.        shr esi,7;Special CreateWindow position value CW_USEDEFAULT=8000h
    27.        push rbx            
    28.        push rbx
    29.        push 418            
    30.        push 562
    31.        push rsi            
    32.        push rsi            
    33.        sub esp,20h            
    34.        invoke CreateWindowEx,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    35.        lea edi,msg
    36. @@:    invoke GetMessage,edi,0,0,0
    37.        invoke DispatchMessage,edi
    38.        jmp @b
    39. WinMain endp
    40.  
    41. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    42. LOCAL ps:PAINTSTRUCT
    43. LOCAL hMemDC:HDC
    44. LOCAL rect:RECT
    45.  
    46.         mov hWnd,rcx
    47.  
    48.         cmp edx,WM_DESTROY
    49.         je wmDESTROY
    50.         cmp edx,WM_CREATE
    51.         je wmCREATE
    52.         cmp edx,WM_PAINT
    53.         je wmPAINT
    54.         leave
    55.         jmp NtdllDefWindowProc_
    56. wmDESTROY:invoke DeleteObject,hBitmap
    57.         invoke RtlExitUserProcess,NULL
    58. wmCREATE:invoke LoadBitmap,IMAGE_BASE,IDB_MYBITMAP
    59.         mov hBitmap,rax
    60.         jmp wmBYE
    61. wmPAINT:invoke BeginPaint,,&ps
    62.         invoke CreateCompatibleDC,rax
    63.         mov hMemDC,rax
    64.         invoke SelectObject,rax,hBitmap
    65.         invoke GetClientRect,hWnd,&rect
    66.         invoke BitBlt,ps.hdc,0,0,rect.right,rect.bottom,hMemDC,0,0,SRCCOPY
    67.         invoke DeleteDC,hMemDC
    68.         invoke EndPaint,hWnd,&ps
    69. wmBYE:  leave
    70.         retn
    71. WndProc endp
    72. ;---------------------------------------
    73. ClassName   db 'Uncle Remus tales:#25 Picture on screen',0
    74. hBitmap     dq ?
    75. FileName db "br_Rabbit3.cur",0
    76. end

    Файл ресурсов

    Код (C):
    1. #define IDB_MYBITMAP 100
    2.    IDB_MYBITMAP BITMAP "47.bmp"
    00.png
    Скачайте пример

    Анализ:

    Собственно, на этом уроке и анализировать нечего :)
    Код (C):
    1. #define IDB_MYBITMAP 100
    2.    IDB_MYBITMAP BITMAP "47.bmp"
    Определите константу IDB_MYBITMAP, присвоив ей значение 100. Затем используйте эту константу при определении ресурса рисунка. Файл, который будет включен в ресурсы, называется "47.bmр" и располагается в той же папке.
    Код (ASM):
    1. wmCREATE:invoke LoadBitmap,IMAGE_BASE,IDB_MYBITMAP
    2.         mov hBitmap,rax
    После получения сообщения WM_CREATE мы вызываем LoadBitmaр для загрузки рисунка из файла ресурсов, передаем идентификатор рисунка в качестве второго параметра. По завершению работы функции получим дескриптор рисунка. Теперь, когда рисунок загружен, его можно отобразить в клиентской области нашего приложения.
    Код (ASM):
    1. wmPAINT:invoke BeginPaint,,&ps
    2.         invoke CreateCompatibleDC,rax
    3.         mov hMemDC,rax
    4.         invoke SelectObject,rax,hBitmap
    5.         invoke GetClientRect,hWnd,&rect
    6.         invoke BitBlt,ps.hdc,0,0,rect.right,rect.bottom,hMemDC,0,0,SRCCOPY
    7.         invoke DeleteDC,hMemDC
    8.         invoke EndPaint,hWnd,&ps
     

    Вложения:

    • img00036.gif
      img00036.gif
      Размер файла:
      1,1 КБ
      Просмотров:
      1.092
    • img00037.gif
      img00037.gif
      Размер файла:
      1,1 КБ
      Просмотров:
      1.145
    • img00038.gif
      img00038.gif
      Размер файла:
      1,2 КБ
      Просмотров:
      1.090
    • img00039.gif
      img00039.gif
      Размер файла:
      1,1 КБ
      Просмотров:
      1.097
    • img00040.gif
      img00040.gif
      Размер файла:
      981 байт
      Просмотров:
      1.043
    • img00041.gif
      img00041.gif
      Размер файла:
      1,1 КБ
      Просмотров:
      1.067
    • 33.png
      33.png
      Размер файла:
      161,7 КБ
      Просмотров:
      1.101
    • 25a.zip
      Размер файла:
      1,1 МБ
      Просмотров:
      104
    Последнее редактирование: 27 мар 2019
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.993
    Мы выводим рисунок в ответ на сообщение WM_PAINT. Для этого мы сначала вызываем BeginPaint и получаем дескриптор DC. Затем создаем совместимый memory DC вызовом CreateComрatibleDC. Далее "выбираем" рисунок в память с помощью SelectObject. Определяем размеры клиентской области окна через GetClientRect. Теперь можно наконец-то вывести изображение в клиентскую область, вызвав функцию BitBlt, которая скопирует рисунок из памяти в настоящий DC. По завершению рисования мы удаляем DC в памяти вызовом DeleteDC, так как он нам больше не нужен. Подаём сигнал о завершении отрисовки окна с помощью EndPaint.
    Код (Text):
    1. wmDESTROY:invoke DeleteObject,hBitmap
    2.         invoke ExitProcess,0
    По окончанию работы удаляем рисунок посредством DeleteObject.

    Рисуем сами

    Скачайте файл примера здесь.

    Теория ― мать склероза

    Итак, мы хотим вывести рисунок на окно, но как это сделать проще, не используя множество API-функций: BeginPaint и EndPaint, CreateCompatibleDC и DeleteDC, GetClientRect, BitBlt, SelectObject и DeleteObject... Открываем книгу отечественных классиков, исследователей недр MSDN, братьев Александра Вячеслововича и Григория Вячеслововича Фроловых «Graphic Device Interface»

    Создание кисти

    Если нам понадобилось окрасить наше окно, то мы в WNDCLASSEX в поле hbrBackground указываем одну из 28 констант
    COLOR_SCROLLBAR000000
    COLOR_BACKGROUND
    COLOR_DESKTOP
    100001
    COLOR_ACTIVECAPTION200010
    COLOR_INACTIVECAPTION300011
    COLOR_MENU400100
    COLOR_WINDOW500101
    COLOR_WINDOWFRAME600110
    COLOR_MENUTEXT700111
    COLOR_WINDOWTEXT801000
    COLOR_CAPTIONTEXT901001
    COLOR_ACTIVEBORDER1001010
    COLOR_INACTIVEBORDER1101011
    COLOR_APPWORKSPACE1201100
    COLOR_HIGHLIGHT1301101
    COLOR_HIGHLIGHTTEXT1401110
    COLOR_BTNFACE
    COLOR_3DFACE
    1501111
    COLOR_BTNSHADOW
    COLOR_3DSHADOW
    1610000
    COLOR_GRAYTEXT1710001
    COLOR_BTNTEXT1810010
    COLOR_INACTIVECAPTIONTEXT1910011
    COLOR_BTNHIGHLIGHT
    COLOR_3DHIGHLIGHT
    COLOR_3DHILIGHT
    COLOR_BTNHILIGHT
    2010100
    COLOR_3DDKSHADOW2110101
    COLOR_3DLIGHT2210110
    COLOR_INFOTEXT2310111
    COLOR_INFOBK2411000
    ―​
    2511001
    COLOR_HOTLIGHT2611010
    COLOR_GRADIENTACTIVECAPTION2711011
    COLOR_GRADIENTINACTIVECAPTION2811100
    Цвет соответствующего компонента можно изменить, если щелкнуть по пустой области экрана правой клавишей, выбрать раздел «Свойства» [math]\to[/math] «Оформление» и выбрать цветовую схему соответствующему элементу.
    [​IMG]
    Цвет кисти можно задать функцией GetStockBrush из нескольких типов системных кистей, которые можно использовать:
    Код (ASM):
    1. WHITE_BRUSH                          equ 0;белый цвет заполнения
    2. LTGRAY_BRUSH                         equ 1;светло-серый
    3. GRAY_BRUSH                           equ 2;серый
    4. DKGRAY_BRUSH                         equ 3;темно-серый
    5. BLACK_BRUSH                          equ 4;черный
    6. NULL_BRUSH                           equ 5;прозрачная кисть
    7. HOLLOW_BRUSH                         equ NULL_BRUSH
    Если предопределенный цвет вам не подходит, то с помощью функции CreateSolidBrush можно создать цветную кисть:
    Код (C):
    1. BOOL CreateSolidBrush(
    2.    COLORREF crColor
    3. );
    В качестве параметра для этой функции необходимо указать цвет кисти. Для выбора цвета можно воспользоваться 32-битовым целым типа COLORREF. Windows позволяет задать цвет тремя различными способами.
    1. Первый и наиболее общий заключается в задании RGB-значений (Red, Green, Blue). RGB-значение комбинирует относительные интенсивности трех различных цветов, в результате чего получается реальный цвет.
      старший​
      младший​
      Байты
      3​
      2​
      1​
      0​
      Содержимое
      Должен быть
      равен нулю​
      Интенсивность
      синего​
      Интенсивность
      зеленого​
      Интенсивность
      красного​
      интенсивность каждого цвета в RGB-значении может задаваться в диапазоне от 0 до 0FFh(255), причем значение 0 определяет минимальную, а значение 0FFh ― максимальную интенсивность задаваемого цвета. Например, вот так задаются основные цвета
      значениецвет
      00FFFFFFh белый
      000000FFhкрасный
      000080FFhоранжевый
      0000FFFFhжелтый
      0000FF00hзеленый
      00D0D000hголубой
      00FF0000hсиний
      00FF00FFhфиолетовый
      000070A0hкоричневый
      ______00000000hчерный
    2. Второй способ определения цвета предполагает задание индекса цвета в логической палитре.
    3. Третий заключается в определении RGB-значения относительно текущей логической палитры.
    Windows может выбрать для кисти чистые или смешанные цвета, в зависимости от текущего цветового разрешения. После использования созданной кисти ее следует удалить, не забыв перед этим выбрать в контекст отображения старую кисть. Для удаления кисти используют функцию DeleteObject:
    Код (C):
    1. BOOL DeleteObject(
    2.   _In_ HGDIOBJ hObject
    3. );
    Можно заштриховать внутреннюю область замкнутой фигуры, создав одну из двадцати шести штриховых кистей при помощи функции CreateHatchBrush:
    Код (C):
    1. BOOL CreateHatchBrush(
    2.    int iHatch,
    3.    COLORREF color
    4. );
    Параметр color определяет цвет линий штриховки, а параметр iHatch задает стиль штриховки:
    Стиль штриховкичислоВнешний вид
    decbin
    HS_HORIZONTAL000000[​IMG]
    HS_VERTICAL100001[​IMG]
    HS_FDIAGONAL200010[​IMG]
    HS_BDIAGONAL300011[​IMG]
    HS_CROSS400100[​IMG]
    HS_DIAGCROSS500101[​IMG]
    HS_FDIAGONAL1600110Заполнено цветом
    определенном в
    параметре color
    HS_BDIAGONAL1700111
    HS_SOLID801000Заполнено
    черным цветом
    HS_DENSE1901001
    HS_DENSE21001010
    HS_DENSE31101011
    HS_DENSE41201100
    HS_DENSE51301101
    HS_DENSE61401110
    HS_DENSE71501111
    HS_DENSE81610000
    HS_NOSHADE1710001
    HS_HALFTONE1810010
    HS_SOLIDCLR1910011
    HS_DITHEREDCLR2010100
    HS_SOLIDTEXTCLR2110101
    HS_DITHEREDTEXTCLR2210110
    HS_SOLIDBKCLR2310111
    HS_DITHEREDBKCLR2411000
    HS_API_MAX2511001
    А вот самое главное, ради чего мы полезли в недра GDI ― «можно использовать свой собственный стиль штриховки, создав кисть из битового изображения размером 8х8 пикселей (можно использовать только такой размер)...» Если битовое изображение кисти определено в ресурсах приложения, его следует загрузить при помощи функции LoadBitmap, а если из файла ― то при помощи LoadImage.
    Эти функции возвратят идентификатор битового изображения. Затем для создания кисти этот идентификатор следует передать в качестве параметра функции CreatePatternBrush:
    Код (C):
    1. HBRUSH CreatePatternBrush(
    2.   _In_ HBITMAP hbmp
    3. );
    А что если братья Фроловы ошибаются и размер рисунка не ограничен 8 на 8 точек?
    Загружаем изображение из файла при помощи LoadImage, передаем идентификатор функции CreatePatternBrush, создаем кисть и, с ее помощью, закрашиваем окно.
    И всё! Не нужно никаких BeginPaint и EndPaint, CreateCompatibleDC и DeleteDC, GetClientRect, BitBlt, SelectObject и DeleteObject... Никакой обработки WM_PAINT, ни каких дескрипторов и ни каких контекстов изображения.
    [​IMG]
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. .code
    4. WinMain proc
    5. local msg:MSG
    6.  
    7.        xor ebx,ebx
    8.         mov esi,IMAGE_BASE
    9.        mov edi,offset ClassName
    10.         invoke LoadImage,esi,edi,0,0,0,LR_LOADFROMFILE
    11.         invoke CreatePatternBrush,eax
    12.        push 10027h ;hIconSm
    13.        push rdi ;lpszClassName
    14.        push rbx ;lpszMenuName
    15.        push rax ;hbrBackground
    16.        push 10003h ;hCursor
    17.        push 10027h     ;hIcon
    18.        push rsi ;hInstance
    19.        push rbx        ;cbClsExtra & cbWndExtra
    20.        pushaddr WndProc ;lpfnWndProc
    21.         push sizeof WNDCLASSEX;cbSize & style
    22.        invoke RegisterClassEx,esp ;addr WNDCLASSEX
    23.        push rbx
    24. push rsi ;rsi=400000h
    25. shl esi,9 ;rsi=CW_USEDEFAULT
    26. push rbx
    27. push rbx
    28. push 405
    29. push 520
    30. push rsi
    31. push rsi
    32. sub esp,20h
    33.     invoke CreateWindowEx,0,edi,edi,WS_OVERLAPPED or \
    34.         WS_VISIBLE or WS_CAPTION or WS_SYSMENU or WS_MINIMIZEBOX
    35.     lea edi,msg
    36. @@:     invoke GetMessage,edi,0,0,0
    37. invoke DispatchMessage,edi
    38.         jmp @b
    39. WinMain endp
    40. WndProc:cmp  edx,WM_DESTROY
    41.         je   wmDESTROY
    42.         jmp DefWindowProc
    43. wmDESTROY:invoke ExitProcess,NULL
    44. ;---------------------------------------
    45. ClassName db 'Images\12.bmp',0
    46. end
    © Mikl___ 2017
     

    Вложения:

    • 01.png
      01.png
      Размер файла:
      361 КБ
      Просмотров:
      1.194
    Последнее редактирование: 17 авг 2019
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.993

    Глава двадцать пятая. Братец Кролик создает дочерние окна

    [​IMG]
    В этой главе мы изучим дочерние элементы управления (child window controls), которые являются важными частями ввода и вывода для наших программ.
    Скачайте пример здесь.

    Теория ― мать склероза

    Windows предоставляет несколько предопределенных классов окон, которые можно использовать в программах. Как правило, их используют как компоненты окон-диалогов, поэтому они носят название дочерних элементов управления. Эти элементы обрабатывают сообщения от клавиатуры и мыши и уведомляют родительское окно, если их состояние изменяется. В этой главе элементы управления размещены на обычном окне, только для того, чтобы продемонстрировать, как их можно создать и использовать, но в реальности вам лучше размещать элементы управления при создании окна-диалога.
    Примерами предопределенных классов окон являются кнопки, списки (list box), контрольные переключатели (сheck box), селекторные кнопки (radio button) и так далее.
    Чтобы использовать дочернее окно, вы должны создать его с помощью функции CreateWindow или CreateWindowEx. Вы не должны регистрировать классы окон дочерних элементов управления, так как они уже зарегистрированы в Windows.
    Имя класса окна должно быть именем предопределенного класса. Если вы хотите создать кнопку, вы должны указать «button» в качестве имени класса в CreateWindowsEx. Другие параметры, которые вы должны указать ― это дескриптор родительского окна и ID элемента управления. ID элемента управления должно быть уникальным. Вы используете его для того, чтобы отличать данный элемент управления от других.
    После того, как элемент управления создан, он посылает сообщение, уведомляющие родительское окно об изменении своего состояния. Обычно дочерние окна создаются после того, когда главному окну отправлено сообщения WM_CREATE
    Дочернее окно посылает сообщение WM_COMMAND родительскому окну со своим ID в младшем слове wParam'а, код уведомления в старшем слове wParam'а, а ее дескриптор в lParam'е. Каждое окно имеет разные коды уведомления, сверяйтесь со справочником по Win32 API, чтобы получить более подробную информацию.
    Родительское окно также может посылать команды дочерним окнам, вызывая функцию SendMessage. Функция SendMessage посылает определенные сообщения с сопутствующими значениями в wParam и lParam окну, чей дескриптор передается функции. Эта функция посылает сообщения любому окну, дескриптор которого у вас есть.
    После создания дочерних окон, родительское окно должно обрабатывать сообщения WM_COMMAND, чтобы быть способным получать коды уведомления от дочерних окон.

    Практика ― сестра шизофрении


    00.png
    Мы создадим окно, которое содержит окно ввода (edit box), картинку 128×128 и две кнопки. Когда вы нажмете на кнопку «Say Hello», в окне редактирования появится текст «Wow! I'm in an edit box now», при нажатии на кнопку «Exit» программа завершится. В окно ввода можно ввести любой текст. Также имеется меню «Text Controls» с 4 пунктами:
    01.png
    1. «Say Hello» ― ввести текстовую строку в окно ввода
    2. «Get Text» ― вывести с текст из окна ввода в MessageBox
    3. «Clear Edit Box» ― очистить содержимое окна ввода
    4. «Exit» ― закрыть программу

    asm-файл

    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. IDC_EDIT       equ 0
    4. IDC_BUTTON     equ 1
    5. IDC_EXIT       equ 2
    6. IDM_SAYHELLO   equ 0
    7. IDM_GETTEXT    equ 1
    8. IDM_CLEAR      equ 2
    9. IDM_EXIT       equ 3
    10. IDC_ICON1      equ 500
    11. ICON_SIZE      equ 744
    12. IDC_IMG        equ 1001
    13. ;-----------------------------------------
    14. .code
    15. WinMain proc
    16. local msg:MSG
    17.  
    18.        xor ebx,ebx
    19.        mov esi,IMAGE_BASE
    20.        invoke LoadCursorFromFile,&FileName
    21.        mov edi,offset ClassName
    22.        push rax ;hIconSm
    23.        push rdi ;lpszClassName
    24.        pushaddr MenuName     ;lpszMenuName
    25.        push COLOR_BTNFACE+1;hbrBackground
    26.        push 10005h ;hCursor
    27.        push rax        ;hIcon
    28.        push rsi ;hInstance
    29.        push rbx        ;cbClsExtra & cbWndExtra
    30.        pushaddr WndProc      ;lpfnWndProc
    31.        push sizeof WNDCLASSEX;cbSize & style
    32.        invoke RegisterClassEx,esp ;addr WNDCLASSEX
    33.        push rbx
    34.        push rsi ;rsi=400000h
    35.        shl esi,9 ;rsi=CW_USEDEFAULT
    36.        push rbx
    37.        push rbx
    38.        push 175
    39.        push 450
    40.        push rsi
    41.        push rsi
    42.        sub esp,20h
    43.        invoke CreateWindowEx,WS_EX_CLIENTEDGE,edi,edi,\
    44.        WS_OVERLAPPEDWINDOW or WS_VISIBLE
    45.        lea edi,msg
    46. @@:invoke GetMessage,edi,0,0,0
    47.        invoke TranslateMessage,edi
    48.        invoke DispatchMessage,edi
    49.         jmp @b
    50. WinMain endp
    51. WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    52. local ps:PAINTSTRUCT
    53. local buffer[96]:BYTE
    54.  
    55.         mov  hWnd,rcx
    56.        mov  lParam,r9
    57.        mov  wParam,r8
    58.  
    59.        cmp edx,WM_DESTROY
    60.        je wmDESTROY
    61.        cmp edx,WM_COMMAND
    62.        je wmCOMMAND
    63.         cmp edx,WM_CREATE
    64.        je wmCREATE
    65.        leave
    66.         jmp NtdllDefWindowProc_
    67. wmCREATE:;создаем поле ввода
    68.        push rbx
    69.        push IMAGE_BASE
    70.        push ebx;IDC_EDIT=0
    71.        push rcx
    72.        push 26
    73.        push 190
    74.        push 35
    75.        push 130
    76.        sub esp,20h
    77.        invoke CreateWindowEx,WS_EX_CLIENTEDGE,&EditClassName,0,\
    78.        WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or ES_AUTOHSCROLL
    79.         mov hwndEdit,rax
    80.        invoke SetFocus,eax
    81. ;создаем кнопку
    82.         push rbx
    83.        push IMAGE_BASE
    84.        push IDC_BUTTON
    85.        push hWnd
    86.        push 26
    87.        push 104
    88.        push 20
    89.        push 320
    90.        sub esp,20h
    91.        invoke CreateWindowEx,0,&ButtonClassName,&ButtonText1,\
    92.        WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON
    93. ;создаем кнопку
    94.         push rbx
    95.        push IMAGE_BASE
    96.        push IDC_EXIT
    97.        push hWnd
    98.        push 26
    99.        push 104
    100.        push 52
    101.        push 320
    102.        sub esp,20h
    103.        invoke CreateWindowEx,0,&ButtonClassName,&ButtonText2,\
    104.        WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON
    105. ;-----------------------------------------------
    106.         invoke LoadImage,IMAGE_BASE,&FileBmp,IMAGE_BITMAP,0,0,LR_LOADFROMFILE
    107.         mov image,rax
    108.         push rbx
    109.        push IMAGE_BASE
    110.        push IDC_IMG
    111.        push hWnd
    112.        push 101
    113.        push 128
    114.        push rbx;0
    115.        push rbx;0
    116.        sub esp,20h
    117.        invoke CreateWindowEx,0,&StaticClassName,0,\
    118.        WS_CHILD or WS_VISIBLE or SS_CENTERIMAGE or SS_BITMAP
    119.        invoke SendMessage,rax,STM_SETIMAGE,IMAGE_BITMAP,image
    120.        jmp wmBYE
    121. wmCOMMAND:movzx eax,r8w;word ptr wParam
    122.        or r9,r9;cmp lParam,0
    123.        jnz @f
    124.        jmp [menu_handlers+rax*8]
    125. @@: dec eax ;cmp eax,IDC_BUTTON=1
    126.        jne @f
    127. SAYHELLO:mov edx,offset TestString
    128.        jmp @0
    129. @@: dec eax ;cmp eax,IDC_EXIT=2
    130.        jne wmBYE
    131. wmDESTROY:invoke RtlExitUserProcess,NULL;завершение программы
    132. @0: invoke SetWindowText,hwndEdit
    133.        invoke SendMessage,hwndEdit,WM_KEYDOWN,VK_END,0
    134.        jmp wmBYE
    135. CLEAR: invoke SetWindowText,hwndEdit,0
    136.        jmp wmBYE
    137. GETTEXT:invoke GetWindowText,hwndEdit,&buffer,92
    138.        lea rdx,buffer
    139.        mov mb.lpszText,rdx
    140.       lea ecx,mb
    141.        invoke MessageBoxIndirect
    142. wmBYE: leave
    143.        retn
    144. menu_handlers dq SAYHELLO,GETTEXT,CLEAR,wmDESTROY
    145. WndProc endp
    146. ;---------------------------------------
    147. ClassName db 'Uncle Remus tales:#9 Create a button and editing window',0
    148. MenuName db "FirstMenu",0
    149. ButtonClassName db "button",0
    150. ButtonText1 db "Say Hello",0
    151. ButtonText2 db "Exit",0
    152. EditClassName db "edit",0
    153. StaticClassName db "static",0
    154. TestString db "Wow! I'm in an edit box now",0
    155. hwndEdit dq ?
    156. FileName db "br_Rabbit3.cur",0
    157. FileBmp db "03.bmp",0
    158. mb label   MSGBOXPARAMS
    159.   dd sizeof MSGBOXPARAMS,?;cbSize
    160.   dq 0  ;hwndOwner
    161.   dq IMAGE_BASE  ;hInstance
    162.   dq ?  ;lpszText
    163.   dq MenuName  ;lpszCaption
    164.   dd MB_OK or MB_USERICON,?;dwStyle
    165.   dq IDC_ICON1  ;lpszIcon
    166.   dd 0,?;dwContextHelpId
    167.   dq 0  ;lpfnMsgBoxCallback
    168.   dd 0,?;dwLanguageId
    169. image dq ?
    170. end

    rc-файл

    Код (C):
    1. #define IDM_SAYHELLO 0
    2. #define IDM_GETTEXT  1
    3. #define IDM_CLEAR    2
    4. #define IDM_EXIT     3
    5. #define IDC_ICON1    500
    6. IDC_ICON1 ICON "br_Fox1.ico"
    7. FirstMenu MENU
    8. {
    9.  POPUP "&Test Controls"
    10.         {
    11.          MENUITEM "Say Hello",IDM_SAYHELLO
    12.          MENUITEM "Get Text", IDM_GETTEXT
    13.          MENUITEM "Clear Edit Box",IDM_CLEAR
    14.          MENUITEM SEPARATOR
    15.          MENUITEM "E&xit",IDM_EXIT
    16.         }
    17. }
    Для создания элементов управления мы вызываем CreateWindowEx с дополнительным стилем, из-за чего клиентская область выглядит «вдавленной». Имя каждого элемента управления предопределено ― «edit» для элемента управления «окно ввода», «button» ― для кнопки и так далее. Затем мы указываем стили дочерних окон. У каждого элемента управления есть дополнительные стили, кроме обычных стилей окна. Например, стили кнопок начинаются с «BS_» (Buttom Style), стили окон ввода ― с «ES_» (Edit Style).
    Посмотрите информацию об этих стилях в справочнике по Win32 API. Заметьте, что вместо дескриптора меню передается ID элемента управления.
    Это не вызывает никаких противоречий, поскольку дочерний элемент управления не может иметь меню. После создания каждого элемента управления, мы сохраняем его дескриптор в соответствующей переменной для будущего использования. Функция SetFocus вызывается для того, чтобы направить фокус на окно ввода, чтобы пользователь мог сразу начать вводить в него текст.
    Код (ASM):
    1. wmCOMMAND: movzx eax,r8w;word ptr wParam
    2.        or r9,r9;cmp lParam,0
    3.        jnz @f
     

    Вложения:

    • 00.png
      00.png
      Размер файла:
      383,3 КБ
      Просмотров:
      1.044
    • 24.zip
      Размер файла:
      33,4 КБ
      Просмотров:
      107
    Последнее редактирование: 26 мар 2019
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.993
    Обратите внимание, что меню тоже шлет сообщение WM_COMMAND, чтобы уведомить окно о своем состоянии. Как мы можем провести различие между сообщениями WM_COMMAND, исходящими от меню и элементов управления?
    lParamwParam
    старшее
    двойное
    слово
    младшее
    двойное
    слово
    старшее
    двойное
    слово
    младшее двойное слово
    биты63-3231-063-3231-1615-0
    Меню
    0​
    0​
    0​
    ID меню​
    Элемент
    управления
    Дескриптор
    дочернего окна​
    Код
    уведомления​
    ID элемента
    управления​
    Из таблицы видно, что пользователь должен проверять lParam. Если он равен нулю, текущее сообщение WM_COMMAND было послано меню. Вы не можете использовать wParam, чтобы различать меню и элемент управления, так как ID меню и ID элемента управления могут быть идентичными.
    Код (ASM):
    1. SAYHELLO: invoke SetWindowText,hwndEdit,&TestString
    2.     invoke SendMessage,hwndEdit,WM_KEYDOWN,VK_END,0
    Вы можете поместить текстовую строку в окно редактирования с помощью вызова SetWindowText. Вы очищаете содержимое окна редактирования с помощью вызова функции SetWindowText, передавая ей NULL. SetWindowText ― это функция общего назначения. Вы можете использовать ее, чтобы изменить заголовок окна или текст на кнопке. Чтобы получить текст в окне редактирования, вы можете использовать GetWindowText.
    Код (ASM):
    1. GETTEXT:invoke GetWindowText,hwndEdit,&buffer,92
    2.       lea rdx,buffer
    3.       mov mb.lpszText,rdx
    4.       invoke MessageBoxIndirect,&mb
    Приведенный выше фрагмент программы является фрагментом обработкой нажатия на кнопку. Сначала проверяем содержимое младшего слова wParam'а, чтобы убедиться, что ID элемента управления принадлежит кнопке. Если это так, проверяем старшее слово wParam'а, чтобы убедиться, что был послан код уведомления BN_CLICKED, то есть кнопка была нажата. После этого идет собственно обработка нажатия на клавиш. Мы хотим получить текст из окна редактирования и отобразить его с помощью вызова MessageBoxIndirect. Мы можем продублировать код в секции IDM_GETTEXT выше, но это не имеет смысла. Если мы сможем каким-либо образом послать сообщение WM_COMMAND с младшим словом wParam, содержащим значение IDM_GETTEXT нашей процедуре окна, то избежим дублирования кода и упростим программу. Функция SendMessage ― это ответ.
    Эта функция посылает любое сообщение любому окну с любым wParam'ом и lParam'ом, которые нам понадобятся. Поэтому вместо дублирования кода мы вызываем SendMessage с дескриптором родительского окна, WM_COMMAND, IDM_GETTEXT и 0. Это дает тот же эффект, что и выбор пункта меню "Get Text". Процедура окна не почувствует никакой разницы. Вы должны использовать эту технику так часто, насколько возможно, чтобы сделать ваш код более упорядоченным.
    Не забудьте вставить функцию TranslateMessage в очередь сообщений. Так как вам нужно печатать текст в окно редактирования, ваша программа должна транслировать ввод в читабельный текст. Если вы пропустите эту функцию, вы не сможете напечатать что-либо в вашем окне редактирования.


    © Mikl___ 2019
     

    Вложения:

    • 24.zip
      Размер файла:
      34,8 КБ
      Просмотров:
      159
    Последнее редактирование: 18 июл 2019
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.993

    Глава двадцать шестая. Братец Кролик и диалоги

    [​IMG]

    ТЕОРИЯ ― МАТЬ СКЛЕРОЗА

    Если вы изучили примеры в предыдущих главах достаточно подробно, вы заметили, что вы не могли перемещать фокус ввода от одного дочернего окна на другое, используя кнопку Tab. Вы могли сделать это только кликнув на нужном контроле, чтобы перевести на него фокус. Это довольно неудобно. Также вы могли заметить, что изменился цвет родительского окна на серый. Это было сделано для того, чтобы цвет дочерних окон не контрастировал с клиентской областью родительского окна. Есть путь, чтобы обойти эту проблему, но он не очень прост. Вы должны сабклассить все дочерние элементы управления в вашем родительском окне.
    Причина того, почему возникают подобные неудобства состоят в том, что дочерние окна изначально проектировались для работы с диалоговым окном, а не с обычным. Цвет дочернего окна по умолчанию серый, так как это обычный цвет диалогового окна.
    Прежде чем мы углубимся в детали, мы должны сначала узнать, что такое диалоговое окно. Диалоговое окно ― это не что иное, как обычное окно, которое спроектировано для работы с дочерними элементами управления.
    Windows также предоставляет внутренний «менеджер диалоговых окон», который воплощает большую часть диалоговой логики, такую как перемещение фокуса ввода, когда юзеp нажимает Tab, нажатие кнопки по умолчанию, если нажатие на кнопку 'Enter, и так далее, так чтобы программисты могли заниматься более высокоуровневыми задачами. Поскольку диалоговое окно можно считать «черным ящиком» (это означает то, что вы не обязаны знать, как работает диалоговое окно, для того, чтобы использовать его), вы должно только знать, как с ним взаимодействовать. Это принцип объектно-ориентированного программирования, называемого скрытием информации. Если черный ящик спроектирован совершенно, пользователь может использовать его не зная, как он работает. Правда, загвоздка в том, что черный ящик должен быть совершенным, это труднодостижимо в реальном мире. Win32 API также спроектирован как черный ящик.
    Диалоговые окна спроектированы так, чтобы снизить нагрузку на программиста. Обычно, если вы помещает дочерний элемент управления на обычное окно, вы должны сабклассить их и самостоятельно обрабатывать нажатия на клавиши. Hо если вы помещаете их на диалоговое окно, оно обработает их за вас. Вы только должны как получать информацию, вводимую пользователем, или как посылать команды окну. Диалоговое окно определяется как ресурс (похожим образом, как и меню). Вы пишете шаблон диалогового окна, описывая характеристики диалогового окна и его элементов управления, а затем компилируете его с помощью редактора ресурсов.
    Обратите внимание, что все ресурсы располагаются в одном скрипте ресурсов.
    Вы можете использовать любой текстовый редактор, чтобы написать шаблон диалогового окна, но я бы не рекомендовал это. Вы должны использовать редактор ресурсов, чтобы сделать визуально расположить дочерние окна. Существует несколько прекрасных редакторов ресурсов. К большинству из основных компиляторов прилагаются подобные редакторы. Вы можете использовать их, чтобы создать скрипт ресурса. После этого стоит вырезать лишние строки, например, те, которые относятся к MFC.
    Есть два основных вида диалоговых окон: модальные и немодальные. В большинстве случаев используются модальные диалоги. Это означает, что программа дожидается завершения диалога и только затем ее выполнение будет продолжаться. Модальный диалог не позволяет также переключить ввод на другие окна нашего приложения.
    Немодальные диалоговые окна дают вам возможность перемещать фокус ввода на другие окна. Пример ― диалоговое окно 'Find' в MS Word. Немодальный диалог не задерживает выполнение приложения, то есть для ее продолжения не требуется завершение диалога. При этом разрешается переключение между диалогом и другим окном приложения.
    Есть два подтипа модальных диалоговых окон:
    • модальные к приложению
    • модальные к системе
    Первые не дают вам переключаться на другое окно того же приложения, но вы можете переключиться на другое приложение. Вторые не дают вам возможности переключиться на любое другое окно.
    Немодальное диалоговое окно создается с помощью вызова функции CreateDialogParam. Модальное диалоговое окно создается вызовом DialogBoxParam. Единственное различие между диалоговым окном, модальным отношению к приложению, и диалоговым окном, модальным по отношению к системе, ― это стиль DS_SYSMODAL. Если вы включите стиль DS_SYSMODAL в шаблон диалогового окна, это диалоговое окно будет модальным к системе.
    Вы можете взаимодействовать с любым дочерним элементом управления на диалоговом окне с помощью функции SendDlgItemMessage. Ее синтаксис следующий:
    Код (C):
    1. LRESULT WINAPI SendDlgItemMessage(
    2.   _In_ HWND  hDlg,
    3.   _In_ int  nIDDlgItem,
    4.   _In_ UINT  Msg,
    5.   _In_ WPARAM wParam,
    6.   _In_ LPARAM lParam
    7. );
    Эта API-функция неоценимо полезна при взаимодействии с дочерним окном.
    Например, если вы хотите получить текст из окна редактирования, вы можете сделать следующее:
    Код (ASM):
    1. invoke SendDlgItemMessage,hDlg, ID_EDITBOX,WM_GETTEXT,256,ADDR text_buffer
    Чтобы знать, какое сообщение когда посылать, вы должны проконсультироваться с вашим Win32 API-справочником.
    Windows также предоставляет несколько специальных API-функций, заточенных под дочерние окна, для быстрого получения и установки нужных данных, например, GetDlgItemText, CheckDlgButton и так далее. Эти специальные функции создание, чтобы программисту не приходилось выяснять каждый раз значения wParam и lParam. Как правило, вы должны использовать данные функции, если хотите, чтобы управление кодом было легче. Используйте SendDlgItemMessage только, если нет соответствующей API-функции. Все события внутри диалога передаются программе посредством механизма сообщений, как это делается в "оконных" приложениях. Но сообщения диалога не передаются в функцию главного окна программы. Для создаваемого диалога необходимо определить специальную callback-функцию, которая называется функцией диалога или оконной функцией диалога, которая имеет следующий формат:
    Код (C):
    1. BOOL CALLBACK DlgProc  (
    2.  hDlg:HWND,
    3. iMsg:UINT,
    4. wParam:WPARAM,
    5. lParam:LPARAM
    6. );
    Процедура диалогового окна очень похожа на процедуру окна, если не считать тип возвращаемого значения ― TRUE/FALSE, вместо обычных LRESULT. Внутренний менеджер диалоговых окон внутри Windows ― истинная процедура для диалоговых окон. Она вызывает нашу процедуру диалоговых окон, передавая некоторые из полученных сообщений. Поэтому главное правило следующее: если наша процедура диалогового окна обрабатывает сообщение, она должна вернуть TRUE в rax и если она не обрабатывает сообщение, тогда она должна вернуть в eax FALSE. Заметьте, что процедура диалогового окна не передает сообщения функции DefWindowProc, так как это не настоящая процедура окна. Диалоговое окно можно использовать в двух целях.
    • Вы можете использовать ее как основное окно или как вспомогательное для получения информации, вводимой пользователем. В этой главе мы изучим первый вариант. «Использование диалогового окна как основное окно» можно понимать двояко. Вы можете использовать шаблон диалогового окна как шаблон класса, который вы регистрируете с помощью функции RegisterClassEx. В этом случае, диалоговое окно ведет себя как «нормальное»: оно получает сообщения через процедуру окна, на которую ссылается lрfnWndProc, а не через процедуру диалогового окна. Выгода данного подхода состоит в том, что вы не должны самостоятельно создавать дочерние элементы управления, Windows создает их во время создания диалогового окна. Также Windows берет на себя логику нажатий на клавиши (Tab и так далее.). Плюс вы можете указать курсор и иконку вашего окна в структуре класса окна.
    • Ваша программа создает диалоговое окно без создания родительского окна. Этот подход делает цикл сообщений ненужным, так как сообщения шлются напрямую процедуре диалогового окна. Вам даже не нужно регистрировать класс окна!

    DlgProcWndProc+ClassDlgProc+WndProc
    DialogBoxParamtut_10a.asmtut_10f.asmtut_10e.asm
    CreateDialogParamtut_10b.asmtut_10c.asmtut_10d.asm
    DialogBoxIndirectParamtut_10g.asmtut_10i.asmtut_10k.asm
    CreateDialogIndirectParamtut_10h.asmtut_10j.asmtut_10l.asm
    И наконец tut_10m.asm ― вишенка на торте ― превращаем MessageBox при помощи хуков в диалог :)
     

    Вложения:

    • 00.png
      00.png
      Размер файла:
      242,5 КБ
      Просмотров:
      1.053
    • tut_10a.zip
      Размер файла:
      57,7 КБ
      Просмотров:
      111
    • tut_10b.zip
      Размер файла:
      57,9 КБ
      Просмотров:
      106
    • tut_10d.zip
      Размер файла:
      58,2 КБ
      Просмотров:
      104
    • tut_10e.zip
      Размер файла:
      58 КБ
      Просмотров:
      111
    • tut_10f.zip
      Размер файла:
      57,9 КБ
      Просмотров:
      106
    • tut_10g.zip
      Размер файла:
      57,9 КБ
      Просмотров:
      106
    • tut_10h.zip
      Размер файла:
      58,1 КБ
      Просмотров:
      105
    • tut_10i.zip
      Размер файла:
      58,1 КБ
      Просмотров:
      107
    • tut_10j.zip
      Размер файла:
      58,4 КБ
      Просмотров:
      102
    • tut_10k.zip
      Размер файла:
      58,2 КБ
      Просмотров:
      107
    • tut_10l.zip
      Размер файла:
      58,5 КБ
      Просмотров:
      106
    • tut_10m.zip
      Размер файла:
      9,4 КБ
      Просмотров:
      124
    Последнее редактирование: 25 мар 2019
    kero нравится это.
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.993

    ПРАКТИКА ― СЕСТРА ШИЗОФРЕНИИ

    [​IMG]

    CreateDialogParam+WndProc+Class

    текст файла tut_10c.asm

    Код (ASM):
    1.  
    2. ; GUI #
    3. include win64a.inc
    4. IDM_SAYHELLO equ 0
    5. IDM_GETTEXT equ 1
    6. IDM_CLEAR equ 2
    7. IDM_EXIT equ 3
    8. IDC_EDIT equ 0
    9. IDC_BUTTON equ 1
    10. IDC_EXIT equ 2
    11. IDC_MENU equ 100
    12. IDC_DIALOG equ 200
    13. IDC_ICON1 equ 500
    14. IDC_IMG1 equ 102
    15. .code
    16. WinMain proc
    17. local msg:MSG
    18. local hwnd:QWORD
    19. mov esi,IMAGE_BASE
    20.         invoke LoadImage,esi,IDC_ICON1,IMAGE_ICON,128,128,LR_DEFAULTCOLOR
    21. mov hIcon,rax
    22. xor ebx,ebx
    23. mov edi,offset ClassName
    24. push rax ;hIconSm
    25. push rdi ;lpszClassName
    26. push IDC_MENU ;lpszMenuName
    27. push COLOR_BTNFACE+1;hbrBackground
    28. push 10005h ;hCursor
    29. push rax        ;hIcon
    30. push rsi ;hInstance
    31. push DLGWINDOWEXTRA;cbClsExtra & cbWndExtra
    32. pushaddr dialog_procedure;lpfnWndProc
    33. push sizeof WNDCLASSEX;cbSize & style
    34. invoke RegisterClassEx,esp ;addr WNDCLASSEX
    35. invoke CreateDialogParam,esi,IDC_DIALOG,0,&dialog_procedure,hIcon;0
    36. mov hwnd,rax
    37. lea edi,msg
    38. message_loop:invoke GetMessage,edi,0,0,0
    39. or eax,eax
    40. jz exit_msg_loop
    41. invoke IsDialogMessage,hwnd,edi
    42. or eax,eax
    43. jnz message_loop
    44. invoke DispatchMessage,edi
    45.         jmp message_loop
    46. exit_msg_loop:invoke RtlExitUserProcess,NULL
    47. WinMain endp
    48. dialog_procedure proc hDlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    49. size_of_buffer equ 96
    50. local buffer[size_of_buffer]:BYTE
    51. mov hDlg,rcx
    52.         mov lParam,r9
    53. cmp edx,WM_CLOSE
    54. je wmCLOSE
    55.         cmp edx,WM_INITDIALOG
    56. je wmINITDIALOG
    57. cmp edx,WM_COMMAND
    58. jne wmBYE
    59. wmCOMMAND:movzx eax,r8w ;movzx eax,word ptr wParam
    60. or r9,r9 ;cmp lParam,0
    61. jnz @f
    62. jmp [menu_handlers+rax*8]; choose menu
    63. ; choose button or EditBox
    64. @@: dec eax ;cmp eax,IDC_BUTTON=1
    65. jne @f
    66. SAYHELLO:mov r8d,offset expTxt
    67. jmp @0
    68. @@: dec eax ;cmp eax,IDC_EXIT=2
    69. jne wmBYE
    70. invoke SendMessage,,WM_CLOSE,0,0
    71. jmp wmBYE
    72. wmINITDIALOG:invoke SendMessage,,WM_SETICON,1;,r9=lParam
    73.         invoke GetDlgItem,hDlg,IDC_IMG1
    74. invoke SendMessage,eax,STM_SETIMAGE,IMAGE_ICON,lParam
    75. jmp wmBYE
    76. CLEAR: xor r8d,r8d
    77. @0: invoke SetDlgItemText,,0
    78. jmp wmBYE
    79. GETTEXT:invoke GetDlgItemText,,0,&buffer,size_of_buffer
    80. lea edx,buffer
    81. mov mb.lpszText,rdx
    82.         lea ecx,mb
    83. invoke MessageBoxIndirect
    84. jmp wmBYE
    85. wmCLOSE:invoke DestroyWindow;,hDlg
    86. invoke PostQuitMessage,0
    87. wmBYE:  xor eax,eax
    88. leave
    89. retn
    90. menu_handlers dq SAYHELLO,GETTEXT,CLEAR,wmCLOSE
    91. dialog_procedure endp
    92. ;---------------------------------------
    93. ClassName db 'DLGCLASS',0
    94. expTxt db "Wow! I'm in an edit box now",0
    95. AppName db 'Our Third Dialog Box',0
    96. hIcon      dq ?
    97. mb label   MSGBOXPARAMS
    98.   dd sizeof MSGBOXPARAMS,?;cbSize
    99.   dq 0  ;hwndOwner
    100.   dq IMAGE_BASE  ;hInstance
    101.   dq ?  ;lpszText
    102.   dq AppName  ;lpszCaption
    103.   dd MB_OK or MB_USERICON,?;dwStyle
    104.   dq IDC_ICON1  ;lpszIcon
    105.   dd 0,?;dwContextHelpId
    106.   dq 0  ;lpfnMsgBoxCallback
    107.   dd 0,?;dwLanguageId
    108. end

    Текст файла tut_10c.rc

    Код (C):
    1.  
    2. #include "resource.h"
    3. #define IDM_SAYHELLO 0
    4. #define IDM_GETTEXT 1
    5. #define IDM_CLEAR 2
    6. #define IDM_EXIT 3
    7. #define IDC_EDIT 0
    8. #define IDC_BUTTON 1
    9. #define IDC_EXIT 2
    10. #define IDC_MENU 100
    11. #define IDC_DIALOG 200
    12. #define IDC_ICON1 500
    13. #define IDC_IMG1 102
    14. IDC_ICON1 ICON  "icon3.ico"
    15. IDC_DIALOG DIALOG 10, 10, 200, 80
    16. STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
    17. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
    18. CAPTION "Tutorial 10c: CreateDialogParam+WndProc+Class"
    19. MENU IDC_MENU
    20. BEGIN
    21.     CONTROL "",IDC_IMG1,"Static",WS_CHILDWINDOW|WS_VISIBLE|SS_CENTERIMAGE|SS_ICON,0,0,78,100
    22.     EDITTEXT          IDC_EDIT,   5,2,111,13, ES_AUTOHSCROLL | ES_LEFT
    23.     DEFPUSHBUTTON    "Say Hello", IDC_BUTTON,    121,2,52,13
    24.     PUSHBUTTON      "E&xit", IDC_EXIT,  121,18,52,13
    25. END
    26. IDC_MENU  MENU
    27. BEGIN
    28.     POPUP "Test Controls"
    29.     BEGIN
    30.         MENUITEM "Say Hello",IDM_SAYHELLO
    31.         MENUITEM "Get Text",IDM_GETTEXT
    32.         MENUITEM "Clear Edit Box",IDM_CLEAR
    33.         MENUITEM "", , 0x0800 /*MFT_SEPARATOR*/
    34.         MENUITEM "E&xit",IDM_EXIT
    35.     END
    36. END

    Разбор полетов

    Давайте проанализируем первый пример.
    Этот пример показывает, как зарегистрировать диалоговый шаблон как класс окна и создает «окно» из этого класса. Это упрощает вашу программу, так как вам не нужно создавать дочерние элементы управления самостоятельно.
    Анализ шаблона окна диалога.
    Код (C):
    1. IDC_DIALOG DIALOG 10, 10, 200, 80
    Объявление ID диалога, в данном случае ― IDC_DIALOG=200, за которым следует ключевое слово «DIALOG». Следующие четыре числа ― это значения координат x, y, ширины и высоты диалогового окна в специальных единицах (не в пикселях).
    Код (C):
    1. STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
    2. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
    3.  
    Объявление стилей диалогового окна.
    Код (C):
    1. CAPTION "Tutorial 10c: CreateDialogParam+WndProc+Class"
    Это текст, который появится в заголовке окна.
    А это строка из asm-файла
    Код (ASM):
    1. ClassName db 'DLGCLASS',0
    Эта строка позволяет нам использовать шаблон диалогового окна в качестве класса окна. Диалог использует меню
    Код (C):
    1. MENU IDC_MENU
    Данный блок определяет дочерние элементы управления в диалоговом окне. Они определены между ключевыми словами BEGIN и END.
    Код (C):
    1. BEGIN
    2.     CONTROL "",IDC_IMG1,"Static",WS_CHILDWINDOW|WS_VISIBLE|SS_CENTERIMAGE|SS_ICON,0,0,78,100
    3.     EDITTEXT          IDC_EDIT,   5,2,111,13, ES_AUTOHSCROLL | ES_LEFT
    4.     DEFPUSHBUTTON    "Say Hello", IDC_BUTTON,    121,2,52,13
    5.     PUSHBUTTON      "E&xit", IDC_EXIT,  121,18,52,13
    6. END
    Общий синтаксис таков:
    Код (C):
    1. тип_элемента_управления  "текст на элементе управления", идентификатор_элемента_управления, x, y (координаты левого верхнего угла элемента), ширина, высота[,стили]
    типы элементов управления ― константы компилятора ресурсов, которые можно найти в руководстве по компилятору ресурсов.
    Теперь мы углубляемся непосредственно в ассемблерный код. Интересующая нас часть находится в структуре класса окна.
    Код (ASM):
    1. push DLGWINDOWEXTRA;mov   wc.cbWndExtra,DLGWINDOWEXTRA
    2. push rdi;mov   wc.lpszClassName,OFFSET ClassName
    Обычно этот параметр оставляется равным нулю, но если мы хотим зарегистрировать шаблон диалогового окна как класс окна, мы должны установить это параметр равным DLGWINDOWEXTRA. Заметьте, что имя класса должно совпадать с именем, что определено в шаблон диалогового окна. Остающиеся параметры инициализируются как обычно. После того, как вы заполните структуру класса окна, зарегистрируйте ее с помощью RegisterClassEx. Звучит знакомо. Точно также вы регистрируете обычный класс окна.
    Код (ASM):
    1. invoke CreateDialogParam,esi,IDC_DIALOG,0,&dialog_procedure,hIcon
    После регистрации «класса окна», мы создаем наше диалоговое окно. В этом примере он создается как независимое диалоговое окно функцией CreateDialogParam. Эта функция получает 5 параметров, но вам нужно заполнить только первые два: дескриптор процесса и указатель на имя шаблона диалогового окна. Заметьте, что 2-ой параметр ― это не указатель на имя класса.
    В этот момент, диалоговое окно и его дочерние элементы управления создаются Windows. Ваша процедура окна получит сообщение WM_INITDIALOG как обычно.
    Код (ASM):
    1. wmINITDIALOG:invoke SendMessage,hDlg,WM_SETICON,1,lParam
    2.         invoke GetDlgItem,hDlg,IDC_IMG1
    3.         invoke SendMessage,eax,STM_SETIMAGE,IMAGE_ICON,lParam
    4.         invoke GetDlgItem,hDlg,IDC_EDIT
    5.         invoke SetFocus,eax
    После того, как диалоговое окно создано, устанавливается фокус ввода на окне редактирования. Функция GetDlgItem получает ID элемента управления и возвращает соответствующий дескриптор окна. Так же можно получить дескриптор окна, если вы знаете его control ID.
    Код (ASM):
    1.     lea edi,msg
    2. message_loop:invoke GetMessage,edi,0,0,0
    3.         or eax,eax
    4.         jz exit_msg_loop
    5.         invoke IsDialogMessage,hwnd,edi
    6.         or eax,eax
    7.         jnz message_loop
    8.         invoke DispatchMessage,edi
    9.         jmp message_loop
    10. exit_msg_loop:invoke RtlExitUserProcess,NULL
    Программа входит в цикл сообщений и перед тем, как мы транслируем и передаем сообщения, мы вызываем функцию IsDialogMessage, чтобы позволить менеджеру диалоговых сообщений обрабатывать логику сообщений за нас. Если эта функция возвращает TRUE, это значит, что сообщение сделано для диалогового окна и обрабатывается менеджером диалоговых сообщений. Когда процедура окна хочет получить текст из окна редактирования, она вызывает функцию GetDlgItemText, вместо функции GetWindowText. GetDlgItemText принимает ID элемента управления вместо дескриптора окна.
    Скачайте пример здесь.
    02.png
     

    Вложения:

    • 00.png
      00.png
      Размер файла:
      580,2 КБ
      Просмотров:
      1.038
    • tut_10c.zip
      Размер файла:
      58,2 КБ
      Просмотров:
      144
    Последнее редактирование: 25 мар 2019
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.993

    DialogBoxParam+DlgProc


    [​IMG]
    текст файла tut_10a.asm
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. IDM_SAYHELLO equ 0
    4. IDM_GETTEXT equ 1
    5. IDM_CLEAR equ 2
    6. IDM_EXIT equ 3
    7. IDC_EDIT equ 0
    8. IDC_BUTTON equ 1
    9. IDC_EXIT equ 2
    10. IDC_MENU equ 100
    11. IDC_DIALOG equ 200
    12. IDC_ICON1 equ 500
    13. IDC_IMG1 equ 102
    14. .code
    15. WinMain proc
    16. enter 30h,0
    17.  
    18.         invoke LoadImage,IMAGE_BASE,IDC_ICON1,IMAGE_ICON,128,128, LR_DEFAULTCOLOR
    19.        mov hIcon,rax
    20.        mov qword ptr [ebp-10h],rax;IDC_MENU
    21.        invoke DialogBoxParam,IMAGE_BASE,IDC_DIALOG,0,&dialog_procedure
    22.        invoke RtlExitUserProcess,NULL
    23. WinMain endp
    24. dialog_procedure proc hDlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    25. size_of_buffer equ 96
    26. local buffer[size_of_buffer]:BYTE
    27.  
    28.        mov hDlg,rcx
    29.        mov lParam,r9
    30.  
    31.        cmp edx,WM_CLOSE
    32.        je wmCLOSE
    33.        cmp edx,WM_INITDIALOG
    34.        je wmINITDIALOG
    35.        cmp edx,WM_COMMAND
    36.        jne wmBYE
    37. wmCOMMAND:movzx eax,r8w ;movzx eax,word ptr wParam
    38.        or r9,r9 ;cmp lParam,0
    39.        jnz @f
    40.        jmp [menu_handlers+rax*8]
    41. @@: dec eax ;cmp eax,IDC_BUTTON=1
    42.        jne @f
    43. SAYHELLO:mov r8d,offset expTxt
    44.        jmp @0
    45. @@: dec eax ;cmp eax,IDC_EXIT=2
    46.        jne wmBYE
    47.        invoke SendMessage,,WM_CLOSE,0,0
    48.        jmp wmBYE
    49. wmINITDIALOG:invoke SendMessage,,WM_SETICON,1;,r9=lParam
    50.         invoke GetDlgItem,hDlg,IDC_IMG1
    51.        invoke SendMessage,eax,STM_SETIMAGE,IMAGE_ICON,lParam
    52.        jmp wmBYE
    53. CLEAR: xor r8d,r8d
    54. @0: invoke SetDlgItemText,,0
    55.        jmp wmBYE
    56. GETTEXT:invoke GetDlgItemText,,0,&buffer,size_of_buffer
    57.        lea edx,buffer
    58.        mov mb.lpszText,rdx
    59.        invoke MessageBoxIndirect,&mb
    60.        jmp wmBYE
    61. wmCLOSE:invoke EndDialog,,0
    62. wmBYE:  xor eax,eax
    63.        leave
    64.        retn
    65. menu_handlers dq SAYHELLO,GETTEXT,CLEAR,wmCLOSE
    66. dialog_procedure endp
    67. ;---------------------------------------
    68. expTxt db "Wow! I'm in an edit box now",0
    69. AppName db 'Our First Dialog Box',0
    70. hIcon      dq ?
    71. mb label   MSGBOXPARAMS
    72.   dd sizeof MSGBOXPARAMS,?;cbSize
    73.   dq 0  ;hwndOwner
    74.   dq IMAGE_BASE  ;hInstance
    75.   dq ?  ;lpszText
    76.   dq AppName  ;lpszCaption
    77.   dd MB_OK or MB_USERICON,?;dwStyle
    78.   dq IDC_ICON1  ;lpszIcon
    79.   dd 0,?;dwContextHelpId
    80.   dq 0  ;lpfnMsgBoxCallback
    81.   dd 0,?;dwLanguageId
    82. end
    Текст файла tut_10a.rc
    Код (C):
    1. #include "resource.h"
    2. #define IDM_SAYHELLO 0
    3. #define IDM_GETTEXT 1
    4. #define IDM_CLEAR 2
    5. #define IDM_EXIT 3
    6. #define IDC_EDIT 0
    7. #define IDC_BUTTON 1
    8. #define IDC_EXIT 2
    9. #define IDC_MENU 100
    10. #define IDC_DIALOG 200
    11. #define IDC_ICON1 500
    12. #define IDC_IMG1 102
    13. IDC_ICON1 ICON "icon3.ico"
    14. IDC_DIALOG DIALOG 10, 10, 200, 80
    15. STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
    16. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
    17. CAPTION "Tutorial 10a: DialogBoxParam+DlgProc"
    18. MENU IDC_MENU
    19. BEGIN
    20.     CONTROL   "",IDC_IMG1,"Static",WS_CHILDWINDOW|WS_VISIBLE|SS_CENTERIMAGE|SS_ICON,0,0,78,100
    21.     EDITTEXT   IDC_EDIT,   5,2,111,13, ES_AUTOHSCROLL | ES_LEFT
    22.     DEFPUSHBUTTON "Say Hello", IDC_BUTTON,    121,2,52,13
    23.     PUSHBUTTON   "E&xit", IDC_EXIT,  121,18,52,13
    24. END
    25. IDC_MENU  MENU
    26. BEGIN
    27.     POPUP "Test Controls"
    28.     BEGIN
    29.         MENUITEM "Say Hello",IDM_SAYHELLO
    30.         MENUITEM "Get Text",IDM_GETTEXT
    31.         MENUITEM "Clear Edit Box",IDM_CLEAR
    32.         MENUITEM SEPARATOR
    33.         MENUITEM "E&xit",IDM_EXIT
    34.     END
    35. END

    Разбор полетов

    Код (C):
    1. INT_PTR WINAPI DialogBoxParam(
    2.   _In_opt_ HINSTANCE hInstance, //дескриптор процесса
    3.   _In_ LPCTSTR  lpTemplateName, //имя шаблона диалогового окна
    4.   _In_opt_ HWND  hWndParent, //дескриптор родительского окна
    5.   _In_opt_ DLGPROC  lpDialogFunc, //адрес процедуры диалогового окна
    6.   _In_ LPARAM  dwInitParam //специальные данные для диалогового окна
    7. );
    DialogBoxParam создает модальное диалоговое окно. Оно не передает управление, пока диалоговое окно не будет уничтожено.
    Код (ASM):
    1.    cmp edx,WM_CLOSE
    2.    je wmCLOSE
    3.    cmp edx,WM_INITDIALOG
    4.    je wmINITDIALOG
    5.    cmp edx,WM_COMMAND
    6.    jne wmBYE
    7. wmCOMMAND: ...
    Процедура диалогового окна выглядит как процедура окна, не считая того, что она не получает сообщение WM_CREATE. Первое сообщение, которое она получает ― это WM_INITDIALOG. Обычно вы помещаете здесь код инициализации. Заметьте, что вы должны вернуть в регистре eax значение TRUE, если вы обрабатываете это сообщение.
    Внутренний менеджер диалогового окна не посылает нашей процедуре сообщение WM_DESTROY, а вот WM_CLOSE шлет. Поэтому если мы хотим отреагировать на то, что пользователь нажимает кнопку закрытия на нашем диалоговом окне, мы должны обработать сообщение WM_CLOSE. В нашем примере мы посылаем сообщение WM_CLOSE со значение IDM_EXIT в wParam. Это произведет тот же эффект, что и выбор пункта 'Exit' в меню. EndDialog вызывается в ответ на IDM_EXIT.
    Обработка сообщений WM_COMMAND остается такой же.
    Когда вы хотите уничтожить диалоговое окно ― это вызывайте функцию EndDialog. Не пробуйте DestroyWindow! EndDialog не уничтожает диалоговое окно немедленно. Она только устанавливает флаг для внутреннего менеджера диалогового окна и продолжает выполнять следующие инструкции.
    Теперь давайте изучим файл ресурсов. Заметное изменение ― это то, что вместо использования текстовой строки в качестве имени меню, мы используем значение IDC_MENU. Это необходимо, если вы хотите прикрепить меню к диалоговому окну, созданному DialogBoxParam'ом. Заметьте, что в шаблоне диалогового окна вы должны добавить ключевое слово 'MENU', за которым будет следовать ID ресурса меню.
    Чтобы установить иконку, посылаем сообщение WM_SETICON диалоговому окну во время обработки WM_INITDIALOG. Используем "нестандартую" иконку с размером 128х128 (размер стандартной иконки 32х32)
    Скачайте пример здесь.
    00.png
     

    Вложения:

    • 00.png
      00.png
      Размер файла:
      52,5 КБ
      Просмотров:
      1.033
    Последнее редактирование: 28 мар 2019
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.993

    CreateDialogParam+DlgProc

    [​IMG]

    файл tut_10b.asm

    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. IDM_SAYHELLO equ 0
    4. IDM_GETTEXT equ 1
    5. IDM_CLEAR equ 2
    6. IDM_EXIT equ 3
    7. IDC_EDIT equ 0
    8. IDC_BUTTON equ 1
    9. IDC_EXIT equ 2
    10. IDC_MENU equ 100
    11. IDC_DIALOG equ 200
    12. IDC_ICON1 equ 500
    13. IDC_IMG1 equ 102
    14. .code
    15. WinMain proc
    16. local msg:MSG
    17.  
    18.         invoke LoadImage,IMAGE_BASE,IDC_ICON1,IMAGE_ICON,128,128, LR_DEFAULTCOLOR
    19.        mov hIcon,rax
    20.        invoke CreateDialogParam,IMAGE_BASE,IDC_DIALOG,0,&dialog_procedure,eax
    21.        mov hWnd,rax
    22.        lea edi,msg
    23. message_loop: invoke GetMessage,edi,0,0,0
    24.        or eax,eax
    25.        jz exit_msg_loop
    26.        invoke IsDialogMessage,hWnd,edi
    27.        or eax,eax
    28.        jnz message_loop
    29.        invoke DispatchMessage,edi
    30.       jmp message_loop
    31. exit_msg_loop:invoke RtlExitUserProcess,NULL
    32. WinMain endp
    33. dialog_procedure proc hDlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    34. size_of_buffer equ 96
    35. local buffer[size_of_buffer]:BYTE
    36.  
    37.        mov hDlg,rcx
    38.        mov lParam,r9
    39.  
    40.        cmp edx,WM_CLOSE
    41.        je wmCLOSE
    42.         cmp edx,WM_INITDIALOG
    43.        je wmINITDIALOG
    44.        cmp edx,WM_COMMAND
    45.        jne wmBYE
    46. wmCOMMAND:movzx eax,r8w ;movzx eax,word ptr wParam
    47.        or r9,r9 ;cmp lParam,0
    48.        jnz @f
    49.        jmp [menu_handlers+rax*8]; choose menu
    50. ; choose button or EditBox
    51. @@: dec eax ;cmp eax,IDC_BUTTON=1
    52.        jne @f
    53. SAYHELLO:mov r8d,offset expTxt
    54.        jmp @0
    55. @@: dec eax ;cmp eax,IDC_EXIT=2
    56.        jne wmBYE
    57.        invoke SendMessage,,WM_CLOSE,0,0
    58.        jmp wmBYE
    59. wmINITDIALOG:invoke SendMessage,,WM_SETICON,1;,r9=lParam
    60.         invoke GetDlgItem,hDlg,IDC_IMG1
    61.        invoke SendMessage,eax,STM_SETIMAGE,IMAGE_ICON,lParam
    62.        jmp wmBYE
    63. CLEAR: xor r8d,r8d
    64. @0: invoke SetDlgItemText,,0
    65.        jmp wmBYE
    66. GETTEXT:invoke GetDlgItemText,,0,&buffer,size_of_buffer
    67.        mov r8d,offset AppName
    68.        lea edx,buffer
    69.        mov mb.lpszText,rdx
    70.         invoke MessageBoxIndirect,&mb
    71.        jmp wmBYE
    72. wmCLOSE:invoke DestroyWindow;,hDlg
    73.        invoke PostQuitMessage,0
    74. wmBYE:  xor eax,eax
    75.        leave
    76.        retn
    77. menu_handlers dq SAYHELLO,GETTEXT,CLEAR,wmCLOSE
    78. dialog_procedure endp
    79. ;---------------------------------------
    80. expTxt db "Wow! I'm in an edit box now",0
    81. AppName db 'Our Second Dialog Box',0
    82. hWnd dq ?
    83. hIcon      dq ?
    84. mb label   MSGBOXPARAMS
    85.   dd sizeof MSGBOXPARAMS,?;cbSize
    86.   dq 0  ;hwndOwner
    87.   dq IMAGE_BASE  ;hInstance
    88.   dq ?  ;lpszText
    89.   dq AppName  ;lpszCaption
    90.   dd MB_OK or MB_USERICON,?;dwStyle
    91.   dq IDC_ICON1  ;lpszIcon
    92.   dd 0,?;dwContextHelpId
    93.   dq 0  ;lpfnMsgBoxCallback
    94.   dd 0,?;dwLanguageId
    95. end

    файл tut_10b.rc

    Код (C):
    1.  
    2. #include "resource.h"
    3. #define IDM_SAYHELLO 0
    4. #define IDM_GETTEXT 1
    5. #define IDM_CLEAR 2
    6. #define IDM_EXIT 3
    7. #define IDC_EDIT 0
    8. #define IDC_BUTTON 1
    9. #define IDC_EXIT 2
    10. #define IDC_MENU 100
    11. #define IDC_DIALOG 200
    12. #define IDC_ICON1 500
    13. #define IDC_IMG1 102
    14. IDC_ICON1 ICON  "icon3.ico"
    15. IDC_DIALOG DIALOG 10, 10, 200, 80
    16. STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
    17. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
    18. CAPTION "Tutorial 10b: CreateDialogParam+DlgProc"
    19. MENU IDC_MENU
    20. BEGIN
    21.     CONTROL   "",IDC_IMG1,"Static",WS_CHILDWINDOW|WS_VISIBLE|SS_CENTERIMAGE|SS_ICON,0,0,78,100
    22.     EDITTEXT IDC_EDIT,   5,2,111,13, ES_AUTOHSCROLL | ES_LEFT
    23.     DEFPUSHBUTTON "Say Hello", IDC_BUTTON,121,2,52,13
    24.     PUSHBUTTON "E&xit", IDC_EXIT,  121,18,52,13
    25. END
    26. IDC_MENU  MENU
    27. BEGIN
    28.     POPUP "Test Controls"
    29.     BEGIN
    30.         MENUITEM "Say Hello",IDM_SAYHELLO
    31.         MENUITEM "Get Text",IDM_GETTEXT
    32.         MENUITEM "Clear Edit Box",IDM_CLEAR
    33.         MENUITEM "", , 0x0800 /*MFT_SEPARATOR*/
    34.         MENUITEM "E&xit",IDM_EXIT
    35.     END
    36. END
    Скачайте пример здесь.
    01.png
     

    Вложения:

    • 0.png
      0.png
      Размер файла:
      261,7 КБ
      Просмотров:
      1.076
    Последнее редактирование: 27 мар 2019
  13. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.993

    CreateDialogParam+DlgProc+WndProc

    [​IMG]

    файл tut_10d.asm

    Код (ASM):
    1.  
    2. ; GUI #
    3. include win64a.inc
    4. IDM_SAYHELLO equ 0
    5. IDM_GETTEXT equ 1
    6. IDM_CLEAR equ 2
    7. IDM_EXIT equ 3
    8. IDC_EDIT equ 0
    9. IDC_BUTTON equ 1
    10. IDC_EXIT equ 2
    11. IDC_MENU equ 100
    12. IDC_DIALOG equ 200
    13. IDC_ICON1 equ 500
    14. IDC_IMG1 equ 102
    15. .code
    16. WinMain proc
    17. local msg:MSG
    18.  
    19.       invoke LoadImage,IMAGE_BASE,IDC_ICON1,IMAGE_ICON,128,128, LR_DEFAULTCOLOR
    20.        mov hIcon,rax
    21.        invoke CreateDialogParam,IMAGE_BASE,IDC_DIALOG,0,&dialog_procedure,eax
    22.        mov hWnd,rax
    23.        lea edi,msg
    24. @@: invoke GetMessage,edi,0,0,0
    25.        invoke IsDialogMessage,hWnd,edi
    26.        or eax,eax
    27.        jnz @b
    28.        invoke TranslateMessage,edi
    29.        invoke DispatchMessage,edi
    30.        jmp @b
    31. WinMain endp
    32. dialog_procedure proc hDlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    33.        
    34.        mov hDlg,rcx
    35.         mov lParam,r9
    36.  
    37.        cmp edx,WM_INITDIALOG
    38.        jne wmBYE
    39. wmINITDIALOG:;mov rcx,hWnd
    40.        invoke GetWindowLongPtr,,GWL_STYLE
    41.        or eax,WS_THICKFRAME OR WS_MINIMIZEBOX OR WS_MAXIMIZEBOX
    42.        invoke SetWindowLongPtr,hDlg,GWL_STYLE,rax
    43.        invoke SetWindowLongPtr,hDlg,GWL_WNDPROC,&WndProc
    44.        invoke LoadIcon,IMAGE_BASE,IDC_ICON1
    45.        invoke SendMessage,hDlg,WM_SETICON,1,rax
    46.         invoke GetDlgItem,hDlg,IDC_IMG1
    47.        invoke SendMessage,eax,STM_SETIMAGE,IMAGE_ICON,lParam
    48. wmBYE: xor eax,eax
    49.        leave
    50.        retn
    51. dialog_procedure endp
    52. WndProc proc hwnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    53. size_of_buffer equ 96
    54. local buffer[size_of_buffer]:BYTE
    55.  
    56.        mov hwnd,rcx
    57.        mov wParam,r8
    58.        mov lParam,r9
    59.  
    60.        cmp edx,WM_CLOSE
    61.        je wmCLOSE
    62.        cmp edx,WM_COMMAND
    63.        je wmCOMMAND
    64.        leave
    65.        jmp NtdllDialogWndProc_
    66. wmCLOSE:invoke DestroyWindow
    67.        invoke RtlExitUserProcess,NULL
    68. wmCOMMAND:movzx rax,r8w ;movzx eax,word ptr wParam
    69.        or r9,r9 ;cmp lParam,0
    70.        jnz @f
    71.        jmp [menu_handlers+rax*8]; choose menu
    72. ; choose button or EditBox
    73. @@: dec eax ;cmp eax,IDC_BUTTON=1
    74.        jne @f
    75. SAYHELLO:mov r8d,offset expTxt
    76.        jmp @0
    77. @@: dec eax ;cmp eax,IDC_EXIT=2
    78.        jne wmBYE
    79.        invoke SendMessage,,WM_CLOSE,0,0
    80.        jmp wmBYE
    81. CLEAR:xor r8d,r8d
    82. @0: invoke SetDlgItemText,,0
    83.        jmp wmBYE
    84. GETTEXT:lea r8d,buffer
    85.        invoke GetDlgItemText,,0,,size_of_buffer
    86.        lea edx,buffer
    87.        mov mb.lpszText,rdx
    88.        invoke MessageBoxIndirect,&mb
    89. wmBYE: leave
    90.        retn
    91. menu_handlers dq SAYHELLO,GETTEXT,CLEAR,wmCLOSE
    92. WndProc endp
    93. ;---------------------------------------
    94. expTxt db "Wow! I'm in an edit box now",0
    95. AppName db 'Our Fourth Dialog Box',0
    96. hWnd dq ?
    97. hIcon      dq ?
    98. mb label   MSGBOXPARAMS
    99.   dd sizeof MSGBOXPARAMS,?;cbSize
    100.   dq 0  ;hwndOwner
    101.   dq IMAGE_BASE  ;hInstance
    102.   dq ?  ;lpszText
    103.   dq AppName  ;lpszCaption
    104.   dd MB_OK or MB_USERICON,?;dwStyle
    105.   dq IDC_ICON1  ;lpszIcon
    106.   dd 0,?;dwContextHelpId
    107.   dq 0  ;lpfnMsgBoxCallback
    108.   dd 0,?;dwLanguageId
    109. end
    110.  

    файл tut_10d.rc

    Код (C):
    1.  
    2. #include "resource.h"
    3. #define IDM_SAYHELLO 0
    4. #define IDM_GETTEXT 1
    5. #define IDM_CLEAR 2
    6. #define IDM_EXIT 3
    7. #define IDC_EDIT 0
    8. #define IDC_BUTTON 1
    9. #define IDC_EXIT 2
    10. #define IDC_MENU 100
    11. #define IDC_DIALOG 200
    12. #define IDC_ICON1 500
    13. #define IDC_IMG1 102
    14. IDC_ICON1 ICON "icon3.ico"
    15. IDC_DIALOG DIALOG 10, 10, 200, 80
    16. STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
    17. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
    18. CAPTION "Tutorial 10d: CreateDialogParam+DlgProc+WndProc"
    19. MENU IDC_MENU
    20. BEGIN
    21. //    ICON IDC_ICON1,WS_VISIBLE | WS_CHILD | SS_ICON, 5,10,32,32
    22.     CONTROL   "",IDC_IMG1,"Static",WS_CHILDWINDOW|WS_VISIBLE|SS_CENTERIMAGE|SS_ICON,0,0,78,100
    23.     EDITTEXT         IDC_EDIT,   5,2,111,13, ES_AUTOHSCROLL | ES_LEFT
    24.     DEFPUSHBUTTON   "Say Hello", IDC_BUTTON,    121,2,52,13
    25.     PUSHBUTTON      "E&xit", IDC_EXIT,  121,18,52,13
    26. END
    27. IDC_MENU  MENU
    28. BEGIN
    29.     POPUP "Test Controls"
    30.     BEGIN
    31.         MENUITEM "Say Hello",IDM_SAYHELLO
    32.         MENUITEM "Get Text",IDM_GETTEXT
    33.         MENUITEM "Clear Edit Box",IDM_CLEAR
    34.         MENUITEM SEPARATOR
    35.         MENUITEM "E&xit",IDM_EXIT
    36.     END
    37. END
    Скачайте пример здесь.
    03.png
     

    Вложения:

    • 0.png
      0.png
      Размер файла:
      278,3 КБ
      Просмотров:
      1.103
    Последнее редактирование: 27 мар 2019
  14. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.993

    DialogBoxParam+DlgProc+WndProc

    [​IMG]

    файл tut_10e.asm

    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. IDM_SAYHELLO equ 0
    4. IDM_GETTEXT equ 1
    5. IDM_CLEAR equ 2
    6. IDM_EXIT equ 3
    7. IDC_EDIT equ 0
    8. IDC_BUTTON equ 1
    9. IDC_EXIT equ 2
    10. IDC_MENU equ 100
    11. IDC_DIALOG equ 200
    12. IDC_ICON1 equ 500
    13. IDC_IMG1 equ 102
    14. .code
    15. WinMain proc
    16. local msg:MSG
    17.  
    18.       invoke LoadImage,IMAGE_BASE,IDC_ICON1,IMAGE_ICON,128,128, LR_DEFAULTCOLOR
    19.        mov hIcon,rax
    20.        invoke DialogBoxParam,IMAGE_BASE,IDC_DIALOG,0,&dialog_procedure,rax
    21.        invoke RtlExitUserProcess,NULL
    22. WinMain endp
    23. dialog_procedure proc hDlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    24.  
    25.        mov hDlg,rcx
    26.        mov lParam,r9
    27.  
    28.        cmp edx,WM_INITDIALOG
    29.        jne wmBYE
    30. wmINITDIALOG:invoke GetWindowLongPtr,,GWL_STYLE
    31.        or eax,WS_THICKFRAME OR WS_MINIMIZEBOX OR WS_MAXIMIZEBOX
    32.        invoke SetWindowLongPtr,hDlg,,GWL_STYLE,rax
    33.        invoke SetWindowLongPtr,hDlg,GWL_WNDPROC,&WndProc
    34.        invoke LoadIcon,IMAGE_BASE,IDC_ICON1
    35.        invoke SendMessage,hDlg,WM_SETICON,1,rax
    36.         invoke GetDlgItem,hDlg,IDC_IMG1
    37.        invoke SendMessage,eax,STM_SETIMAGE,IMAGE_ICON,lParam
    38. wmBYE: xor eax,eax
    39.        leave
    40.        retn
    41. dialog_procedure endp
    42. WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    43. size_of_buffer equ 96
    44. local buffer[size_of_buffer]:BYTE
    45.  
    46.        mov hWnd,rcx
    47.        mov wParam,r8
    48.        mov lParam,r9
    49.  
    50.        cmp edx,WM_CLOSE
    51.        je wmCLOSE
    52.        cmp edx,WM_COMMAND
    53.        je wmCOMMAND
    54.        leave
    55.        jmp NtdllDialogWndProc_
    56. wmCLOSE:invoke EndDialog,,0
    57.        jmp wmBYE
    58. wmCOMMAND:movzx rax,r8w ;movzx eax,word ptr wParam
    59.        or r9,r9 ;cmp lParam,0
    60.        jnz @f
    61.        jmp [menu_handlers+rax*8]; choose menu
    62. ; choose button or EditBox
    63. @@: dec eax ;cmp eax,IDC_BUTTON=1
    64.        jne @f
    65. SAYHELLO:mov r8d,offset expTxt
    66.        jmp @0
    67. @@: dec eax ;cmp eax,IDC_EXIT=2
    68.        jne wmBYE
    69.        invoke SendMessage,,WM_CLOSE,0,0
    70.        jmp wmBYE
    71. CLEAR:xor r8d,r8d
    72. @0: invoke SetDlgItemText,,0
    73.        jmp wmBYE
    74. GETTEXT:invoke GetDlgItemText,,0,&buffer,size_of_buffer
    75.        lea edx,buffer
    76.        mov mb.lpszText,rdx
    77.        invoke MessageBoxIndirect,&mb
    78. wmBYE: leave
    79.        retn
    80. menu_handlers dq SAYHELLO,GETTEXT,CLEAR,wmCLOSE
    81. WndProc endp
    82. ;---------------------------------------
    83. expTxt db "Wow! I'm in an edit box now",0
    84. AppName1 db 'Our Fifth Dialog Box',0
    85. hIcon      dq ?
    86. mb label   MSGBOXPARAMS
    87.   dd sizeof MSGBOXPARAMS,?;cbSize
    88.   dq 0  ;hwndOwner
    89.   dq IMAGE_BASE  ;hInstance
    90.   dq ?  ;lpszText
    91.   dq AppName1  ;lpszCaption
    92.   dd MB_OK or MB_USERICON,?;dwStyle
    93.   dq IDC_ICON1  ;lpszIcon
    94.   dd 0,?;dwContextHelpId
    95.   dq 0  ;lpfnMsgBoxCallback
    96.   dd 0,?;dwLanguageId
    97. end

    файл tut_10e.rc

    Код (C):
    1.  
    2. #include "resource.h"
    3. #define IDM_SAYHELLO 0
    4. #define IDM_GETTEXT 1
    5. #define IDM_CLEAR 2
    6. #define IDM_EXIT 3
    7. #define IDC_EDIT 0
    8. #define IDC_BUTTON 1
    9. #define IDC_EXIT 2
    10. #define IDC_MENU 100
    11. #define IDC_DIALOG 200
    12. #define IDC_ICON1 500
    13. #define IDC_IMG1 102
    14. IDC_ICON1 ICON "icon3.ico"
    15. IDC_DIALOG DIALOG 10, 10, 200, 80
    16. STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
    17. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
    18. CAPTION "Tutorial 10e: DialogBoxParam+DlgProc+WndProc"
    19. MENU IDC_MENU
    20. BEGIN
    21. CONTROL   "",IDC_IMG1,"Static",WS_CHILDWINDOW|WS_VISIBLE|SS_CENTERIMAGE|SS_ICON,0,0,78,100
    22.     EDITTEXT   IDC_EDIT,   5,2,111,13, ES_AUTOHSCROLL | ES_LEFT
    23.     DEFPUSHBUTTON "Say Hello", IDC_BUTTON,    121,2,52,13
    24.     PUSHBUTTON   "E&xit", IDC_EXIT,  121,18,52,13
    25. END
    26. IDC_MENU  MENU
    27. BEGIN
    28.     POPUP "Test Controls"
    29.     BEGIN
    30.         MENUITEM "Say Hello",IDM_SAYHELLO
    31.         MENUITEM "Get Text",IDM_GETTEXT
    32.         MENUITEM "Clear Edit Box",IDM_CLEAR
    33.         MENUITEM SEPARATOR
    34.         MENUITEM "E&xit",IDM_EXIT
    35.     END
    36. END
    Скачайте пример здесь.
    04.png
     

    Вложения:

    • 0.png
      0.png
      Размер файла:
      217,6 КБ
      Просмотров:
      1.019
    Последнее редактирование: 27 мар 2019
  15. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.993

    DialogBoxParam+WndProc+Class

    [​IMG]

    файл tut_10f.asm

    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. IDM_SAYHELLO equ 0
    4. IDM_GETTEXT equ 1
    5. IDM_CLEAR equ 2
    6. IDM_EXIT equ 3
    7. IDC_EDIT equ 0
    8. IDC_BUTTON equ 1
    9. IDC_EXIT equ 2
    10. IDC_MENU equ 100
    11. IDC_DIALOG equ 200
    12. IDC_ICON1 equ 500
    13. IDC_IMG1 equ 102
    14. .code
    15. WinMain proc
    16. local msg:MSG
    17.         mov esi,IMAGE_BASE
    18. invoke LoadImage,esi,IDC_ICON1,IMAGE_ICON,128,128,LR_DEFAULTCOLOR
    19. mov hIcon,rax
    20. xor ebx,ebx  
    21. push rax ;hIconSm
    22. push rbx ;lpszClassName
    23. push IDC_MENU ;lpszMenuName
    24. push COLOR_BTNFACE+1;hbrBackground
    25. push 10005h ;hCursor
    26. push rax      ;hIcon
    27. push rsi ;hInstance
    28. push DLGWINDOWEXTRA;cbClsExtra & cbWndExtra
    29. push rbx ;lpfnWndProc
    30. push sizeof WNDCLASSEX;cbSize & style
    31. invoke RegisterClassEx,esp ;addr WNDCLASSEX
    32. invoke DialogBoxParam,esi,IDC_DIALOG,0,&WndProc,hIcon
    33. invoke RtlExitUserProcess,NULL
    34. WinMain endp
    35. WndProc proc hDlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    36. size_of_buffer equ 96
    37. local buffer[size_of_buffer]:BYTE
    38.         mov hDlg,rcx
    39. mov lParam,r9
    40. cmp edx,WM_CLOSE
    41. je wmCLOSE
    42.         cmp edx,WM_INITDIALOG
    43. je wmINITDIALOG
    44. cmp edx,WM_COMMAND
    45. jne wmBYE
    46. wmCOMMAND:movzx rax,r8w ;movzx eax,word ptr wParam
    47. or r9,r9 ;cmp lParam,0
    48. jnz @f
    49. jmp [menu_handlers+rax*8]
    50. @@: dec eax ;cmp eax,IDC_BUTTON=1
    51. jne @f
    52. SAYHELLO:mov r8d,offset expTxt
    53. jmp @0
    54. @@: dec eax ;cmp eax,IDC_EXIT=2
    55. jne wmBYE
    56. invoke SendMessage,,WM_CLOSE,0,0
    57. jmp wmBYE
    58. wmINITDIALOG:invoke SendMessage,,WM_SETICON,1;,r9=lParam
    59.         invoke GetDlgItem,hDlg,IDC_IMG1
    60. invoke SendMessage,eax,STM_SETIMAGE,IMAGE_ICON,lParam
    61. jmp wmBYE
    62. CLEAR: xor r8d,r8d
    63. @0: invoke SetDlgItemText,,0
    64. jmp wmBYE
    65. GETTEXT:invoke GetDlgItemText,,0,&buffer,size_of_buffer
    66. lea edx,buffer
    67. mov mb.lpszText,rdx
    68. lea ecx,mb
    69. invoke MessageBoxIndirect
    70. jmp wmBYE
    71. wmCLOSE:invoke EndDialog,,0
    72. wmBYE:  xor eax,eax
    73. leave
    74. retn
    75. menu_handlers dq SAYHELLO,GETTEXT,CLEAR,wmCLOSE
    76. WndProc endp
    77. ;---------------------------------------
    78. expTxt db "Wow! I'm in an edit box now",0
    79. AppName db 'Our Sixth Dialog Box',0
    80. hIcon      dq ?
    81. mb label   MSGBOXPARAMS
    82.   dd sizeof MSGBOXPARAMS,?;cbSize
    83.   dq 0  ;hwndOwner
    84.   dq IMAGE_BASE  ;hInstance
    85.   dq ?  ;lpszText  
    86.   dq AppName  ;lpszCaption
    87.   dd MB_OK or MB_USERICON,?;dwStyle
    88.   dq IDC_ICON1  ;lpszIcon
    89.   dd 0,?;dwContextHelpId
    90.   dq 0  ;lpfnMsgBoxCallback
    91.   dd 0,?;dwLanguageId
    92. end

    файл tut_10f.rc

    Код (C):
    1. #include "resource.h"
    2. #define IDM_SAYHELLO 0
    3. #define IDM_GETTEXT 1
    4. #define IDM_CLEAR 2
    5. #define IDM_EXIT 3
    6. #define IDC_EDIT 0
    7. #define IDC_BUTTON 1
    8. #define IDC_EXIT 2
    9. #define IDC_MENU 100
    10. #define IDC_DIALOG 200
    11. #define IDC_ICON1 500
    12. #define IDC_IMG1 102
    13. IDC_ICON1 ICON "icon3.ico"
    14. IDC_DIALOG DIALOGEX 10, 10, 200, 80
    15. STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
    16. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
    17. CAPTION "Tutorial #10f: DialogBoxParam+WndProc+Class"
    18. //CAPTION "Tutorial #10k: DialogBoxIndirectParam+DlgProc+WndProc"
    19. MENU IDC_MENU
    20. BEGIN
    21.     CONTROL   "",IDC_IMG1,"Static",WS_CHILDWINDOW|WS_VISIBLE|SS_CENTERIMAGE|SS_ICON,0,0,78,100
    22.     EDITTEXT   IDC_EDIT,   5,2,111,13, ES_AUTOHSCROLL | ES_LEFT
    23.     DEFPUSHBUTTON "Say Hello", IDC_BUTTON,    121,2,52,13
    24.     PUSHBUTTON   "E&xit", IDC_EXIT,  121,18,52,13
    25. END
    26. IDC_MENU  MENU
    27. BEGIN
    28.     POPUP "Test Controls"
    29.     BEGIN
    30.         MENUITEM "Say Hello",IDM_SAYHELLO
    31.         MENUITEM "Get Text", IDM_GETTEXT
    32.         MENUITEM "Clear Text", IDM_CLEAR
    33.         MENUITEM SEPARATOR
    34.         MENUITEM "E&xit", IDM_EXIT
    35.     END
    36. END
    Скачайте пример здесь.
    05.png
     

    Вложения:

    • 0.png
      0.png
      Размер файла:
      324,7 КБ
      Просмотров:
      1.036
    Последнее редактирование: 25 мар 2019
  16. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.993

    DialogBoxIndirectParam+DlgProc

    [​IMG]

    файл tut_10g.asm

    Код (ASM):
    1.  
    2. ; GUI #
    3. include win64a.inc
    4. IDM_SAYHELLO equ 0
    5. IDM_GETTEXT equ 1
    6. IDM_CLEAR equ 2
    7. IDM_EXIT equ 3
    8. IDC_EDIT equ 0
    9. IDC_BUTTON equ 1
    10. IDC_EXIT equ 2
    11. IDC_MENU equ 100
    12. IDC_DIALOG equ 200
    13. IDC_ICON1 equ 500
    14. IDC_IMG1 equ 102
    15. .code
    16. WinMain proc
    17. local hMem:QWORD
    18. invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,1024  ; memory buffer size
    19.       mov hMem,rax
    20. mov edi,eax
    21. mov esi,offset temp
    22. mov ecx,len/8
    23. rep movsq
    24.         invoke LoadImage,IMAGE_BASE,IDC_ICON1,IMAGE_ICON,128,128,LR_DEFAULTCOLOR
    25. invoke DialogBoxIndirectParam,IMAGE_BASE,hMem,0,&DialogFunc,rax
    26. invoke GlobalFree,hMem
    27. leave
    28. retn
    29. WinMain endp
    30. DialogFunc proc hDlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    31. size_of_buffer equ 96
    32. local buffer[size_of_buffer]:BYTE
    33.         mov hDlg,rcx
    34. mov lParam,r9
    35. cmp edx,WM_CLOSE
    36. je wmCLOSE
    37. cmp edx,WM_INITDIALOG
    38. je wmINITDIALOG
    39. cmp edx,WM_COMMAND
    40. jne wmBYE
    41. wmCOMMAND:movzx eax,r8w ;movzx eax,word ptr wParam
    42. or r9,r9 ;cmp lParam,0
    43. jnz @f
    44. jmp [menu_handlers+rax*8]
    45. @@: dec eax ;cmp eax,IDC_BUTTON=1
    46. jne @f
    47. SAYHELLO:mov r8d,offset expTxt
    48. jmp @0
    49. @@: dec eax ;cmp eax,IDC_EXIT=2
    50. jne wmBYE
    51. invoke SendMessage,,WM_CLOSE,0,0
    52. jmp wmBYE
    53. wmINITDIALOG:invoke GetDlgItem,,0
    54. invoke SetFocus,eax
    55.         invoke LoadIcon,IMAGE_BASE,IDC_ICON1
    56. invoke SendMessage,hDlg,WM_SETICON,1,rax
    57.         invoke GetDlgItem,hDlg,IDC_IMG1
    58. invoke SendMessage,eax,STM_SETIMAGE,IMAGE_ICON,lParam
    59. jmp wmBYE
    60. CLEAR: xor r8d,r8d
    61. @0: invoke SetDlgItemText,,0
    62. jmp wmBYE
    63. GETTEXT:invoke GetDlgItemText,,0,&buffer,size_of_buffer
    64. lea edx,buffer
    65.         mov mb.lpszText,rdx
    66.         lea ecx,mb
    67. invoke MessageBoxIndirect
    68. jmp wmBYE
    69. wmCLOSE:invoke EndDialog,,0
    70. wmBYE: xor eax,eax
    71. leave
    72. retn
    73. menu_handlers dq SAYHELLO,GETTEXT,CLEAR,wmCLOSE
    74. DialogFunc endp
    75. expTxt db "Wow! I'm in an edit box now",0
    76. AppName db 'Our Seventh Dialog Box',0
    77. mb label   MSGBOXPARAMS
    78.   dd sizeof MSGBOXPARAMS,?;cbSize
    79.   dq 0  ;hwndOwner
    80.   dq IMAGE_BASE  ;hInstance
    81.   dq ?  ;lpszText  
    82.   dq AppName  ;lpszCaption
    83.   dd MB_OK or MB_USERICON,?;dwStyle
    84.   dq IDC_ICON1  ;lpszIcon
    85.   dd 0,?;dwContextHelpId
    86.   dq 0  ;lpfnMsgBoxCallback
    87.   dd 0,?;dwLanguageId
    88. align 4
    89. temp:
    90. dw 1,-1
    91. dd 0,0,DS_CENTER or WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU \
    92.            or WS_VISIBLE or WS_OVERLAPPED or DS_MODALFRAME or DS_3DLOOK
    93. dw 4,10,10,200,80,-1,IDC_MENU,0
    94. du <Tutorial #10g: DialogBoxIndirectParam+DlgProcs>
    95. align 4;dw 0
    96. dd 0,0,WS_VISIBLE or WS_CHILDWINDOW or SS_ICON or SS_CENTERIMAGE
    97. dw 0,0,78,100,IDC_IMG1,0,-1,82h
    98. dd 0,0,0,WS_VISIBLE or WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or WS_BORDER or WS_TABSTOP;,0
    99. dw 5,2,111,13,IDC_EDIT,0,-1,81h
    100. dd 0,0,0,WS_VISIBLE or WS_CHILD or WS_TABSTOP or BS_DEFPUSHBUTTON
    101. dw 121,2,52,13,IDC_BUTTON,0,-1,80h
    102. du <Say Hello>
    103. dd 0,0,0,WS_VISIBLE or WS_CHILD or WS_TABSTOP or BS_PUSHBUTTON
    104. dw 121,18,52,13,IDC_EXIT,0,-1,80h
    105. du <E&xit>
    106. dw 0,0
    107. len = $ - temp
    108. end

    файл tut_10g.rc

    Код (C):
    1. #include "resource.h"
    2. #define IDM_SAYHELLO 0
    3. #define IDM_GETTEXT 1
    4. #define IDM_CLEAR 2
    5. #define IDM_EXIT 3
    6. #define IDC_EDIT 0
    7. #define IDC_BUTTON 1
    8. #define IDC_EXIT 2
    9. #define IDC_MENU 100
    10. #define IDC_DIALOG 200
    11. #define IDC_ICON1 500
    12. #define IDC_IMG1 102
    13. IDC_ICON1 ICON "icon3.ico"
    14. IDC_MENU  MENU
    15. BEGIN
    16.     POPUP "Test Controls"
    17.     BEGIN
    18.         MENUITEM "Say Hello",IDM_SAYHELLO
    19.         MENUITEM "Get Text",IDM_GETTEXT
    20.         MENUITEM "Clear Edit Box",IDM_CLEAR
    21.         MENUITEM SEPARATOR
    22.         MENUITEM "E&xit",IDM_EXIT
    23.     END
    24. END
    Скачайте пример здесь.
    06.png
     

    Вложения:

    • 0.png
      0.png
      Размер файла:
      398 КБ
      Просмотров:
      1.062
    Последнее редактирование: 25 мар 2019
  17. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.993

    CreateDialogIndirectParam+DlgProc

    [​IMG]

    файл tut_10h.asm

    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. IDM_SAYHELLO equ 0
    4. IDM_GETTEXT equ 1
    5. IDM_CLEAR equ 2
    6. IDM_EXIT equ 3
    7. IDC_EDIT equ 0
    8. IDC_BUTTON equ 1
    9. IDC_EXIT equ 2
    10. IDC_MENU equ 100
    11. IDC_DIALOG equ 200
    12. IDC_ICON1 equ 500
    13. IDC_IMG1 equ 102
    14. .code
    15. WinMain proc
    16. local hMem:QWORD
    17. local msg:MSG
    18. invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,1024  ; memory buffer size
    19.       mov hMem,rax
    20.       mov edi,eax
    21. mov esi,offset temp
    22. mov ecx,len/8
    23. rep movsq
    24.         invoke LoadImage,IMAGE_BASE,IDC_ICON1,IMAGE_ICON,128,128,LR_DEFAULTCOLOR
    25. invoke CreateDialogIndirectParam,IMAGE_BASE,hMem,0,&DialogFunc,rax
    26. mov hWnd,rax
    27. lea edi,msg
    28. message_loop:invoke GetMessage,edi,0,0,0
    29. or eax,eax
    30. jz exit_msg_loop
    31. invoke IsDialogMessage,hWnd,edi
    32. or eax,eax
    33. jnz message_loop
    34. invoke DispatchMessage,edi
    35.       jmp message_loop
    36. exit_msg_loop:invoke GlobalFree,hMem
    37. invoke RtlExitUserProcess,NULL
    38. WinMain endp
    39. DialogFunc proc hDlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    40. size_of_buffer equ 96
    41. local buffer[size_of_buffer]:BYTE
    42. mov hDlg,rcx
    43.         mov lParam,r9
    44. cmp edx,WM_CLOSE
    45. je wmCLOSE
    46.         cmp edx,WM_INITDIALOG
    47.         je wmINITDIALOG
    48. cmp edx,WM_COMMAND
    49. jne wmBYE
    50. wmCOMMAND:movzx eax,r8w ;movzx eax,word ptr wParam
    51. or r9,r9 ;cmp lParam,0
    52. jnz @f
    53. jmp [menu_handlers+rax*8]
    54. @@: dec eax ;cmp eax,IDC_BUTTON=1
    55. jne @f
    56. SAYHELLO:mov r8d,offset expTxt
    57. jmp @0
    58. @@: dec eax ;cmp eax,IDC_EXIT=2
    59. jne wmBYE
    60. invoke SendMessage,,WM_CLOSE,0,0
    61. jmp wmBYE
    62. wmINITDIALOG:invoke GetDlgItem,,0
    63. invoke SetFocus,eax
    64.         invoke LoadIcon,IMAGE_BASE,IDC_ICON1
    65. invoke SendMessage,hDlg,WM_SETICON,0,rax
    66.         invoke GetDlgItem,hDlg,IDC_IMG1
    67. invoke SendMessage,eax,STM_SETIMAGE,IMAGE_ICON,lParam
    68. jmp wmBYE
    69. CLEAR: xor r8d,r8d
    70. @0: invoke SetDlgItemText,,0
    71. jmp wmBYE
    72. GETTEXT:invoke GetDlgItemText,,0,&buffer,size_of_buffer
    73. lea edx,buffer
    74. mov mb.lpszText,rdx
    75.         lea ecx,mb
    76. invoke MessageBoxIndirect
    77. jmp wmBYE
    78. wmCLOSE:invoke DestroyWindow;,hDlg
    79. invoke PostQuitMessage,0
    80. wmBYE:  xor eax,eax
    81. leave
    82. retn
    83. menu_handlers dq SAYHELLO,GETTEXT,CLEAR,wmCLOSE
    84. DialogFunc endp
    85. expTxt db "Wow! I'm in an edit box now",0
    86. AppName db 'Our Eighth Dialog Box',0
    87. mb label   MSGBOXPARAMS
    88.   dd sizeof MSGBOXPARAMS,?;cbSize
    89.   dq 0  ;hwndOwner
    90.   dq IMAGE_BASE  ;hInstance
    91.   dq ?  ;lpszText  
    92.   dq AppName  ;lpszCaption
    93.   dd MB_OK or MB_USERICON,?;dwStyle
    94.   dq IDC_ICON1  ;lpszIcon
    95.   dd 0,?;dwContextHelpId
    96.   dq 0  ;lpfnMsgBoxCallback
    97.   dd 0,?;dwLanguageId
    98. hWnd dq ?
    99. align 4
    100. temp:
    101. dw 1,-1
    102. dd 0,0,DS_CENTER or WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU \
    103.    or WS_VISIBLE or WS_OVERLAPPED or DS_MODALFRAME or DS_3DLOOK
    104. dw 4,10,10,200,80,-1,IDC_MENU,0
    105. du <Tutorial #10h: CreateDialogIndirectParam+DlgProc>
    106. align 4
    107. dd 0,0,WS_VISIBLE or WS_CHILDWINDOW or SS_ICON or SS_CENTERIMAGE
    108. dw 0,0,78,100,IDC_IMG1,0,-1,82h;,-1,IDC_ICON1,0
    109. dd 0,0,0,WS_VISIBLE or WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or WS_BORDER or WS_TABSTOP;,0
    110. dw 5,2,111,13,IDC_EDIT,0,-1,81h
    111. dd 0,0,0,WS_VISIBLE or WS_CHILD or WS_TABSTOP or BS_DEFPUSHBUTTON;,0
    112. dw 121,2,52,13,IDC_BUTTON,0,-1,80h
    113. du <Say Hello>
    114. dd 0,0,0,WS_VISIBLE or WS_CHILD or WS_TABSTOP;,0  
    115. dw 121,18,52,13,IDC_EXIT,0,-1,80h
    116. du <E&xit>
    117. len = $ - temp
    118. end

    файл tut_10h.rc

    Код (C):
    1. #include "resource.h"
    2. #define IDM_SAYHELLO 0
    3. #define IDM_GETTEXT 1
    4. #define IDM_CLEAR 2
    5. #define IDM_EXIT 3
    6. #define IDC_EDIT 0
    7. #define IDC_BUTTON 1
    8. #define IDC_EXIT 2
    9. #define IDC_MENU 100
    10. #define IDC_DIALOG 200
    11. #define IDC_ICON1 500
    12. #define IDC_IMG1 102
    13. IDC_ICON1 ICON "icon3.ico"
    14. IDC_MENU  MENU
    15. BEGIN
    16.     POPUP "Test Controls"
    17.     BEGIN
    18.         MENUITEM "Say Hello",IDM_SAYHELLO
    19.         MENUITEM "Get Text",IDM_GETTEXT
    20.         MENUITEM "Clear Edit Box",IDM_CLEAR
    21.         MENUITEM SEPARATOR
    22.         MENUITEM "E&xit",IDM_EXIT
    23.     END
    24. END
    Скачайте пример здесь.
    07.png
     

    Вложения:

    • 0.png
      0.png
      Размер файла:
      294 КБ
      Просмотров:
      1.064
    Последнее редактирование: 25 мар 2019
  18. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.993

    DialogBoxIndirectParam+WndProc+Class

    [​IMG]

    файл tut_10i.asm

    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. IDM_SAYHELLO equ 0
    4. IDM_GETTEXT equ 1
    5. IDM_CLEAR equ 2
    6. IDM_EXIT equ 3
    7. IDC_EDIT equ 0
    8. IDC_BUTTON equ 1
    9. IDC_EXIT equ 2
    10. IDC_MENU equ 100
    11. IDC_DIALOG equ 200
    12. IDC_ICON1 equ 500
    13. IDC_IMG1 equ 102
    14. .code
    15. WinMain proc
    16. local hMem:QWORD
    17. local msg:MSG
    18.       mov esi,IMAGE_BASE
    19.         invoke LoadImage,esi,IDC_ICON1,IMAGE_ICON,128,128,LR_DEFAULTCOLOR
    20. mov hIcon,rax
    21. xor ebx,ebx
    22. push rax ;hIconSm
    23. push rbx ;lpszClassName
    24. push IDC_MENU ;lpszMenuName
    25. push COLOR_BTNFACE+1;hbrBackground
    26. push 10005h ;hCursor
    27. push rax      ;hIcon
    28. push rsi ;hInstance
    29. push DLGWINDOWEXTRA;cbClsExtra & cbWndExtra
    30. push rbx ;lpfnWndProc
    31. push sizeof WNDCLASSEX;cbSize & style
    32. invoke RegisterClassEx,esp ;addr WNDCLASSEX
    33.       invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,1024  ; memory buffer size
    34.       mov hMem,rax
    35.       mov edi,eax
    36. mov esi,offset temp
    37. mov ecx,len/8
    38. rep movsq
    39.       invoke LoadImage,IMAGE_BASE,IDC_ICON1,IMAGE_ICON,128,128,LR_DEFAULTCOLOR
    40. invoke DialogBoxIndirectParam,IMAGE_BASE,hMem,0,&WndProc,rax
    41. invoke GlobalFree,hMem
    42. leave
    43. retn
    44. WinMain endp
    45. WndProc proc hDlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    46. size_of_buffer equ 96
    47. local buffer[size_of_buffer]:BYTE
    48.         mov hDlg,rcx
    49.         mov lParam,r9
    50. cmp edx,WM_CLOSE
    51. je wmCLOSE
    52. cmp edx,WM_INITDIALOG
    53. je wmINITDIALOG
    54. cmp edx,WM_COMMAND
    55. jne wmBYE
    56. wmCOMMAND:movzx eax,r8w ;movzx eax,word ptr wParam
    57. or r9,r9 ;cmp lParam,0
    58. jnz @f
    59. jmp [menu_handlers+rax*8]
    60. @@: dec eax ;cmp eax,IDC_BUTTON=1
    61. jne @f
    62. SAYHELLO:mov r8d,offset expTxt
    63. jmp @0
    64. @@: dec eax ;cmp eax,IDC_EXIT=2
    65. jne wmBYE
    66. invoke SendMessage,,WM_CLOSE,0,0
    67. jmp wmBYE
    68. wmINITDIALOG:invoke GetDlgItem,,0
    69. invoke SetFocus,eax
    70.         invoke LoadIcon,IMAGE_BASE,IDC_ICON1
    71. invoke SendMessage,hDlg,WM_SETICON,0,rax
    72.         invoke GetDlgItem,hDlg,IDC_IMG1
    73. invoke SendMessage,eax,STM_SETIMAGE,IMAGE_ICON,lParam
    74. jmp wmBYE
    75. CLEAR: xor r8d,r8d
    76. @0: invoke SetDlgItemText,,0
    77. jmp wmBYE
    78. GETTEXT:invoke GetDlgItemText,,0,&buffer,size_of_buffer
    79. lea edx,buffer
    80. mov mb.lpszText,rdx
    81.         lea ecx,mb
    82. invoke MessageBoxIndirect
    83. jmp wmBYE
    84. wmCLOSE:invoke EndDialog,,0
    85. wmBYE:xor eax,eax
    86. leave
    87. retn
    88. menu_handlers dq SAYHELLO,GETTEXT,CLEAR,wmCLOSE
    89. WndProc endp
    90. expTxt db "Wow! I'm in an edit box now",0
    91. AppName db 'Our Ninth Dialog Box',0
    92. hIcon dq ?
    93. mb label   MSGBOXPARAMS
    94.   dd sizeof MSGBOXPARAMS,?;cbSize
    95.   dq 0  ;hwndOwner
    96.   dq IMAGE_BASE  ;hInstance
    97.   dq ?  ;lpszText  
    98.   dq AppName  ;lpszCaption
    99.   dd MB_OK or MB_USERICON,?;dwStyle
    100.   dq IDC_ICON1  ;lpszIcon
    101.   dd 0,?;dwContextHelpId
    102.   dq 0  ;lpfnMsgBoxCallback
    103.   dd 0,?;dwLanguageId
    104. align 4
    105. temp:
    106. dw 1,-1
    107. dd 0,0,DS_CENTER or WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU \
    108.            or WS_VISIBLE or WS_OVERLAPPED or DS_MODALFRAME or DS_3DLOOK
    109. dw 4,10,10,200,80,-1,IDC_MENU,0
    110. du <Tutorial #10i: DialogBoxIndirectParam+WndProc+Class>
    111. align 4
    112. dd 0,0,WS_VISIBLE or WS_CHILDWINDOW or SS_ICON or SS_CENTERIMAGE
    113. dw 0,0,78,100,IDC_IMG1,0,-1,82h
    114. dd 0,0,0,WS_VISIBLE or WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or WS_BORDER or WS_TABSTOP
    115. dw 5,2,111,13,IDC_EDIT,0,-1,81h
    116. dd 0,0,0,WS_VISIBLE or WS_CHILD or WS_TABSTOP or BS_DEFPUSHBUTTON
    117. dw 121,2,52,13,IDC_BUTTON,0,-1,80h
    118. du <Say Hello>
    119. dd 0,0,0,WS_VISIBLE or WS_CHILD or WS_TABSTOP
    120. dw 121,18,52,13,IDC_EXIT,0,-1,80h
    121. du <E&xit>
    122. dw 0,0
    123. len = $ - temp
    124. end

    файл tut_10i.rc

    Код (C):
    1. #include "resource.h"
    2. #define IDM_SAYHELLO 0
    3. #define IDM_GETTEXT 1
    4. #define IDM_CLEAR 2
    5. #define IDM_EXIT 3
    6. #define IDC_EDIT 0
    7. #define IDC_BUTTON 1
    8. #define IDC_EXIT 2
    9. #define IDC_MENU 100
    10. #define IDC_DIALOG 200
    11. #define IDC_ICON1 500
    12. #define IDC_IMG1 102
    13. IDC_ICON1 ICON "icon3.ico"
    14. IDC_MENU  MENU
    15. BEGIN
    16.     POPUP "Test Controls"
    17.     BEGIN
    18.         MENUITEM "Say Hello",IDM_SAYHELLO
    19.         MENUITEM "Get Text",IDM_GETTEXT
    20.         MENUITEM "Clear Edit Box",IDM_CLEAR
    21.         MENUITEM SEPARATOR
    22.         MENUITEM "E&xit",IDM_EXIT
    23.     END
    24. END
    Скачайте пример здесь.
    08.png
     

    Вложения:

    • 0.png
      0.png
      Размер файла:
      235,6 КБ
      Просмотров:
      1.046
    Последнее редактирование: 25 мар 2019
  19. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.993

    CreateDialogIndirectParam+WndProc+Class

    [​IMG]

    файл tut_10j.asm

    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. IDM_SAYHELLO equ 0
    4. IDM_GETTEXT equ 1
    5. IDM_CLEAR equ 2
    6. IDM_EXIT equ 3
    7. IDC_EDIT equ 0
    8. IDC_BUTTON equ 1
    9. IDC_EXIT equ 2
    10. IDC_MENU equ 100
    11. IDC_DIALOG equ 200
    12. IDC_ICON1 equ 500
    13. IDC_IMG1 equ 102
    14. .code
    15. WinMain proc
    16. local hMem:QWORD
    17. local msg:MSG
    18. mov esi,IMAGE_BASE
    19. invoke LoadImage,esi,IDC_ICON1,IMAGE_ICON,128,128,LR_DEFAULTCOLOR
    20. mov hIcon,rax
    21. mov edi,offset ClassName
    22. push rax ;hIconSm
    23. push rdi ;lpszClassName
    24. push IDC_MENU ;lpszMenuName
    25. push COLOR_BTNFACE+1;hbrBackground
    26. push 10005h ;hCursor
    27. push rax        ;hIcon
    28. push rsi ;hInstance
    29. push DLGWINDOWEXTRA;cbClsExtra & cbWndExtra
    30. pushaddr dialog_procedure;lpfnWndProc
    31. push sizeof WNDCLASSEX;cbSize & style
    32. invoke RegisterClassEx,esp ;addr WNDCLASSEX
    33.       invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,1024  ; memory buffer size
    34.       mov hMem,rax
    35.       mov edi,eax
    36. mov esi,offset temp
    37. mov ecx,len/8
    38. rep movsq
    39.       invoke LoadImage,IMAGE_BASE,IDC_ICON1,IMAGE_ICON,128,128,LR_DEFAULTCOLOR
    40. invoke CreateDialogIndirectParam,IMAGE_BASE,hMem,0,&dialog_procedure,eax
    41. mov hwnd,rax
    42. lea edi,msg
    43. message_loop:invoke GetMessage,edi,0,0,0
    44. or eax,eax
    45. jz exit_msg_loop
    46. invoke IsDialogMessage,hwnd,edi
    47. or eax,eax
    48. jnz message_loop
    49. invoke DispatchMessage,edi
    50.       jmp message_loop
    51. exit_msg_loop:invoke GlobalFree,hMem
    52. invoke RtlExitUserProcess,NULL
    53. WinMain endp
    54. dialog_procedure proc hDlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    55. size_of_buffer equ 96
    56. local buffer[size_of_buffer]:BYTE
    57. mov hDlg,rcx
    58. mov lParam,r9
    59. cmp edx,WM_CLOSE
    60. je wmCLOSE
    61.         cmp edx,WM_INITDIALOG
    62. je wmINITDIALOG
    63. cmp edx,WM_COMMAND
    64. jne wmBYE
    65. wmCOMMAND:movzx eax,r8w ;movzx eax,word ptr wParam
    66. or r9,r9 ;cmp lParam,0
    67. jnz @f
    68. jmp [menu_handlers+rax*8]; choose menu
    69. ; choose button or EditBox
    70. @@: dec eax ;cmp eax,IDC_BUTTON=1
    71. jne @f
    72. SAYHELLO:mov r8d,offset expTxt
    73. jmp @0
    74. @@: dec eax ;cmp eax,IDC_EXIT=2
    75. jne wmBYE
    76. invoke SendMessage,,WM_CLOSE,0,0
    77. jmp wmBYE
    78. wmINITDIALOG:invoke GetDlgItem,,0
    79. invoke SetFocus,eax
    80.         invoke LoadIcon,IMAGE_BASE,IDC_ICON1
    81. invoke SendMessage,hDlg,WM_SETICON,1,rax
    82.         invoke GetDlgItem,hDlg,IDC_IMG1
    83. invoke SendMessage,eax,STM_SETIMAGE,IMAGE_ICON,lParam
    84. jmp wmBYE
    85. CLEAR: xor r8d,r8d
    86. @0: invoke SetDlgItemText,,0
    87. jmp wmBYE
    88. GETTEXT:invoke GetDlgItemText,,0,&buffer,size_of_buffer
    89. lea edx,buffer
    90. mov mb.lpszText,rdx
    91.         lea ecx,mb
    92. invoke MessageBoxIndirect
    93. jmp wmBYE
    94. wmCLOSE:invoke DestroyWindow,hDlg
    95. invoke PostQuitMessage,0
    96. wmBYE: xor eax,eax
    97. leave
    98. retn
    99. menu_handlers dq SAYHELLO,GETTEXT,CLEAR,wmCLOSE
    100. dialog_procedure endp
    101. ;---------------------------------------
    102. ClassName db 'DLGCLASS',0
    103. expTxt db "Wow! I'm in an edit box now",0
    104. AppName db 'Our Tenth Dialog Box',0
    105. hwnd dq ?
    106. hIcon dq ?
    107. mb label   MSGBOXPARAMS
    108.   dd sizeof MSGBOXPARAMS,?;cbSize
    109.   dq 0  ;hwndOwner
    110.   dq IMAGE_BASE  ;hInstance
    111.   dq ?  ;lpszText  
    112.   dq AppName  ;lpszCaption
    113.   dd MB_OK or MB_USERICON,?;dwStyle
    114.   dq IDC_ICON1  ;lpszIcon
    115.   dd 0,?;dwContextHelpId
    116.   dq 0  ;lpfnMsgBoxCallback
    117.   dd 0,?;dwLanguageId
    118. align 4
    119. temp:
    120. dw 1,-1
    121. dd 0,0,DS_CENTER or WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU \
    122.    or WS_VISIBLE or WS_OVERLAPPED or DS_MODALFRAME or DS_3DLOOK
    123. dw 4,10,10,200,80,-1,IDC_MENU,0
    124. du <Tutorial #10j: CreateDialogIndirectParam+WndProc+