Method: Fzeet::Control#initialize

Defined in:
lib/fzeet/windows/user/Control/Common.rb

#initialize(className, parent, id, opts = {}) ⇒ Control

Returns a new instance of Control.



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/fzeet/windows/user/Control/Common.rb', line 29

def initialize(className, parent, id, opts = {})
  @parent = parent
  @id = Command[id]

  handlers = {}

  opts.delete_if { |k, v|
    next false unless v.kind_of?(Proc)

    handlers[k] = v; true
  }

  _opts = {
    xstyle: [],
    caption: id.capitalize,
    style: [],
    x: 0,
    y: 0,
    width: 0,
    height: 0,
    position: [],
    anchor: nil
  }
  badopts = opts.keys - _opts.keys; raise "Bad option(s): #{badopts.join(', ')}." unless badopts.empty?
  _opts.merge!(opts)

  _opts[:xstyle] = Fzeet.flags(_opts[:xstyle], *self.class::Prefix[:xstyle])
  _opts[:caption] = _opts[:caption].to_s
  _opts[:style] = Fzeet.flags([:child, :visible, :tabstop], :ws_) | Fzeet.flags(_opts[:style], *self.class::Prefix[:style])
  _opts[:x], _opts[:y], _opts[:width], _opts[:height] = _opts[:position] unless _opts[:position].empty?

  @handle = Windows.DetonateLastError(FFI::Pointer::NULL, :CreateWindowEx,
    _opts[:xstyle], className, _opts[:caption], _opts[:style],
    _opts[:x], _opts[:y], _opts[:width], _opts[:height],
    @parent.handle, FFI::Pointer.new(@id), Windows.GetModuleHandle(nil), nil
  )

  attach

  sendmsg(:setfont, Font.handle, 1)

  handlers.each { |k, v| on(k, &v) }

  case _opts[:anchor]
  when :ltr
    @parent.on(:size) { |args|
      self.position = @parent.rect.tap { |r| r[:bottom] = _opts[:height] }.to_a

      args[:result] = nil if @parent.class == MDIChild
    }
  when :lrb
    @parent.on(:size) { |args|
      self.position = @parent.rect.tap { |r| r[:top] = r[:bottom] - _opts[:height]; r[:bottom] = _opts[:height] }.to_a

      args[:result] = nil if @parent.class == MDIChild
    }
  when :ltrb
    @parent.on(:size) { |args|
      self.position = @parent.rect.to_a

      args[:result] = nil if @parent.class == MDIChild
    }
  else raise ArgumentError, "Bad anchor spec: #{_opts[:anchor]}."
  end if _opts[:anchor]
end