как обновить окно???

Тема в разделе "WASM.BEGINNERS", создана пользователем skyman000, 16 апр 2008.

  1. skyman000

    skyman000 New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    8
    здрасте всем !
    я новичёк и у меня такая проблема,
    вот пишу я дллку код которой представлен ниже
    эта дллка сразу после её загрузки создаёт форму с определённым текстом

    мне надо сделать чтоб после вызова функции TestHello (которая находится в этой же длл) текст в окне мгновенно менялся

    я уже понял как он должен менятся и сделал так чтоб он менялся если переменная u12 будет не равна 1 (если скажете как можно это сделать через какую то функцию буду очень благодарен)
    и текст меняется но не мгновенно для того чтоб увидет результат надо как нидь "извратиться" над окном типа свернут и развернуть или сделать на весь экран...


    как сделать так чтоб всё мгновенно менялось ? что я сделал не так ?

    вот код моей длл
    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. include windows.inc
    5. include user32.inc
    6. include kernel32.inc
    7. include gdi32.inc
    8. includelib user32.lib
    9. includelib kernel32.lib
    10. includelib gdi32.lib
    11. BSIZE      equ 128
    12. .data
    13. newhwnd                        dd 0
    14. hInst                     dd 00000000h
    15. szTitleName         db 'Window Application',0
    16. szClassName       db 'ASMCLASS32',0
    17. msg                      MONMSGSTRUCT <?> ; структура сообщения
    18. wc                       WNDCLASS <?> ; структура класса
    19. AppName db "DLL Skeleton",0
    20. HelloMsg db "Hello,@!",0
    21. LoadMsg db "The DLL is loaded",0
    22. UnloadMsg db "The DLL is unloaded",0
    23. DFF db 'd',0
    24. u12 db 1
    25. ThreadCreated db "A thread is created in this process",0
    26. ThreadDestroyed db "A thread is destroyed in this process",0
    27. buf          BYTE BSIZE dup(?)
    28. stdout       DWORD ?
    29. stdin        DWORD ?
    30. cRead        DWORD ?
    31. cWritten     DWORD ?
    32. cWten     DWORD ?
    33.  
    34. .code
    35.  
    36. DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD
    37.     .if reason==DLL_PROCESS_ATTACH
    38.  
    39.  
    40.  
    41.  
    42. Invoke GetModuleHandle,0 ; получаем hInstanse
    43. Mov [hInst], eax
    44.  
    45. Mov [wc.style], CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
    46.      ; устанавливаем стиль окна
    47. Mov [wc.lpfnWndProc], offset WndProc ;
    48. Mov [wc.cbClsExtra], 0
    49. Mov [wc.cbWndExtra], 0
    50. Mov eax, [hInst]
    51. Mov [wc.hInstance], eax
    52. Invoke LoadIcon,0,IDI_APPLICATION ; получаем значок приложения по
    53.          ; умолчанию
    54. Mov [wc.hIcon], eax
    55.  
    56. Invoke LoadCursorA,0,IDC_ARROW ; получаем курсор по умолчанию
    57. Mov [wc.hCursor], eax
    58. Mov [wc.hbrBackground], COLOR_BACKGROUND+1
    59. Mov dword ptr [wc.lpszMenuName], 0
    60. Mov dword ptr [wc.lpszClassName], offset szClassName ; задаём имя класса
    61.          ;окна
    62. Invoke RegisterClassA,offset wc ; регистрируем класс окна
    63.  
    64. Push 0
    65. Push [hInst] ; дескриптор
    66. Push 0
    67. Push 0
    68. Push 253 ; высота
    69. Push 243 ; ширина
    70. Push 223 ; y
    71. Push 233 ; x
    72. Push WS_OVERLAPPEDWINDOW ; стиль
    73. Push offset szTitleName ; заголовок окна
    74. Push offset szClassName ; имя класса
    75. Push 0 ; дополнительный стиль
    76. Call CreateWindowEx ; создаём окно
    77. mov [newhwnd], eax ; сохраняем его дескриптор
    78. invoke ShowWindow,[newhwnd],SW_SHOWNORMAL; показываем окно
    79. invoke UpdateWindow, [newhwnd]; обновляем его
    80.  
    81.  
    82.  
    83.  
    84.         invoke MessageBox,NULL,addr LoadMsg,addr AppName,MB_OK
    85.     .elseif reason==DLL_PROCESS_DETACH
    86.         invoke MessageBox,NULL,addr UnloadMsg,addr AppName,MB_OK
    87.     .elseif reason==DLL_THREAD_ATTACH
    88.         invoke MessageBox,NULL,addr ThreadCreated,addr AppName,MB_OK
    89.     .else        ; DLL_THREAD_DETACH
    90.         invoke MessageBox,NULL,addr ThreadDestroyed,addr AppName,MB_OK
    91.     .endif
    92.     mov  eax,TRUE
    93.     ret 4
    94. DllEntry Endp
    95.  
    96. TestHello proc uses eax
    97. LOCAL ps1:PAINTSTRUCT
    98. LOCAL rect1:RECT
    99. LOCAL hdc1:HDC
    100.  
    101.     invoke MessageBox,NULL,addr HelloMsg,addr AppName,MB_OK
    102.    mov u12, 2
    103.    ;nvoke  BeginPaint,cWten, ADDR ps1
    104.    ;mov     hdc1,eax
    105.    ;invoke  GetClientRect,cWten, ADDR rect1
    106.    ;invoke  DrawText, hdc1,ADDR AppName,-1, ADDR rect1, DT_WORDBREAK or DT_CENTER or DT_VCENTER
    107.    ;invoke EndPaint,cWten, ADDR ps1
    108.  
    109. ret
    110. TestHello endp
    111.  
    112.  
    113. WndProc proc uses ebx edi esi, hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
    114.  
    115. LOCAL hdc:HDC
    116. LOCAL ps:PAINTSTRUCT
    117. LOCAL rect:RECT
    118. mov ebx , hWnd
    119. mov   cWten, ebx
    120.  
    121. .IF uMsg==WM_PAINT
    122.    invoke  BeginPaint,hWnd, ADDR ps
    123.    mov     hdc,eax
    124.    invoke  GetClientRect,hWnd, ADDR rect
    125.   .IF u12==1
    126.    invoke  DrawText, hdc,ADDR HelloMsg,-1, ADDR rect, DT_WORDBREAK or DT_CENTER or DT_VCENTER
    127.    .ELSE
    128.    invoke  DrawText, hdc,ADDR AppName,-1, ADDR rect, DT_WORDBREAK or DT_CENTER or DT_VCENTER
    129.   .ENDIF
    130.  
    131.      invoke EndPaint,hWnd, ADDR ps
    132. .ELSE
    133.    invoke DefWindowProc,hWnd,uMsg,wParam,lParam
    134.    ret
    135. .ENDIF
    136. xor     eax,eax
    137.  
    138. ret
    139. WndProc endp
    140.  
    141.  
    142. End DllEntry
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    вызови InvalidateRect для своего окна.

    Если тебе не нужны какие-то красивости текста, можно вместо прямого рисования текста в окне сделать static, разместить его в окне (на месте текста) и менять текст в static'e через SetWindowText.

    При этом тебе не нужно будет самому рисовать текст и обновлять окно.
    Система сама позаботится обо всём
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    skyman000
    После mov u12, 2 вместо всего, что закомментировано, SendMessage (WM_PAINT) или просто UpdateWindow. И никаких BeginPaint/EndPaint за пределами обработчика сообщения WM_PAINT.
     
  4. skyman000

    skyman000 New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    8
    переписал функцию но чёт не прашет всеравно
    может я cWten как то не так получаю ???

    а UpdateWindow я до этого тож пробывал юзать но толку 0 всерано...
    Код (Text):
    1. TestHello proc uses eax
    2. LOCAL ps1:PAINTSTRUCT
    3. LOCAL rect1:RECT
    4. LOCAL hdc1:HDC
    5.  
    6.     invoke MessageBox,NULL,addr HelloMsg,addr AppName,MB_OK
    7.    mov u12, 2
    8.    ;invoke  BeginPaint,cWten, ADDR ps1
    9.    ;mov     hdc1,eax
    10.    ;invoke  GetClientRect,cWten, ADDR rect1
    11.    ;invoke  DrawText, hdc1,ADDR AppName,-1, ADDR rect1, DT_WORDBREAK or DT_CENTER or DT_VCENTER
    12.    ;invoke EndPaint,cWten, ADDR ps1
    13.    invoke SendMessage,cWten,WM_PAINT,0,0
    14. ret
    15. TestHello endp
    а можете паказать как это реализовать программно а то мне часов 6 в инете сиден надо быдет если не больше чтоб понять как это всё слепить :)
     
  5. Shtirlitz1945

    Shtirlitz1945 New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2008
    Сообщения:
    5
    Попробуй использовать RedrawWindow
     
  6. skyman000

    skyman000 New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    8
    пытался уже делать так
    invoke RedrawWindow,cWten,WM_PAINT,0,0
    invoke RedrawWindow, [newhwnd],WM_PAINT,0,0
    толка нету...
     
  7. skyman000

    skyman000 New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    8
    ВО !! invoke InvalidateRect,cWten,NULL,TRUE и всё заработало !!! :))
    а всё же не подскажите как это мона через static и SetWindowText реализовать??
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    После каждой смены текста вызывай InvalidateRect. При этом автоматом будет вызван твой callback WndProc с сообщением WM_PAINT и окно будет отрисовано вновь с новым текстом.

    Вот пример со статиком:
    Код (Text):
    1. .586
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5. ;==================================================================================
    6.     include     \masm32\include\windows.inc
    7.     include     \masm32\include\user32.inc
    8.     include     \masm32\include\kernel32.inc
    9.     include     \masm32\include\shell32.inc
    10.     include     \masm32\include\gdi32.inc
    11.     include     \masm32\include\advapi32.inc
    12.     include     \masm32\include\comctl32.inc
    13.     include     \masm32\include\comdlg32.inc
    14.     include     \masm32\include\masm32.inc
    15.  
    16.     include     \masm32\RadASM\masm\inc\debug.inc
    17.     include     \masm32\RadASM\masm\inc\radbg.inc
    18.  
    19.  
    20. ;==================================================================================  
    21.     includelib  \masm32\lib\user32.lib
    22.     includelib  \masm32\lib\kernel32.lib
    23.     includelib  \masm32\lib\shell32.lib
    24.     includelib  \masm32\lib\gdi32.lib
    25.     includelib  \masm32\lib\advapi32.lib
    26.     includelib  \masm32\lib\comctl32.lib
    27.     includelib  \masm32\lib\comdlg32.lib
    28.     includelib  \masm32\lib\masm32.lib
    29.  
    30.     includelib  \masm32\RadASM\masm\lib\debug.lib
    31.  
    32.  
    33. ;==================================================================================
    34.     WinMain     PROTO :DWORD,:DWORD,:DWORD,:DWORD
    35. ;==================================================================================
    36. .const
    37.     szClassName         db  "MainWinClass",0
    38.     szAppName           db  "App Name",0
    39.     szStaticClass       db  "static",0
    40.     szStaticName        db  "STATIC WINDOW",0
    41.     szButtonClass       db  "button",0
    42.     szButtonName        db  "BUTTON",0
    43.     szText1             db  "Button 1 was pressed",0
    44.     szText2             db  "Button 2 was pressed",0
    45.    
    46. ;==================================================================================
    47. .data
    48. ;==================================================================================
    49. .data?
    50.     hInstance           dd  ?
    51.     lpCmdLine           dd  ?
    52.     hWnd                dd  ?
    53.     hStatic             dd  ?
    54.     hButton1            dd  ?
    55.     hButton2            dd  ?
    56. .code
    57. ; ---------------------------------------------------------------------------
    58. start:
    59.     invoke  GetModuleHandle, NULL
    60.     mov     hInstance,eax
    61.    
    62.     invoke  GetCommandLine
    63.     mov     lpCmdLine,eax
    64.    
    65.     invoke  WinMain, hInstance, NULL, lpCmdLine, SW_SHOWDEFAULT
    66.     invoke  ExitProcess, eax
    67.  
    68. ;==================================================================================
    69. WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD
    70.     LOCAL wc                :WNDCLASSEX
    71.     LOCAL msg               :MSG
    72.     LOCAL wx, wy, ww, wh    :DWORD
    73.    
    74.     mov     wc.cbSize, sizeof(WNDCLASSEX)
    75.     mov     wc.style, CS_HREDRAW or CS_VREDRAW
    76.     mov     wc.lpfnWndProc, offset WndProc
    77.     mov     wc.cbClsExtra,NULL
    78.     mov     wc.cbWndExtra,NULL
    79.     push    hInstance
    80.     pop     wc.hInstance
    81.     mov     wc.hbrBackground,COLOR_BTNFACE+1
    82.     mov     wc.lpszMenuName,NULL
    83.     mov     wc.lpszClassName,offset szClassName
    84.    
    85.     invoke  LoadIcon, NULL, IDI_APPLICATION
    86.     mov     wc.hIcon,eax
    87.     mov     wc.hIconSm,eax
    88.    
    89.     invoke  LoadCursor, NULL, IDC_ARROW
    90.     mov     wc.hCursor,eax
    91.    
    92.     invoke RegisterClassEx, addr wc
    93.     ;-------------------------------------------------
    94.     mov     ww,600
    95.     mov     wh,400
    96.     invoke  GetSystemMetrics,SM_CXSCREEN
    97.     sub     eax,ww
    98.     shr     eax,1
    99.     mov     wx,eax
    100.     invoke  GetSystemMetrics,SM_CYSCREEN
    101.     sub     eax,wh
    102.     shr     eax,1
    103.     mov     wy,eax
    104.  
    105.     invoke  CreateWindowEx, NULL, addr szClassName, addr szAppName,
    106.                            14CA0000h,   ;WS_OVERLAPPEDWINDOW,
    107.                            wx,
    108.                            wy,
    109.                            ww,
    110.                            wh,
    111.                            NULL,
    112.                            NULL,
    113.                            hInst,
    114.                            NULL
    115.     mov     hWnd,eax
    116.     .if     (eax)
    117.         invoke  CreateWindowEx, NULL, addr szStaticClass, addr szStaticName, WS_CHILD or WS_VISIBLE or SS_CENTER, 100, 100, 300, 50, hWnd, NULL, hInst, NULL
    118.         mov     hStatic,eax
    119.         invoke  CreateWindowEx, NULL, addr szButtonClass, addr szButtonName, WS_CHILD or WS_VISIBLE, 200, 200, 100, 50, hWnd, NULL, hInst, NULL
    120.         mov     hButton1,eax
    121.         invoke  CreateWindowEx, NULL, addr szButtonClass, addr szButtonName, WS_CHILD or WS_VISIBLE, 200, 300, 100, 50, hWnd, NULL, hInst, NULL
    122.         mov     hButton2,eax
    123.     .endif
    124.    
    125.     invoke  ShowWindow, hWnd,SW_SHOWNORMAL
    126.     invoke  UpdateWindow, hWnd
    127.    
    128.     .while  (TRUE)
    129.         invoke GetMessage, addr msg, NULL, NULL, NULL
    130.         .break .if (!eax)
    131.         invoke TranslateMessage, addr msg
    132.         invoke DispatchMessage, addr msg
    133.     .endw
    134.    
    135.     mov     eax,msg.wParam
    136.     ret
    137. WinMain endp
    138.  
    139. ;==================================================================================
    140. WndProc proc uses ebx hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
    141.    
    142.     mov     eax,uMsg
    143.     .if     (eax==WM_CREATE)
    144.         m2m     hWnd,hWin
    145.      
    146.     .elseif (eax==WM_COMMAND)
    147.         mov eax, lParam
    148.         .if (eax==hButton1)
    149.             invoke  SetWindowText, hStatic, addr szText1
    150.         .elseif (eax==hButton2)
    151.             invoke  SetWindowText, hStatic, addr szText2
    152.         .endif
    153.        
    154.          
    155.     .elseif (eax==WM_DESTROY)
    156.         invoke  PostQuitMessage, NULL
    157.  
    158.     .else
    159.         invoke  DefWindowProc, hWin, uMsg, wParam, lParam        
    160.         ret
    161.     .endif
    162.    
    163.     xor eax,eax
    164.     ret
    165. WndProc endp
    166.  
    167.  
    168. end start
     
  9. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    l_inc
    Насчет "SendMessage (WM_PAINT)" как альтернативы "просто UpdateWindow":

    "The WM_PAINT message is generated by the system and should not be sent by an application." (MSDN)

    Конечно, у Feng Yuan в статье "Window Contents Capturing using WM_PRINT Message" таки видим:
    Код (Text):
    1. ...
    2. case WM_PRINTCLIENT:
    3.   SendMessage(hWnd, WM_PAINT, wParam, lParam);
    4.   break;
    но там роль WM_PAINT несколько иная.
     
  10. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    А вы в описание RedrawWindow вообще-то заглядывали?
     
  11. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    kero
    Да. Забыл об MSDN'овском предостережении. Спасибо за напоминание.
    Цитату из Feng Yuan я бы в качестве аргумента против уж точно не привел бы, по меньшей мере потому что не читал его.