システム統括部のぴょん吉です。
私は、本来、自社製品でアクセス解析ツールであるシビラやシビラオプティマイゼーションなどの開発が主業務なのですが、社内オーダーを受けて、社内で使用するツールの一部も開発していたりします。
社内で使用するものなので、Webアプリケーションにこだわらず、クライアントアプリケーションなども作ります。
つい先日まで(といっても数ヶ月前ですが・・・)、C#の勉強も兼ねて、社内で使用するツールの開発をしていました。(Windows上のみで動作するもの)
ある時間のかかる処理における経過報告画面(要は、どの程度の処理量があって、今、どこまで進んでいるかを表示してあげる画面)にリストビューコントロールを使用していました。
この画面では、データを1000件程度処理するたびに、リストビューの1アイテムに対して、処理済みの件数を書き換えていきます。
ここで、思わぬ問題が発生しました
リストビューの1アイテムの内容更新を高速で行うと、どうししてもチラツキが発生してしまうのです。まあ、売り物ではありませんし、しかも社内で使うだけですから、大した問題ではないのですが、なんか悔しい(というか以前からこういった現象が起こることは分かっていたので)ので、対処方法を調べてみました。
まあ、やっぱり同じ問題を抱えている人はいるもので、解決方法がキッチリ書かれていまして、その方法というのは、「WindowsAPIを直接呼び出す」というものでした。
話は変わりまして、Windows上でGUIアプリケーションを開発する場合、テキストボックスや、コンボボックス、リストビュー、ツリービューなどを使いたい場合は数おおくあるかと思います。(GUIで作っていれば当然ですけど・・・)。
Windowsなどは、そういったプログラマ向けに、テキストボックスやコンボボックスなどを比較的簡単に(「自身で用意するよりは・・・」という意味です)、扱えるように、また、よく使うであろう処理をなどをライブラリ化しており、その命令群のことを、WidnowsAPI(Application Programing Interface)と呼んでいます。
WindowsそのものがC言語(今はどうか分かりませんが、10年ほど前まではほとんどのコードがC言語、一部のコードがC++言語で書かれていたそうです)で書かれているため、WindowsAPIもC言語から呼び出されることを想定して開発されています。
なのでVisual CなどでGUIアプリケーションを作成する場合には、その昔は、このWindowsAPIを使ってゴリゴリ書いていたものでした。すげー大変なんですけどね・・・
C#などのクラスライブラリには、数多くのGUIコンポーネントが用意されており、リストビューもその中の一つであり、簡単に扱えるように、WindowsAPIをラップしたものとして用意されています(たぶん・・・)。
で、そのクラスライブラリでは、本来、WindowsAPIで用意されている全ての機能などを扱えるわけではなく、一部、取り扱いの利かないものがあります。
その一つが、今回の解決方法である「ダブルバッファリング」を使った方法となります。
※)リストビューの拡張スタイルにLVS_EX_DOUBLEBUFFERをSendMessageにて設定してあげれば良いようです。
リストビューコンポーネントそのものに、(WindowsXP以降らしいですが)ダブルバッファリングを行い、描画を行ってくれる機能があるらしく、その機能をC#などから使う場合には、現状のところ、WindowsAPIをC#から何とか呼び出してその機能をONにするしかありません。
さて、問題は、C#からそのWindowsAPIが呼び出しですが、C#そのものがそういったことが行えるように考慮されていますので言語仕様上などは問題ありません。問題は、WindowsAPIがC言語で呼び出すことを想定しているため、C#から呼び出す場合には、その想定に合わせてあげる必要があります。
実は、この作業が非常に大変でして、C言語やWindowsそのものの仕組みをある程度理解していないと、非常に敷居の高いものになります(幸い、私は、昔からWindowsAPIになれ親しんでいたので、解決方法は一発で理解できましたし、問題がなかったのですが・・・)。
長々と書きましたが、ソフトウェア開発をしているときっといろいろな問題にぶち当たります。その場合、概念レベルでも結構なので幅広い知識を身に着けておくと、問題解決がスムーズにいく場合があります。
例えば、今回のようにC#などでアプリケーションを開発する場合、C#以外にも、そのターゲットとなるOSの仕組みなどにも興味を持ち、少し広い視点で捉えることが肝要かと思います。少なくとも、Windows向けアプリケーションなどを開発されるような方は、WindowsAPIなどの呼び出し方や、どんなものがありそうなのか程度は身に着けておいたほうが良いかもしれません。