На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> Диалоговые окна , Стирается текст в диалоговом окне после создания нового окна
    Доброго времени суток.
    Подскажите пожалуйста начинающему любителю в правильном написании АПИ функций.
    В приведенной ниже программе после повторного вывода диалогового окна, в предыдущем окне текст заменяется на тот, который выводится в последнем окне.
    В чем причина?
    ExpandedWrap disabled
      ;000.asm
            .386
            .model flat, stdcall
            option casemap :none   ; case sensitive
       
            include \masm32\include\windows.inc
            include \masm32\include\masm32.inc
            include \masm32\include\gdi32.inc
            include \masm32\include\user32.inc
            include \masm32\include\kernel32.inc
            include \masm32\include\Comctl32.inc
            include \masm32\include\comdlg32.inc
            include \masm32\include\shell32.inc
            include \masm32\include\oleaut32.inc
       
            includelib \masm32\lib\masm32.lib
            includelib \masm32\lib\gdi32.lib
            includelib \masm32\lib\user32.lib
            includelib \masm32\lib\kernel32.lib
            includelib \masm32\lib\Comctl32.lib
            includelib \masm32\lib\comdlg32.lib
            includelib \masm32\lib\shell32.lib
            includelib \masm32\lib\oleaut32.lib
       
            include \masm32\macros\macros.asm
       
            include \masm32\include\Fpu.inc
            includelib \masm32\lib\Fpu.lib
       
      include RASSCHET_1.inc
      include RASSCHET_4.inc
      include @_OTVET_1.inc
      include @OBNUL_STR_MES.inc
      include @_MASSIV.inc
      includelib PREOBRAZOVANIA.lib
      ;     ~~~~~~~~~
            WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
            Dlgnomodproc PROTO :DWORD,:DWORD,:DWORD,:DWORD
            Bitmapproc PROTO :DWORD,:DWORD,:DWORD,:DWORD
            StaticImage PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
       
          .data
      include D_A_T_A__SEGMENT.inc
          Ps     PAINTSTRUCT  < ? >
          XM   DWORD ?
          YM   DWORD ?
          statClass db "STATIC",0
          .code
       
      start:
           mov hInstance, rv(GetModuleHandle, 0) ; -- rv   --  macros.asm
           fn DialogBoxParam, hInstance, "DIAL1", 0, ADDR WndProc, 0
           fn ExitProcess,0
      ; -------
          WndProc proc hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
       
          .if uMsg == WM_INITDIALOG
                           mov HWNDIAL_1, rv(GetDlgItem, hWin, 1) ;--- получить дескрипторы окон редактирования
                           mov HWNDIAL_2, rv(GetDlgItem, hWin, 2)
                           mov HWNDIAL_5, rv(GetDlgItem, hWin, 8)
                           mov HWNDCOMBOBOX, rv(GetDlgItem, hWin, 555) ;--- получить дескрипторы окон редактирования
                           mov HWNDCOMBOBOX_2, rv(GetDlgItem, hWin, 333)
                  fn SendMessage, hWin, WM_SETICON, 0, rv(LoadIcon, hInstance, 100)
                  fn SetMenu, hWin,  rv(LoadMenu, hInstance, "MENUP")
                           fn SendMessage, HWNDCOMBOBOX, CB_ADDSTRING, 1, ADDR LENT_Kc+24
                           fn SendMessage, HWNDCOMBOBOX, CB_ADDSTRING, 1, ADDR LENT_Kc+16
                           fn SendMessage, HWNDCOMBOBOX, CB_ADDSTRING, 1, ADDR LENT_Kc+8
                           fn SendMessage, HWNDCOMBOBOX, CB_SETCURSEL, 0, 1
       
              mov ecx, 21
      @@:
              mov eax, 8
              dec ecx
              push ecx
              jz @F
              mul ecx
              mov ebx, eax
                           fn SendMessage, HWNDCOMBOBOX_2, CB_ADDSTRING, 1, ADDR TIP_TR+[ebx]
                      pop ecx
                      jmp @B
      @@:
                           fn SendMessage, HWNDCOMBOBOX_2, CB_SETCURSEL, 0, 1
                          
       
      ;------
              .elseif uMsg == WM_COMMAND
                  @OBNUL_STR_MES
      ;--- получить отредактированные строки
                          fn SendMessage, HWNDIAL_1, WM_GETTEXT, 150, ADDR TEXT1
                          fn SendMessage, HWNDIAL_2, WM_GETTEXT, 150, ADDR TEXT2
       
                          fn SendMessage, HWNDIAL_5, WM_GETTEXT, 150, ADDR TEXT5
      ;--- получить строку  окна COMBOBOX
                          fn SendMessage, HWNDCOMBOBOX, CB_GETCURSEL, 0, 0
      ;--- теперь сам текст
                          fn SendMessage, HWNDCOMBOBOX, CB_GETLBTEXT, EAX, ADDR STR_COMBOBOX
       
                          
                  .if wParam == 15
                      fn MessageBox, hWin, ADDR STR3, "Разъяснения", 1000h    ; MB_SYSTEMMODAL
                  .elseif wParam == 14
                      fn CreateDialogParam,hInstance, "DIAL3", 0, ADDR Bitmapproc, 0
                  .elseif wParam == 5
                      .if ([TEXT1] == 0) || ([TEXT1] == "0") || ([TEXT2] == 0) || ([TEXT2] == "0")
                          fn MessageBox, hWin, "Недостаточно данных или введен 0. Читай разъяснения", "Неверные данные", MB_ICONWARNING
                          xor eax, eax
                          ret
                      .endif          
      RASSCHET_1
      RASSCHET_4
      @_OTVET_1
      ; ########################################
                      fn CreateDialogParam,hInstance, "DIAL2", 0, ADDR Dlgnomodproc, 0
       
      ; ########################################              
                  .elseif wParam == 12
                      .if ([TEXT1] == 0) || ([TEXT1] == "0") || ([TEXT2] == 0) || ([TEXT2] == "0")
                          fn MessageBox, hWin, "Недостаточно данных или введен 0. Читай разъяснения", "Неверные данные", MB_ICONWARNING
                          xor eax, eax
                          ret
                      .endif
      ;--- получить строку  окна COMBOBOX_2
                          fn SendMessage, HWNDCOMBOBOX_2, CB_GETCURSEL, 0, 0
      ;--- теперь сам текст
                          fn SendMessage, HWNDCOMBOBOX_2, CB_GETLBTEXT, EAX, ADDR STR_COMBOBOX_2
       
       RASSCHET_1
      ; ----  
          mov ecx, 21
      MET_1:
          lea esi, STR_COMBOBOX_2
          mov eax, 8
          dec ecx
          jz MET_2
          mul ecx
          mov ebx, eax
          lea edi, TIP_TR+[ebx]
          push ebx
          push ecx
      ; ----  
          mov ecx, 8
          dec esi
          dec edi
      MET_4:
          inc esi
          inc edi
          dec ecx
          jz MET_3
          mov al, [esi]
          mov bl, [edi]
          cmp al, bl
          je MET_4
          pop ecx
          pop ebx
          jmp MET_1
      MET_3:
      ; ----
          pop ecx
          pop ebx
      MET_2:  
          fn FpuAtoFL, ADDR Sc_PRIL+[ebx], ADDR Prom_1, DEST_MEM
          fn FpuComp, ADDR Sc_PRIL_MEM, ADDR Prom_1, SRC1_REAL or SRC2_REAL
       
           test eax, CMP_GREATER ;--- если pervoe_1mem > или = ADDR sravnimoe (в EAX 1)
           jz BNB ;--- если в EAX 0
           fn MessageBox, hWin, "Мощность меньше расчетной. Читай разъяснения", "Неверные данные", MB_ICONWARNING
           ret
      BNB:
          fn FpuAdd, 0, ADDR Prom_1, ADDR Sc_PRIL_MEM, SRC1_DIMM or SRC2_REAL or DEST_MEM
      ; ----  
       RASSCHET_4
       @_OTVET_1
      ; ########################################
              fn CreateDialogParam,hInstance, "DIAL2", 0, ADDR Dlgnomodproc, 0
       
      ; ########################################          
                  .endif
                  .if WORD PTR [wParam] == 1
                  jmp DDL
                  .elseif WORD PTR [EBP+10H] == 2
                  jmp DDL
                  .elseif WORD PTR [EBP+10H] == 8
       
      DDL:
              .if WORD PTR [wParam+2] == EN_KILLFOCUS
                  mov ebx, 0
      L33:
                  movzx eax, BYTE PTR [TAB+ebx]
                  fn UnregisterHotKey,DWORD PTR [EBP+08H],eax
                  inc ebx
                  cmp ebx, 212
                  jne L33
       
              .elseif WORD PTR [EBP+12H] == EN_SETFOCUS
                  mov ebx, 0
      L44:
                  movzx eax, BYTE PTR [TAB+ebx]
                  fn RegisterHotKey,DWORD PTR [EBP+08H],eax,0,eax
                  inc ebx
                  cmp ebx, 212
                  jne L44
       
              .endif
       
                  .endif
      ;------
              .elseif uMsg == WM_HOTKEY
       
              .elseif uMsg ==  WM_CLOSE
                  fn EndDialog,hWin,0
                  fn ExitProcess,0
          .endif
       
       
          xor eax, eax
          ret
      ;-----------------------------------------------------------
           WndProc endp
       
      ; -------
          Dlgnomodproc proc hDlgWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
       
          LOCAL hDC    :DWORD
          LOCAL rect     :RECT
       
          Switch uMsg
                  Case WM_PAINT
                  fn BeginPaint,hDlgWin,ADDR Ps
                  mov hDC, eax
                  fn SetBkMode, hDC, TRANSPARENT
                  fn GetClientRect,hDlgWin,ADDR rect
                  fn DrawText ,hDC, ADDR MES, -1,ADDR rect, DT_LEFT  
                  fn EndPaint,hDlgWin,ADDR Ps
                  return 0
      ;------
              Case  WM_CLOSE
                   fn DestroyWindow,hDlgWin
       
          Endsw
       
          xor eax, eax
          ret
      ;--------------------------
           Dlgnomodproc endp
       
      ; -------
         Bitmapproc proc hBitWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
       
          LOCAL hBmp   :DWORD
          LOCAL hStatImage :DWORD
       
          .if uMsg == WM_INITDIALOG
                          
              mov hStatImage, rv(StaticImage,NULL,hBitWin,0,0,100,25,65535)
              mov hBmp, rv(LoadBitmap,hInstance,700)
              fn SendMessage,hStatImage,STM_SETIMAGE,IMAGE_BITMAP,hBmp
                      
      ;------
              .elseif uMsg ==  WM_CLOSE
                  fn EndDialog,hBitWin,0
          .endif
          
          xor eax, eax
          ret
      ;--------------------------
         Bitmapproc endp
        
      ;------
       
      StaticImage proc lpText:DWORD,hParent:DWORD,
                       a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,ID:DWORD
       
      ; invoke StaticImage,NULL,hWnd,20,20,100,25,500
       
          invoke CreateWindowEx,WS_EX_STATICEDGE,
                  ADDR statClass,lpText,
                  WS_CHILD or WS_VISIBLE or SS_BITMAP,
                  a,b,wd,ht,hParent,ID,
                  hInstance,NULL
       
          ret
       
      StaticImage endp
      ; -------
      end start


    Функция CreateDialogParam применена для отображения нескольких окон сразу.
      Забыл разъяснить, что текст строки MES в каждом окне разный Прикреплённый файлПрикреплённый файл____.JPG (58,51 Кбайт, скачиваний: 493)
      Программа не работает на 32 разрядной машине под ХР, а на 64 разрядной под WIN 7, где и создавалась, идет
        Цитата masm32 @
        Программа не работает на 32 разрядной машине под ХР, а на 64 разрядной под WIN 7, где и создавалась, идет
        :yes-sad: Небось, опять эта известная проблема с Subsystem Version, равной 6.0 на Win7, и 4.0 для WinXP... Это от функций FlsFree/FlsGetValue/FlsAlloc импортируемых из KERNEL32.LIB. :whistle:
          Повторюсь, что я начинающий. Если можно подробнее и этих функций FlsFree/FlsGetValue/FlsAlloc я не использовал.
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0266 ]   [ 18 queries used ]   [ Generated: 19.04.24, 23:09 GMT ]