Что нового

Не сохраняется текст при восстановлении окна

joiner

Модератор
Локальный модератор
Сообщения
3 046
Репутация
511
пример из справки
Код:
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <FontConstants.au3>
#include <GUIConstantsEx.au3>
Global $tRECT, $hFont, $OldFont, $hDC

HotKeySet("{ESC}", "_Exit")
$tRECT = DllStructCreate($tagRect)
DllStructSetData($tRECT, "Left", 5)
DllStructSetData($tRECT, "Top", 5)
DllStructSetData($tRECT, "Right", 250)
DllStructSetData($tRECT, "Bottom", 50)

$Form1 = GUICreate("Form1", 432, 218, 192, 124)
$Label1 = GUICtrlCreateLabel("Label1", 48, 100, 228, 17)
$Button1 = GUICtrlCreateButton("Button1", 328, 160, 75, 25)
GUISetState(@SW_SHOW)
$hDC = _WinAPI_GetDC($Form1)
$hFont = _WinAPI_CreateFont(50, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, _
		$OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Arial')
$OldFont = _WinAPI_SelectObject($hDC, $hFont)

$i = 0
While 1

	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			_Exit()
			Exit
		Case $Button1
			_WinAPI_DrawText($hDC, 'Слово', $tRECT, $DT_CENTER)
			While 1
				GUICtrlSetData($Label1, $i)
				Sleep(100)
				$i += 1
			WEnd
	EndSwitch
WEnd
Func _Exit()
	_WinAPI_SelectObject($hDC, $OldFont)
	_WinAPI_DeleteObject($hFont)
	_WinAPI_ReleaseDC($Form1, $hDC)
	_WinAPI_InvalidateRect($Form1)
	Exit
EndFunc   ;==>_Exit

в данном варианте при нажатии кнопки появляется надпись. потом цикл. если свернуть окно и восстановить, то надпись исчезает. в цикл ее ставить не вариант.
как решить этот вопрос?
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
joiner
Я тоже замечал такое, когда окно с вашими (например) буквами нарисованными через api "затираются" когда двигаешь окно за пределы экрана или ваше же окно затереть другим поверх его. Может быть зарегистрировать функцию которая будет отвечать за требование перерисовки окна? $wm_paint а слово по мере надобности хранить в переменной глобальной
 

MaximK

Знающий
Сообщения
33
Репутация
5
Попробуйте так
Код:
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <FontConstants.au3>
#include <GUIConstantsEx.au3>
Global $tRECT, $hFont, $OldFont, $hDC

HotKeySet("{ESC}", "_Exit")
$tRECT = DllStructCreate($tagRect)
DllStructSetData($tRECT, "Left", 5)
DllStructSetData($tRECT, "Top", 5)
DllStructSetData($tRECT, "Right", 250)
DllStructSetData($tRECT, "Bottom", 50)

$Form1 = GUICreate("Form1", 432, 218, 192, 124)
$Label1 = GUICtrlCreateLabel("Label1", 48, 100, 228, 17)
$Button1 = GUICtrlCreateButton("Button1", 328, 160, 75, 25)
GUISetState(@SW_SHOW)
$hDC = _WinAPI_GetDC($Form1)
$hFont = _WinAPI_CreateFont(50, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, _
		$OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Arial')
$OldFont = _WinAPI_SelectObject($hDC, $hFont)
GUIRegisterMsg($WM_PAINT, "WM_PAINT")

$i = 0
While 1

	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			_Exit()
			Exit
		Case $Button1
			_WinAPI_DrawText($hDC, 'Слово', $tRECT, $DT_CENTER)
			While 1
				GUICtrlSetData($Label1, $i)
				Sleep(100)
				$i += 1
			WEnd
	EndSwitch
WEnd
Func _Exit()
	_WinAPI_SelectObject($hDC, $OldFont)
	_WinAPI_DeleteObject($hFont)
	_WinAPI_ReleaseDC($Form1, $hDC)
	_WinAPI_InvalidateRect($Form1)
	Exit
EndFunc   ;==>_Exit

Func WM_PAINT($hWnd, $Msg, $wParam, $lParam)
	_WinAPI_DrawText($hDC, 'Слово', $tRECT, $DT_CENTER)
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_PAINT
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
MaximK
Как странно, после длительного "движения" окна за пределами экрана те окна что являются не активными сворачиваются абсолютно все
p.s. win8.1
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3 046
Репутация
511
вроде как нашел решение.
вот часть кода из моей программы с реализацией
Код:
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <FileOperations.au3>
#include <Clipboard.au3>
#include <WinAPI.au3>
#include <FontConstants.au3>
#include <WindowsConstants.au3>
#include <APIConstants.au3>
#include <WinAPIEx.au3>
Opt("GUICloseOnESC", 0)
Opt("TrayAutoPause", 0)


OnAutoItExitRegister('OnAutoItExit')

	Global $tag_RECT1 = "struct;long Left1;long Top1;long Right1;long Bottom1;endstruct"
	Global $tag_RECT2 = "struct;long Left2;long Top2;long Right2;long Bottom2;endstruct"
	Global $tag_RECT3 = "struct;long Left3;long Top3;long Right3;long Bottom3;endstruct"
	Global $tag_RECT4 = "struct;long Left4;long Top4;long Right4;long Bottom4;endstruct"
	Global $tag_RECT5 = "struct;long Left5;long Top5;long Right5;long Bottom5;endstruct"
	Global $tag_RECT6 = "struct;long Left6;long Top6;long Right6;long Bottom6;endstruct"
	Global $tag_RECT7 = "struct;long Left7;long Top7;long Right7;long Bottom7;endstruct"

	Global $tRECT1, $tRECT2, $tRECT3, $tRECT4, $tRECT5, $tRECT6, $tRECT7, $hFont, $hOldFont, $hDC, $Count = 0

	$tRECT1 = DllStructCreate($tag_RECT1)
	DllStructSetData($tRECT1, "Left1", 14)
	DllStructSetData($tRECT1, "Top1", 8)
	DllStructSetData($tRECT1, "Right1", 150)
	DllStructSetData($tRECT1, "Bottom1", 50)

	$tRECT2 = DllStructCreate($tag_RECT2)
	DllStructSetData($tRECT2, "Left2", 14)
	DllStructSetData($tRECT2, "Top2", 40)
	DllStructSetData($tRECT2, "Right2", 150)
	DllStructSetData($tRECT2, "Bottom2", 100)

	$tRECT3 = DllStructCreate($tag_RECT3)
	DllStructSetData($tRECT3, "Left3", 14)
	DllStructSetData($tRECT3, "Top3", 72)
	DllStructSetData($tRECT3, "Right3", 150)
	DllStructSetData($tRECT3, "Bottom3", 150)

	$tRECT4 = DllStructCreate($tag_RECT4)
	DllStructSetData($tRECT4, "Left4", 14)
	DllStructSetData($tRECT4, "Top4", 104)
	DllStructSetData($tRECT4, "Right4", 150)
	DllStructSetData($tRECT4, "Bottom4", 200)

	$tRECT5 = DllStructCreate($tag_RECT5)
	DllStructSetData($tRECT5, "Left5", 14)
	DllStructSetData($tRECT5, "Top5", 138)
	DllStructSetData($tRECT5, "Right5", 100)
	DllStructSetData($tRECT5, "Bottom5", 250)

	$tRECT6 = DllStructCreate($tag_RECT6)
	DllStructSetData($tRECT6, "Left6", 35)
	DllStructSetData($tRECT6, "Top6", 240)
	DllStructSetData($tRECT6, "Right6", 250)
	DllStructSetData($tRECT6, "Bottom6", 300)

	$tRECT7 = DllStructCreate($tag_RECT7)
	DllStructSetData($tRECT7, "Left7", 187)
	DllStructSetData($tRECT7, "Top7", 240)
	DllStructSetData($tRECT7, "Right7", 260)
	DllStructSetData($tRECT7, "Bottom7", 300)

	Global $Form1 = GUICreate("CopyEX", 411, 270, -1, -1, $GUI_SS_DEFAULT_GUI, $WS_EX_TOPMOST)
	Global $Progress1 = GUICtrlCreateProgress(16, 176, 374, 17)
	Global $Label2 = GUICtrlCreateLabel("", 100, 136, 287, 20, $SS_RIGHT)
	Global $Label7 = GUICtrlCreateLabel("", 290, 8, 100, 20, $SS_RIGHT)
	Global $Label8 = GUICtrlCreateLabel("", 290, 40, 100, 20, $SS_RIGHT)
	Global $Label9 = GUICtrlCreateLabel("", 290, 72, 100, 20, $SS_RIGHT)
	Global $Label10 = GUICtrlCreateLabel("", 290, 104, 100, 20, $SS_RIGHT)
	Global $Checkbox1 = GUICtrlCreateCheckbox("", 16, 240, 17, 17)
	Global $Checkbox2 = GUICtrlCreateCheckbox("", 168, 240, 17, 17)
	$Start = GUICtrlCreateButton("Старт", 16, 210, 75, 20)
	$Stop = GUICtrlCreateButton("Стоп", 315, 210, 75, 20)
	$Pause = GUICtrlCreateButton("Пауза", 168, 210, 75, 20)
	GUISetState(@SW_SHOW)
	$dialog = 'Введите новое имя или выберите папку для сохранения'
	Global $hDC = _WinAPI_GetDC($Form1)
	Global $hFont = _WinAPI_CreateFont(17, 0)
	Global $hOldFont = _WinAPI_SelectObject($hDC, $hFont)
	_DrawText()
	Global $hDll = DllCallbackRegister('_WinProc', 'ptr', 'hwnd;uint;wparam;lparam')
	Global $pDll = DllCallbackGetPtr($hDll)
	Global $hProc = _WinAPI_SetWindowLongEx($Form1, $GWL_WNDPROC, $pDll)
$i = 0
	While 1
		$nMsg = GUIGetMsg()
		Switch $nMsg
			Case $GUI_EVENT_CLOSE
				OnAutoItExit()
				ClipPut('')
				$array = 0
				GUIDelete()
				ExitLoop
			Case $Start
				While 1
					GUICtrlSetData($Label2,$i)
					$i+=1
					Sleep(100)
				WEnd

				If GUICtrlRead($Checkbox2) = $GUI_CHECKED Then
					$Dest = FileSaveDialog('', @DesktopDir, '(*.*)', 16, $dialog, $Form1)
					$delim = StringRegExpReplace($Dest, '.*\\', '')
					$dest_replace = _FO_PathSplit($Dest)
					If $delim = $dialog Then
						$Dest = $dest_replace[0]
					Else
						$Dest = $dest_replace[0] & $dest_replace[1]
					EndIf
				Else
					$Dest = FileSelectFolder('Выберите папку сохранения', '', 1 + 2 + 4, '', $Form1)
				EndIf
				GUICtrlSetState($Checkbox2, $GUI_DISABLE)
				GUICtrlSetState($Start, $GUI_DISABLE)
				GUICtrlSetState($Checkbox1, $GUI_DISABLE)
				;If $Dest Then
				;	For $i = 0 To UBound($Source_array) - 1
				;		$Source_array[$i][1] = $Dest
				;	Next
			;	Else
				;	OnAutoItExit()
				;	ClipPut('')
				;	$array = 0
				;	GUIDelete()
				;	ExitLoop
			;	EndIf
				ClipPut('')
				If GUICtrlRead($Checkbox1) = $GUI_CHECKED Then
					$rewrite = 1
				Else
					$rewrite = 0
				EndIf
				;$ret = _CopyDirCopyFile($Source_array, $rewrite, $rewrite, $Progress1, $Stop, $Pause, 'Далее')
				$Source_array = 0
				OnAutoItExit()
				ClipPut('')
				$array = 0
				GUIDelete()
				ExitLoop
		EndSwitch
	WEnd


Func _WinProc($hWnd, $iMsg, $wParam, $lParam)
	Switch $iMsg
		Case $WM_PAINT
			If $Count = 0 Then
				$Count += 1
				Local $tPAINTSTRUCT, $DC
				$DC = _WinAPI_BeginPaint($hWnd, $tPAINTSTRUCT)
				_DrawText()
				_WinAPI_EndPaint($hWnd, $tPAINTSTRUCT)
				$Count -= 1
				Return 0
			EndIf
	EndSwitch
	Return _WinAPI_CallWindowProc($hProc, $hWnd, $iMsg, $wParam, $lParam)
EndFunc   ;==>_WinProc

Func OnAutoItExit()
	_WinAPI_SetWindowLongEx($Form1, $GWL_WNDPROC, $hProc)
	DllCallbackFree($hDll)
	_Exit()
EndFunc   ;==>OnAutoItExit

Func _DrawText()
	_WinAPI_DrawText($hDC, 'Общий объем', $tRECT1, $DT_LEFT)
	_WinAPI_DrawText($hDC, 'Скопировано', $tRECT2, $DT_LEFT)
	_WinAPI_DrawText($hDC, 'Скорость', $tRECT3, $DT_LEFT)
	_WinAPI_DrawText($hDC, 'Процент', $tRECT4, $DT_LEFT)
	_WinAPI_DrawText($hDC, 'Файл', $tRECT5, $DT_LEFT)
	_WinAPI_DrawText($hDC, 'Перезапись', $tRECT6, $DT_LEFT)
	_WinAPI_DrawText($hDC, 'Как файл', $tRECT7, $DT_LEFT)
EndFunc   ;==>_DrawText

Func _Exit()
	_WinAPI_SelectObject($hDC, $hOldFont)
	_WinAPI_DeleteObject($hFont)
	_WinAPI_ReleaseDC($Form1, $hDC)
	_WinAPI_InvalidateRect($Form1, $tRECT1)
	_WinAPI_InvalidateRect($Form1, $tRECT2)
	_WinAPI_InvalidateRect($Form1, $tRECT3)
	_WinAPI_InvalidateRect($Form1, $tRECT4)
	_WinAPI_InvalidateRect($Form1, $tRECT5)
	_WinAPI_InvalidateRect($Form1, $tRECT6)
	_WinAPI_InvalidateRect($Form1, $tRECT7)
	$tRECT1 = 0
	$tRECT2 = 0
	$tRECT3 = 0
	$tRECT4 = 0
	$tRECT5 = 0
	$tRECT6 = 0
	$tRECT7 = 0
EndFunc   ;==>_Exit
 
Верх