Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2011, 19:37   #1
assch
Пользователь
 
Регистрация: 13.09.2010
Сообщений: 65
По умолчанию Перерисовка окна при момощи InvalidateRect

Не подскажете как перерисовать окно.
А именно окошко которое как видно в коде создаётся в приложении при нажатии
на левую кнопку мышки (WM_LBUTTONDOWN) которое в свою очередь показывает картинку
файл которого например как у меня в коде перетаскивается мышкой в окно приложения
при помощи команды (WM_DROPFILES)
Картинка показывается нормально только она не перерисованная, то есть при некоторых
обстоятельствах (например зону картинки закроет другое окно) картинка исчезает.
То есть зону картинки нужно перерисовать. Насколько я знаю это делается например
с помощью фукнкции InvalidateRect.
А вот как именно с этим у меня тормоза
Подскажите пожалуйста.




Код:
.if uMsg == WM_DROPFILES

invoke DragQueryFile,wParam,0,addr buffer,sizeof buffer
invoke MultiByteToWideChar,0,0,addr buffer,-1,addr Unicod,addr Char
invoke GdipLoadImageFromFile,addr Unicod, addr hImag
invoke GdipGetImageWidth, hImag, addr sWidth
invoke GdipGetImageHeight, hImag, addr sHeight

.elseif uMsg == WM_LBUTTONDOWN

invoke  DestroyWindow,hGif
invoke CreateWindowEx,0,addr Static,0,WS_CHILD,50,50,sWidth,sHeight,hWinFun,0,0,0
mov hGif,eax
invoke ShowWindow,hGif,SW_SHOWNORMAL
invoke UpdateWindow,hGif

invoke GetDC, hGif
mov hDC, eax
invoke GdipCreateFromHDC, hDC, addr pGraphics
invoke GdipDrawImage, pGraphics,hImag,0,0
assch вне форума Ответить с цитированием
Старый 01.07.2011, 19:47   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Вот пример использования. Ногами не пинать за нерусские комментарии!!!
Код:
WinMain  endp
;в_конна функц_я (функц_я, яка визначає д_ї, у в_дпов_дь на пов_домлення)
WndProc   proc  hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
uses ebx, edi, esi
local rc:RECT
local ps:PAINTSTRUCT
;
; УВАГА: Win32 потребує, щоб EBX, EDI, and ESI були збереженн_! 
; для цього використана директива 'uses'

      cmp     wmsg, WM_DESTROY    ;перев_рка пов_домлення на WM_DESTROY
      je      wmdestroy       ;перех_д до обробки пов_домлення WM_DESTROY
      cmp     wmsg, WM_CREATE    ;перев_рка пов_домлення на WM_CREATE
      je      wmcreate       ;перех_д до обробки пов_домлення WM_CREATE
      cmp     wmsg, WM_LBUTTONDOWN    ;перев_рка пов_домлення на WM_LBUTTONDOWN
      je      wmclick       ;перех_д до обробки пов_домлення WM_LBUTTONDOWN
      cmp     wmsg, WM_PAINT    ;перев_рка пов_домлення на WM_PAINT
      je      wmpaint       ;перех_д до обробки пов_домлення WM_PAINT

wmdefault:                        ; обробка за замовчанням 
	push	lparam
	push	wparam
	push	wmsg
	push	hwnd
	call    DefWindowProc
	ret
wmdestroy:		;уничтожение окна
        push    L 0
        call    PostQuitMessage
        mov     eax, 0
        ret
wmcreate:		;создание окна
	push	SND_ASYNC+SND_FILENAME	;играть асинхронно с диска файл
	push      L 0			
	push      offset sndfile	;имя файла
	call      PlaySound		;проигрываем файл
        mov     eax, 0			;возвращаем результат, что сообщение обработано
        ret
wmclick:		;левая кнопка мыши
	inc num		;увеличиваем количество нажатий
	lea ebx,rc	;находим в стеке адрес структуры RECT
	push ebx	;rc
	push hwnd	;hwnd
	call GetClientRect;получаем клиентскую область окна
	push 0		;не вытирать фон
	push ebx	;rc
	push hwnd	;hwnd
	call InvalidateRect	;обновить клиентскую область окна
        mov     eax, 0		;возвращаем результат, что сообщение обработано
        ret
wmpaint:	;перерисовка окна
	lea edi,ps	;находим в стеке адрес структуры PAINTSTRUCT
	push edi	;ps
	push hwnd       ;hwnd
	call BeginPaint	;получаем HDC окна
	mov esi,eax	;сохраняем hdc

	push num	;количество нажатий
	push offset stroka	;адрес шаблона
	push offset buf		;адрес результата
	call wsprintf	;формируем строку
	add esp,12	;корректируем стек, поскольку wsprintf этого не делает
	push offset buf	;сформированная строка
	call lstrlenA	;определяем ее длину
	push eax	;длина строки
	push offset buf	;ее адрес
	push 0		;координаты вывода в окне
	push 0
	push esi	;hdc
	call TextOutA	;выводим текст

	push edi	;ps
	push hwnd	;hwnd
	call EndPaint	;заканчиваем рисовать
	
        mov     eax, 0	;возвращаем результат, что сообщение обработано
        ret


WndProc          endp

public WndProc
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 01.07.2011, 19:49   #3
assch
Пользователь
 
Регистрация: 13.09.2010
Сообщений: 65
По умолчанию

Боюсь не пойму но попробую разобратся
В любом случае спасибо
assch вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перерисовка/обновление клиентской области окна ImmortalAlexSan Общие вопросы Delphi 0 09.01.2011 16:19
Мерцание, перепрорисовка не всей формы,InvalidateRect... Lelya-perinya Мультимедиа в Delphi 5 11.12.2010 07:56
Перерисовка окна _Dmitry_ Win Api 3 30.03.2010 19:55
Перерисовать окно InvalidateRect где указывать delias Win Api 2 25.03.2010 01:15