lanfengc 发表于 2012-5-5 20:01:49

窗体控件移动类---超多控件整体高效移动[已解决]

本帖最后由 lanfengc 于 2012-5-5 21:58 编辑

我在更新我写的那个验证码识别程序,准备做成能够让人调用的UDF或者EXE 带参数运行, 写字库生成程序的时候遇到一个问题。 窗体上超多的lable在左移 右移 上移 下移 的时候,超级慢。 我是用循环移动每个控件来完成的。 请问有什么好的办法吗?如下图示。

源代码如下:

#include <file.au3>
#Include <Misc.au3>
#include <array.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Global $lable , $dll=DllOpen("User32.dll") , $posarray ,$File="" ,$iLeft=0,$iRight=0,$iTop=0,$iBottom=0
Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=C:\Documents and Settings\Administrator\桌面\Form1.kxf
$Form = GUICreate("点阵创建工具", 120*9, 40*13+72, 192, 114)
GUISetBkColor(0xA6CAF0)
GUISetOnEvent($GUI_EVENT_CLOSE, "FormClose")
$inputpath = GUICtrlCreateInput("", 134, 5, 617, 21)
$Label1 = GUICtrlCreateLabel("选择编码过的文本文件", 8, 8, 124, 17)
$btnselect = GUICtrlCreateButton("SelectFile", 768, 4, 75, 21)
GUICtrlSetOnEvent(-1, "btnselectClick")
$btnMoveLeft = GUICtrlCreateButton("左移4像素", 8, 40, 75, 18)
GUICtrlSetOnEvent(-1, "btnMoveLeftClick")
$btnMoveRight = GUICtrlCreateButton("右移4像素", 93, 41, 75, 18)
GUICtrlSetOnEvent(-1, "btnMoveRightClick")
$btnMoveBottom = GUICtrlCreateButton("下移2像素", 271, 43, 75, 18)
GUICtrlSetOnEvent(-1, "btnMoveBottomClick")
$btnMoveTop = GUICtrlCreateButton("上移2像素", 186, 42, 75, 18)
GUICtrlSetOnEvent(-1, "btnMoveTopClick")
;~ $Group1 = GUICtrlCreateGroup("", 0,64,120*9, 40*13+72)
        For $i=0 To 39
                For $j=0 To 119
                        $lable[$i][$j] = GUICtrlCreateLabel("", 1+$j*9, 72+$i*13, 8, 12 , $WS_BORDER)
                Next
               
        Next
;~ GUICtrlCreateGroup("", -99, -99, 1, 1);close group

GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
        Sleep(10)
        If _IsPressed(0x01,$dll) And WinActive($Form) Then
                Local $MouseInfo=GUIGetCursorInfo($Form)
;~                 MsgBox(0,$MouseInfo&"|"&$MouseInfo,$MouseInfo&"|"&$MouseInfo&"|"&$MouseInfo)
;~                 MsgBox(0,Floor(($MouseInfo-6)/120),Mod($MouseInfo-6,120))
                If $MouseInfo>9 And GUICtrlRead($MouseInfo)<>" " Then
                        GUICtrlSetBkColor($MouseInfo,0XFF0000)
                        ToolTip(Floor(($MouseInfo-10)/120)-$iTop&"|"&Mod($MouseInfo-10,120)-$iLeft)
                ElseIf $MouseInfo=$btnselect Then
                        GUICtrlSetState($btnselect,$GUI_DISABLE)
                        btnselectClick()
                        GUICtrlSetState($btnselect,$GUI_ENABLE)
                EndIf
        ElseIf _IsPressed(0x02,$dll) Then
                Local $MouseInfo=GUIGetCursorInfo($Form)
;~                 MsgBox(0,$MouseInfo&"|"&$MouseInfo,$MouseInfo&"|"&$MouseInfo&"|"&$MouseInfo-5)
;~                 MsgBox(0,Floor(($MouseInfo-6)/120),Mod($MouseInfo-6,120))
                If $MouseInfo>9 And GUICtrlRead($MouseInfo)<>" " Then GUICtrlSetBkColor($MouseInfo,0xA6CAF0)

        EndIf
       
WEnd

Func btnselectClick()
       
        $File=FileOpenDialog("选择生成的点阵文件",@ScriptDir,"文本文件(*.txt)")
        If $File="" Then Return
        GUICtrlSetData($inputpath,$File)
        Local $array
        _FileReadToArray($File,$array)
        For $i=0 To $array-1
                $temp=StringSplit($array[$i+1],"")
                For $j=0 To $temp-2
                        $posarray[$i][$j]=$temp[$j+1]
                        GUICtrlSetData($lable[$i][$j],$posarray[$i][$j])
                Next
        Next
       
EndFunc

Func btnMoveRightClick()
        $iRight+=4
        $iLeft-=4
        For $i=0 To 39
                For $j=0 To 119
                        ControlMove($Form,"",$lable[$i][$j],$j*9+1+$iRight*9,Default)
                Next
        Next
EndFunc
Func btnMoveLeftClick()
        $iLeft+=4
        $iRight-=4
        For $i=0 To 39
                For $j=0 To 119
                        ControlMove($Form,"",$lable[$i][$j],$j*9+1-$iLeft*9,Default)
                Next
        Next
EndFunc
Func btnMoveBottomClick()
        $iBottom+=2
        $iTop-=2
        For $i=0 To 39
                For $j=0 To 119
                        ControlMove($Form,"",$lable[$i][$j],Default,72+($i+$iBottom)*13)
                Next
        Next
EndFunc

Func btnMoveTopClick()
        $iTop+=2
        $iBottom-=2

        For $i=0 To 39
                For $j=0 To 119
                        ControlMove($Form,"",$lable[$i][$j],Default,72+($i-$iTop)*13)
                Next
        Next
EndFunc

Func FormClose()
        Exit
EndFunc


随便发个点阵文件

                      00 00000                                                                   00                     
                     00   0000                                                                  00                     
                     0    00000   000                                                       000000                     
                  00   00000   00000                                                    00000000000                  
                  0000000 0000000000                                           000000000000000000000               
                  0000000000 00000 00000                                        0000   0000000000000000               
                000000000000000000000000                                    00         00000000000000000               
               0000000000000000000000000                                     0          0000000      000000            
            0000000000000000 000000000                                 00         000000      00000            
            000000    0000000 00000000                                  00            000000         00000            
             000000      00000   0000000                                 00             000000         00000            
             00000       000000   000000    00000                      00               000000         00000            
             00000       00000   00000000000000         00000000000000000         000000         00000            
             00000       00000   00000 000000000000   00      0000000000000         000000         00000            
             00          00000   000000000000000000000      0000000000000000      0000000      00000            
             0          00000      0000000000000000000 00       00000000000000000      0000000      000000            
            00       00000000      0000000000000000000       000000000000000000         00000000   0000000            
            0       0000000      00000000   0000000       00000000    00000000         0000000000000000            
         0      00000000       00000000   0000000      0000000      000000         000000000000000               
         0      000000000      000000000   0000000   000000         000000      0000000000000000               
          0         0000000000   000000000   0000000    0000000          000000      000000000000000000            
         00             000000   0000000000   000000    000000          0000000   00000000000000000000            
         0               000000    0000000000   000000    0000000         0000000    00000000000   0000000            
      00               000000    0000000000   000000    00000000000000000000000    00000000      000000            
      0   00000      000000    000000 0000    000000    00000000000000000000000   000000000         00000            
       0    00000      000000    000000 0000    000000    00000000000000000000000   00000000          000000         
      00    00000      000000    000000000    000000    00000000000000000000000   00000000          000000         
      0   00000      000000    0000000000   000000    000000                   000000000          000000         
   0       00000      0000000    0000000000   000000    000000                   000000000          000000         
    00       000000   000000   0000000000   000000   000000                   0000000         000000         
    0         0000000000000000   000000   000   0000000    000000                   00000000          00000            
   00         000000000000000      000000   00000000000   000000         000000   00000000          00000            
   0         00000000000000      000000   00000000000      0000000      000000    000000000      000000            
0             00000000000      000000    0000000000      0000000000000000000   000000000   0000000            
0               00000000         000000    0000000000       00000000000000000      000000000000000000000            
0                                 00000   0000000000      0000000000000000       0000000000000000000            
00                                          0000               0000000000000         00000000000000000               
0                                             0000                  0000000             000000000000000               
                                             0000                                       0000000000                  
                                             0000                                             0                     




解决的办法是 水木子 发出来的,在本帖后面有。 我现在把发到顶楼来,便于别人查阅。

#include <Constants.au3>
#include <WindowsConstants.au3>

Global $aButton ;总数
Global $iNumber = 100 ;每行数量
Global $iSpacingX = 9, $iSpacingY = 9 ;垂直、水平,间距
Global $iY = 0
Opt('GUIOnEventMode', 1)
$Form1 = GUICreate('', 298, 91)
GUISetOnEvent(-3, '_Events')
GUISetState()

$Form2 = GUICreate('', 910, 200, 0, 10, $WS_CHILD, $WS_EX_ACCEPTFILES, $Form1)

For $i = 0 To UBound($aButton) - 1
        $aButton[$i] = GUICtrlCreateLabel('', $iSpacingX * Mod($i, $iNumber), $iSpacingY * Floor($i / $iNumber), 10, 10, $WS_BORDER)
        If Random(1, 5, 1) = 1 Then GUICtrlSetBkColor(-1, 0xFF0000)
Next
GUISetState()

While 1
        WinMove($Form2, '', $iY, 0)
        $iY -= 9
        Sleep(100)
WEnd

Func _Events()
        Switch @GUI_CtrlId
                Case -3
                        Exit
        EndSwitch
EndFunc   ;==>_Events

lanfengc 发表于 2012-5-5 20:13:55


如上图所示,我需要将字符点阵移动成这样的,然后点击某个0位置的lable,提示该点的坐标并写入到字库, 左键点写入,右键点删除。
如何能让移动的时候效率点?

afan 发表于 2012-5-5 20:15:09

如果是整体移动Label,可以内嵌个创建所有Label的子窗体,移动时移动子窗体

lanfengc 发表于 2012-5-5 20:17:37

回复 3# afan


    子窗体移动的时候,超出边界的lable不会消失。

zldfsz 发表于 2012-5-5 20:18:45

lable颜色构成的,多得有点吓人,呵呵,怎么不直接表示有颜色部分呢?

afan 发表于 2012-5-5 20:19:55

本帖最后由 afan 于 2012-5-5 20:21 编辑

回复 4# lanfengc


    内嵌的,不是分层的,超出边界的lable怎么会不消失呢?
一眨眼上代码了…

lanfengc 发表于 2012-5-5 20:43:23

回复 6# afan


    内嵌子窗体 移动的时候,内部LABLE的坐标就不对了吧。

afan 发表于 2012-5-5 20:44:53

回复 7# lanfengc


    重新计算下应该不麻烦

happytc 发表于 2012-5-5 20:54:42

回复 1# lanfengc


    这也是前段时间我也问过的一个问题:用au3建了很多控件后,就会闪的问题
我也一直没有找到好的办法
http://www.autoitx.com/forum.php?mod=viewthread&tid=31665&highlight=%2Bhappytc

haijie1223 发表于 2012-5-5 20:56:50

学习了。长见识了

lanfengc 发表于 2012-5-5 20:59:51

回复 8# afan


    给个例子? 我不知道如何创建子窗体。

hzxymkb 发表于 2012-5-5 21:05:05

本帖最后由 hzxymkb 于 2012-5-5 21:08 编辑

回复 10# haijie1223


   {:1_189:}NND,你又隐身了?我看不见你上线?

hzxymkb 发表于 2012-5-5 21:08:49

回复 11# lanfengc


    用TAB行吗?

lanfengc 发表于 2012-5-5 21:11:03

回复 13# hzxymkb


    将所有的Lable创建到一个TAB页中,然后移动吗?

hzxymkb 发表于 2012-5-5 21:26:27

回复 14# lanfengc


    是的
页: [1] 2
查看完整版本: 窗体控件移动类---超多控件整体高效移动[已解决]