Hatena::Groupmoz-addon

Ci.nsIZIGOROu

2008-01-24大人になる

IEでWindows Common Control (3) - StatusBar

| 02:16 |  IEでWindows Common Control (3) - StatusBar - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  IEでWindows Common Control (3) - StatusBar - Ci.nsIZIGOROu

よーし、今日はこれを最後にするお。

f:id:ZIGOROu:20080125015439p:image

ソース

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:hta="urn:HTMLApplication" xml:lang="ja" lang="ja">
  <head>
    <title>Status Bar</title>
    <style type="text/css">
      div#commonCtlContainer object#statusbar {
        display: block;
        margin: 0 auto;
        background-color: glay;
      }
    </style>
  </head>
  <body>
    <div id="commonCtlContainer">
      <object classid="clsid:8E3867A3-8586-11D1-B16A-00C0F0283628" id="statusBar" width="100%" height="20">
        <param name="ShowTips" value="true" />
        <param name="Style" value="0" />
      </object>
    </div>
    <script type="text/javascript">
      // <![CDATA[
for (var i = 0; i < 8; i++) {
  statusBar.Panels.Add(i + 1, "test" + (i + 1), "test" + (i + 1), i);

  with ({ panel: statusBar.Panels.Item(i + 1) }) {
    panel.Bevel = i % 3;
  }
}

statusBar.attachEvent('PanelClick', function(panel) { alert(panel.Text); });
      // ]]>
    </script>
  </body>
</html>

サンプル

メモ

IPanels, IPanelはnoncreatableなのでStatusBarからAddして作る

まぁ表題通りなんですけど、

[id(0x00000002), helpstring("Adds a Panel object to a Panels collection and returns a reference to the created Panel."), helpcontext(0x000335ff)]
IPanel* Add(
                [in, optional] VARIANT* Index, 
                [in, optional] VARIANT* Key, 
                [in, optional] VARIANT* Text, 
                [in, optional] VARIANT* Style, 
                [in, optional] VARIANT* Picture);

って定義なんだけど、Indexは1から始まり、Keyはuniqueじゃなきゃダメ。

Textに関しては後で書くけど、Styleに依存する。

Pictureは今の所どうやって指定するか分からんw

PanelのStyle, Bevel
[id(0x0000000a), propget, helpstring("Returns/sets the style of a StatusBar Panel object"), helpcontext(0x00033621)]
HRESULT Style([out, retval] PanelStyleConstants* psStyle);

[id(0x0000000a), propput, helpstring("Returns/sets the style of a StatusBar Panel object"), helpcontext(0x00033621)]
HRESULT Style([in] PanelStyleConstants psStyle);

[id(0x00000003), propget, helpstring("Returns/sets the bevel appearance of a Panel object, inset, raised, or none"), helpcontext(0x0003361a)]
HRESULT Bevel([out, retval] PanelBevelConstants* psBevel);

[id(0x00000003), propput, helpstring("Returns/sets the bevel appearance of a Panel object, inset, raised, or none"), helpcontext(0x0003361a)]
HRESULT Bevel([in] PanelBevelConstants psBevel);

と言う定義なので、それぞれ

  • PanelStyleConstants
  • PanelBevelConstants

を見るんですが、

typedef [uuid(8E3867A9-8586-11D1-B16A-00C0F0283628), helpstring("Panel Style constants"), helpcontext(0x0003360f)]
enum {
    sbrText = 0,
    sbrCaps = 1,
    sbrNum = 2,
    sbrIns = 3,
    sbrScrl = 4,
    sbrTime = 5,
    sbrDate = 6,
    sbrKana = 7
} PanelStyleConstants;

typedef [uuid(8E3867A8-8586-11D1-B16A-00C0F0283628), helpstring("Panel Bevel constants"), helpcontext(0x0003360b)]
enum {
    sbrNoBevel = 0,
    sbrInset = 1,
    sbrRaised = 2
} PanelBevelConstants;

って定義になってて、それぞれのバリエーションでサンプルは出力してるって感じ。

でStyle指定なんですが、表示見てもらえれば分かるかと思いますが、PanelStyleConstants.sbrText(=0)を指定した時じゃないとTextは表示されません。悪しからず。

StatusBarのイベント

試しにやってみて出来てびっくりした次第なのですが、attachEventで普通にattach出来ちゃったお、超驚きなんすけどw

イベントに関してはIStatusBarEventsで定義してあって、今回は、

[id(0x00000001), helpstring("Similar to the standard Click event, but the PanelClick event occurs when a user presses and then releases a mouse button over any of the StatusBar control's Panel objects."), helpcontext(0x000335f6)]
void PanelClick(Panel* Panel);

を使った。

ハンドラに対してPanelオブジェクトが渡るので、指定したPanelのTextプロパティalertしてます。

その他

Font, Pictureの指定方法が分からない。

  • IFontDisp
  • IPictureDisp

を調べれば分かるはず。

あとどうも内部的にShift_JIS決め打ちの悪寒。

感想

フォントさえ指定出来れば意外とHTAで使えそうな気がした。

がHTMLでいいんじゃね的な考えは常に付きまとうんだけどw


IEでWindows Common Control (2) - Slider

| 00:50 |  IEでWindows Common Control (2) - Slider - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  IEでWindows Common Control (2) - Slider - Ci.nsIZIGOROu

f:id:ZIGOROu:20080125004043p:image

ですな。

ソース

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:hta="urn:HTMLApplication" xml:lang="ja" lang="ja">
  <head>
    <title>Slider</title>
    <style type="text/css">
      div#commonCtlContainer object#slider {
        display: block;
        margin: 0 auto;
        background-color: glay;
      }

      div#commonCtlContainer p {
        font-size: small;
        text-align: center;
      }
    </style>
  </head>
  <body>
    <div id="commonCtlContainer">
      <object classid="clsid:F08DF954-8592-11D1-B16A-00C0F0283628" id="slider" width="400">
        <param name="Min" value="0" />
        <param name="Max" value="100" />
        <param name="Orientation" value="0" />
        <param name="Text" value="Slider" />
        <param id="tickStyle" name="TickStyle" value="0" />
        <param name="SelectRange" value="false" />
      </object>
      <p id="sliderValue">0</p>
    </div>
    <script type="text/javascript">
      // <![CDATA[
      (function() {
        var text = document.getElementById('sliderValue');

        slider.attachEvent('Change', function() { 
          text.innerHTML = slider.Value;
        });
      })();
      // ]]>
    </script>
  </body>
</html>

サンプル

メモ

TickStyleについて

これは目盛りをどう表示するかで、

typedef [uuid(F08DF950-8592-11D1-B16A-00C0F0283628), helpstring("TickStyle constants"), helpcontext(0x00033506)]
enum {
    sldBottomRight = 0,
    sldTopLeft = 1,
    sldBoth = 2,
    sldNoTicks = 3
} TickStyleConstants;

のいずれかの値です。

これって動的に変更出来るように試しに作ったんだけど、どうも変更できないみたい。

大きさについて

widthに関しては普通に変更出来るんだけど、heightは上限値がある模様。

heightは何も指定しない方が良さそう。

object.innerHTML

param要素がたくさん出てくるハズなんだけど、これやってみると面白いです。

設定してないparamも見える。恐らく初期値一覧が取れるって事ですね。

paramをまったく指定せずに、

var paramCol = object.getElementsByTagName('param');
var defaults = {};

for (var i = 0, l = paramCol.length; i < l; i++) {
  with({ param: paramCol.item(i) }) {
    defaults[param.name] = param.value;
  }
}

とかやると多分デフォルトの値一覧が取れるっぽぃ。

感想

今の所、Web用途はNGだと思うけどHTAならありだと思った。


IEでWindows Common Control (1) - ProgressBar

| 23:30 |  IEでWindows Common Control (1) - ProgressBar - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  IEでWindows Common Control (1) - ProgressBar - Ci.nsIZIGOROu

IEだとかHTAをユーザー限定でやるならえげつないActiveXコントロール使ったっていいじゃない(誰

と思って試しにプログレスバーをやってみた。

f:id:ZIGOROu:20080124231959p:image

こういうのね。

ソース

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:hta="urn:HTMLApplication" xml:lang="ja" lang="ja">
  <head>
    <title>Progress Bar</title>
    <style type="text/css">
      div#commonCtlContainer object#prog {
        display: block;
        margin: auto;
        background-color: buttoncolor;
      }

      div#commonCtlContainer p {
        font-size: small;
        text-align: center;
      }
    </style>
  </head>
  <body>
    <div id="commonCtlContainer">
      <object classid="clsid:35053A22-8589-11D1-B16A-00C0F0283628" id="prog" height="20" width="400">
        <param name="Min" value="0" />
        <param name="Max" value="100" />
        <param name="Orientation" value="0" />
        <param name="Scrolling" value="1" />
      </object>
      <p id="progText">0%</p>
    </div>
    <script type="text/javascript">
      // <![CDATA[
      (function() {
        var iid;
        var text = document.getElementById("progText");
        iid = setInterval(function() { 
          if (prog.Value < prog.Max) {
            prog.Value++;
            text.innerHTML = prog.Value + "%";
          }
          else {
            clearInterval(iid);
            }
        }, 250);
      })();
      // ]]>
    </script>
  </body>
</html>

サンプル

感想

今の所、とりあえず動いたぜーって感じ。皆さん警告みたいの出ます?

追記1(2008-01-24T23:42:58+09:00)

typoさんより。

@zigorou: IE6じゃうごかんぽい? *

まじすか?w

Officeが入って無いと無いコントロールなのかなぁ。

参考リンクでもOfficeってもろに書いてあるしな。

動いたみたい!

追記2(2008-01-25T00:54:08+09:00)

d:id:nanto_viさんより

@zigorou セキュリティ警告もJavaScriptエラーも出ずに失敗。mscomctl.ocxは存在しないようです。at IE 6 SP2 *
C:\WINDOWS\system32\mscomctl.ocx

ってOCXがどうもOfficeにバンドルされてるっぽくて、これが無いと動かなさそうと言う感じかなぁ。

追記3

いわゆるVB6系のランタイム(Vectorとかで良く再配布されてる奴)にmscomctl.ocxが入ってるみたい。

辺りからダウンロード出来るかと。

参考(2008-01-24T23:42:58+09:00)

KimesdarSKimesdarS 2019/02/13 04:35 Interested in HARD ROCK? How about KISS? The band is on a tour at the moment all across USA and Canada. Visit https://www.radiotargujiu.ro/oras-gri/ to know more about KISS tour dates in 2019.

ゲスト



トラックバック - http://moz-addon.g.hatena.ne.jp/ZIGOROu/20080124