1

Тема: AHK:GUI, DllCall и еще кое-какие вопросы...

Добрый день, форумчане. Накопилось множество вопросов на которые я не нашел ответы на нашем (да и на забугорном) форуме.
1) Как в GUI  нарисовать линии? Требуется рисовать линии в Gui, в котором содержатся кнопки, картинки, прогресбары и т.д. То есть мне требуется на ряду с обычными элементами Gui, рисовать и линии или прямоугольники.
2) Можно ли сделать регистрацию drag and drop по картинке? То есть таскать картинку (Да и вообще любой контрол.) в Gui мышкой?
3) Как можно отображать данные объекта во всплывающем окне по клику на картинку (Gui элемент) класса? Как только я не мучался, и в классе инициализировал второе окно, и в начале скрипта, ничего не получается.

+ открыть спойлер
;Инициализацию второго ГУИ я делал в начале скрипта.
class Valve{
  x:=0, y:=0, db:=0
  __New(x,y,name){
    this.name:=name 
    this.x:=x
    this.y:=y
    Gui, Add, Picture, w30 h-1 x%x% y%y% BackgroundTrans gValve.TEST hwndV1, C:\Users\vic\Pictures\Val-Grey.emf
    this.V1:=V1
    x2:=x+30
    y2:=y+25
    gui, add, text, x%x2% y%y2% hwnddbg, text000
    this.dbg:=dbg
    x3:=x+30
    y3:=y+0
    gui, add, text, x%x3% y%y3% cRed hwndMan, te
    this.Man:=Man
  }
  update(db){
    this.db:=db
    GuiControl,, % this.dbg, % this.name
    if (db==0)
    GuiControl,, % this.V1, C:\Users\vic\Pictures\Val-Grey.emf
    else if (db==1) or (db==5)
    GuiControl,, % this.V1, C:\Users\vic\Pictures\Val-Green.emf
    else if (db==2) or (db==6)
    GuiControl,, % this.V1, C:\Users\vic\Pictures\Val-Red.emf
    else if (TicTak==1) and ((db==3) or (db==7)) 
    GuiControl,, % this.V1, C:\Users\vic\Pictures\Val-Green.emf
    Else if (TicTak==0) and ((db==3) or (db==7))
    GuiControl,, % this.V1, C:\Users\vic\Pictures\Val-Grey.emf
    else if (TicTak==1) and ((db==4) or (db==8))
    GuiControl,, % this.V1, C:\Users\vic\Pictures\Val-Red.emf
    else if (TicTak==0) and ((db==4) or (db==8))
    GuiControl,, % this.V1, C:\Users\vic\Pictures\Val-Grey.emf

    GuiControl,2:, % this.TT1, % db

    if (db=5) or (db=6) or (db=7) or (db=8)
    GuiControl,, % this.Man, M
    else GuiControl,, % this.Man, 

  }
  ;тестирование открытия окна по клику на клапан. Открываться должны с данными клапана.
  ;какие только варианты не были испробованы... 
  TEST() {
    ;gui, 2:Submit
    ;Gui, 2:add, text,hwndTT1, text
    ;this.TT1:=TT1
    ;GuiControl,2:, % this.TT1, % db
    ;this.TEST:=TEST
    gui, 2:show, h100 w100
    
  }
}

4) Можно ли как то перевернуть картинку на 90 градусов?
5) Ну и последний вопрос, как правильно отправлять числа в DllCall? Именно числа. У меня отправляются символы. Вместо 1 отправляется 49, что является кодом числа 1 в ASCII.

WriteDB(obj, db, start, size, data){
	SetFormat,Integer,DEC
	DllCall("snap7.dll\Cli_DBWrite", "Ptr", obj, "Int", db, "int", start, "int", size, "ptr", &data) 
	return
}

2

Re: AHK:GUI, DllCall и еще кое-какие вопросы...

По вопросу №1. Линии и прямоугольники будут одинакового цвета? Будут ли они параллельны рамкам окна, или могут идти по диагонали?

3

Re: AHK:GUI, DllCall и еще кое-какие вопросы...

ypppu Будут параллельны рамкам окна и можно одинакового цвета.

4 (изменено: ypppu, 2017-09-20 18:22:45)

Re: AHK:GUI, DllCall и еще кое-какие вопросы...

По вопросу №1: http://forum.script-coding.com/viewtopi … 934#p46934.

По вопросу №2: действуйте согласно справке, там написано.

GUI, Add, Button, w50 h50, KNOPKA1
GUI, Add, Button, w100 h100 vKNOPKA2, 
GUI, Show ; , w100 h100
Return

GuiDropFiles:
MsgBox, Вы перетащили %A_GuiControlEvent%`nна элемент управления %A_GuiControl%
Return

По вопросу №3: что значит по клику на картинку класса?

По вопросу №4: стандартных способов вроде нет, см. GDI plus.

5

Re: AHK:GUI, DllCall и еще кое-какие вопросы...

ypppu Спасибо за ссылку. Мне это подходит.
По второму вопросу, видимо я неправильно выразился, мне нужно просто перетаскивать контролы по GUI окну. Не нужно кидать файлы на GUI.
Третье, в классе есть картинка. По клику на этой картинке можно вызвать метод класса. Вот как так сделать что бы этот метод вызывал еще одно окошко и в этом окошке было отображение данных данного объекта?

6

Re: AHK:GUI, DllCall и еще кое-какие вопросы...

В методах классов я не разбираюсь. Вот пример с кнопкой, при нажатии по кнопке выводится информация о ней . Аналогично можно вывести информацию о картинке.

GUI, Add, Button, w50 h50 gSub, KNOPKA1
GUI, Add, Button, w100 h100 gSub vKNOPKA2
GUI, Show ; , w100 h100
Return

Sub:
ToolTip,  %A_GuiControlEvent%`n %A_GuiControl%
Return

7

Re: AHK:GUI, DllCall и еще кое-какие вопросы...

А кто подскажет насчет пятого вопроса?

+ открыть спойлер

Ну и последний вопрос, как правильно отправлять числа в DllCall? Именно числа. У меня отправляются символы. Вместо 1 отправляется 49, что является кодом числа 1 в ASCII.

WriteDB(obj, db, start, size, data){
	SetFormat,Integer,DEC
	DllCall("snap7.dll\Cli_DBWrite", "Ptr", obj, "Int", db, "int", start, "int", size, "ptr", &data) 
	return
}

8

Re: AHK:GUI, DllCall и еще кое-какие вопросы...

Всё нормально у вас должно отправляться.

9

Re: AHK:GUI, DllCall и еще кое-какие вопросы...

YMP Дело в том что как раз оно и отправляется, но только как символ "1" а не как число. То есть в формате Сhar, а должно быть в Int.

10

Re: AHK:GUI, DllCall и еще кое-какие вопросы...

Как вы это посмотрели? Если речь о том, что пишет функция Cli_DBWrite, то к ней и вопрос. Наверно, она преобразует число в строковый вид.

11

Re: AHK:GUI, DllCall и еще кое-какие вопросы...

5) Как всегда ссылаюсь на свою старую тему:

      ; данные для отправки
      b_0=0          ; 1 байт
      b_1++          ; 1 байт
      b_2=255        ; 1 байт
      w_0=1234567890 ; 4 байта
      b_3=128        ; 1 байт

      varsetcapacity(Out_Data,Send_Data_Size) ; задаём размер переменной для отправки
      NumPut(b_0,Out_Data,0,"Uchar")          ; 1 байт
      NumPut(b_1,Out_Data,1,"Uchar")          ; 1 байт
      NumPut(b_2,Out_Data,2,"Uchar")          ; 1 байт
      NumPut(w_0,Out_Data,3,"Uint")           ; 4 байта
      NumPut(b_3,Out_Data,7,"Uchar")          ; 1 байт
                                              ; остальные байты резервные

      ; пишем данные в порт
      RS232_Write(RS232_FileHandle,&Out_Data,Send_Data_Size)
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

12

Re: AHK:GUI, DllCall и еще кое-какие вопросы...

YMP Эта функция связи с контроллером. Посмотрел напрямую в контроллере. Дело в том что (как я понял), в AHK ВСЕ данные хранятся в виде string. А мне нужно было именно числа.
Alectric Плохо я читал вашу тему)) То что нужно. Спасибо.

13

Re: AHK:GUI, DllCall и еще кое-какие вопросы...

Raven пишет:

Дело в том что (как я понял), в AHK ВСЕ данные хранятся в виде string. А мне нужно было именно числа.

Так это хранятся (в переменных). Передаются-то они так, как вы укажете. Или думаете, что АНК делает исключение лично для вас, из вредности?