2008年07月14日

エディットコントロールの新機能?

 今日は、サイト作成のための便利ソフトを作っていました。
 このソフトではエディットコントロールを使うのですが、以前から気になっていた「SetCueBanner」というメンバ関数について少し試してみました。

 ここで、「SetCueBanner」とはどんなものか書くと、エディットコントロールに何も入力されていない状態のときにフォーカスが当たると、あらかじめ設定していたテキストが表示される、
という機能で、このテキストを設定する関数が「SetCueBanner」ということです。
 このメンバ関数はWindows XP以降で有効で、Vistaではフォーカスが無くてもこのテキストが表示されるようになっているようです。
 ちなみに、このテキストを取得する「GetCueBanner」というメンバ関数もあります。

 ということで、まず「OnInitDialog」内で配置したエディットコントロールに「m_edit.SetCueBanner(_T("テキスト入力"));」として使ってみました。
 すると、何も起こらないのでおかしいなと思いさらに詳しく調べてみると、エディットコントロールのスタイルにMultiLineがあるとダメと書いてありました。
 そこで、スタイルからMultiLineを外しもう一度試してみてもやはりダメでした。

 さらによく見てみると、「SetCueBanner」の2番目のパラメータを省略すると「false」になり、テキストを表示させるためにはこれを「true」にしないとダメだと書いてありました。
 ということで、書き直して試してみたのですが、やはり表示されませんでした。
 ちなみに、この関数はtrueを返しているので、関数自体は成功しているみたいです。

 どうしてもうまくいかないのでもう一度よく説明を見てみると、「Edit_SetCueBannerTextFocused」マクロの項目も参考にしろ、みたいな事が書いてあったのでそこを見てみると、
なんとそこでは対応がVista以上になってました。
 納得いかないので、実際に「Edit_SetCueBannerTextFocused」が宣言されている「CommCtrl.h」ファイルの宣言場所を見てみると、そこではちゃんとXP以上で対応となってました。

 なんともよくわからないので、とりあえずVistaできちんと動作するか確認してみると、Vistaではきちんと動作しました。
 ちゃんとフォーカスが無くても設定したテキストが表示されました。
 しかし、ちょっとなんか挙動が怪しい感じがしましたが・・・。
 たとえば、フォーカスを移動させるためにコントロールをクリックすると、一度テキストが消えてすぐまた表示されたりして、なんかまだ完全に出来上がってない感じでした。

 という訳で、いろいろやってみましたが、XPではこの機能は動作しないのでは?という結論に達しました。
 検索してみてもそれらしい情報もないし、この機能は自分の中では無かった事にしようと思います。
ランキングへ  posted by 遠雷 at 00:54 | コメント(0) | MFC

2008年06月09日

プログレスバーの新しいスタイル

 今日はまず、ことわざについて昨日の続きをやりました。
 昨日途中で止めてしまったので、その続きとして見出しだけ入力していきました。

 最終的に「」の項目は全部で377個になりました。
 これは今現在の「あ行」全体の数が154個なので、いかに多いかということがわかると思います。

 今後、これらの語句について意味や説明、例などを入力していくのですが、あまりに数が多いので、今からかなり参っていたりしています。(ノ∀`)
 ひょっとしたら違うところを先にするかも?

 次に、タイトルの「プログレスバーの新しいスタイル」についてですが、今日新作ソフトの制作をしていて、プログレスバーを使おうとしてプロパティのところを見ると、今まで見たことのないスタイルの設定があることに気付きました。
 それは、「Marquee」と「Smooth Reverse」というものです。

 まず「Marquee」についてですが、これは「PBS_MARQUEE」のスタイルを適用するみたいで、動作は一般のプログレスバーが徐々に増えていくのに対し、このスタイルにすると、中の部分が固まったまま動きます。
 なにかわかりにくいですが、Thunderbirdのステータスバーに表示されていたり、Windows XPの起動時に表示されるものを想像してもらえればよいです。

 次に、「Smooth Reverse」についてですが、これについてはよくわかりませんでした。
 実際に実装し試してみたのですが、何も変化がなかったです。
 ひょっとしたらWindowsの設定で変わってくるのかもしれませんが、そこまでは試しませんでした。
 設定とは、「フェード効果」とか「スライド効果」とかのことで、私はすべて余分な効果は切っているので、その辺で違いが出るのかも知れません。

 これらのスタイルは、Windows XP以上じゃないと駄目みたいで、2000でも駄目みたいです。

 「Marquee」についての良い点は、普通なら最小値と最大値を設定し、動作中に位置を指定したり、ステップ数を指定したりするのですが、どれくらいで終わるかわからないものについては最大値をきちんと設定できず、実際の進捗状況とうまくシンクロしなかったりするのですが、このスタイルだと中の部分が、ただピロピロ動くだけなので、細かい設定が不要になる、というところがメリットだと思います。

 しかし、色々試してみた結果、少し使い方にコツがいるみたいで、ピロピロ動かすために「SetMarquee」を使うのですが、同じスレッド内だと開始しないので、別スレッドで開始するか、同一スレッド内でメッセージポンプを動かすかしないと駄目みたいです。
 ちょっとわかりにくいので一例をあげると、以下のやり方は駄目な例で、ピロピロは動きません。
void XXX::OnButton1()
{
    m_progress.SetMarquee(true, 100);
    for(int i=0; i<100; i++)
    {
       // 何らかの処理
    }
    m_progress.SetMarquee(false, 100);
}
 そこで、以下のようにfor文の中でメッセージポンプを動かすときちんと動きます。
MSG msg;
if(::PeekMessage(&msg, (HWND)NULL, 0, 0, PM_REMOVE))
{
      ::TranslateMessage(&msg);
      ::DispatchMessage(&msg);
}
 そのほかにも、専用のスレッドを用意してそこで開始させておいて、処理が終わったときに止める、という方法でも良いと思います。
 ちょっと通常のものに比べて使い方が面倒臭いですが、今までうまく使えなかった場面でも、きちんと使えるようになるので、かなり使い勝手は良さそうです。

 そうそう、一番肝心で大きな利点は、プログレスバーを使っても一切処理に影響が出ない、というのが大きいと思います。
 通常のものを同一スレッドでステップさせながら使うと、処理がかなり遅くなるのですが、これだと何もしないときと同じ処理速度が出るのでかなり良いと思います。
 プログレスバーの処理速度への影響は、以前このブログでも話題にしたと思うので探してみてください。

 まぁ、結局は別スレッドになるので速くなるのは当たり前といえば当たり前なのですが・・・。
ランキングへ  posted by 遠雷 at 01:09 | コメント(0) | MFC