Listviewのテキストコールバックとオーナーデータの違い

テキストコールバック

InsertItemでテキストにLPSTR_TEXTCALLBACKを指定する。LVN_GETDISPINFOが飛んでくるのでここでテキストをセットする。データは構造体などで持ってListViewのLParamに設定しておくのがいいと思われる。テキストと同様にアイコンもI_IMAGECALLBACKを指定することにより同じようにできる。

オーナーデータ

ListViewの作成時にLVS_OWNERDATAを指定する。InsertItemは使わず、データは並びも含めてアプリが持つ。アプリがセットするのはSetItemCountExによるアイテムの個数だけで、これをやるとLVN_GETDISPINFOが飛んでくるのでここで表示データをセットする。

どちらもLVN_GETDISPINFOが来たときはポインタだけ設定すればいいはずでListViewはコピーを持たない。pszTextはコンストでないがこれは取得用もかねているためでコンストキャストしていいはず。

 

 

Visual C++でSQLiteを使う

SQLiteはデータベースです。データベースというと一般的にはサーバですが、SQLiteはただのライブラリでアプリケーションに組み込んで使えます。SQLiteのソースコードはamalgamationされている状態で提供されています。amalgamationとは、全部のソースコードを1つのファイルにまとめることのようです。amalgamationで提供されるファイルは、Cのソースファイルが1つとヘッダ2つだけしかありませんので簡単に既存のプロジェクトに組み入れることができます。

ここではVisual C++ ver 6でダイアログベースのアプリケーションを作成して、SQLiteを組み込んでみます。

DBを作成する

最初にデータベースを作成します。SQLiteのダウンロードページからPrecompiled Binaries For Windowsの中のコマンドラインツールをダウンロードして解凍します。ここではhsqlite-3_6_6_2.zipをダウンロードしました。sqlite3.exeというファイルが解凍されるので、これを以下のようにコマンドラインから起動して、データベースを作成します。

これでtestdb.dbというファイルができます。
 

AppWizardでダイアログベースアプリを作成

VC6でプロジェクトを作成します。
 

SQLiteのamalgamationソースコードを組み込む

SQLiteのダウンロードページからamalgamationのソースコードをダウンロード、ここではsqlite-amalgamation-3_6_6_2.zipをダウンロードしました。

ダウンロードしたファイルを解凍して中の3つのファイル,sqlite3.c,sqlite3.h,sqlite3ext.hをプロジェクトフォルダにコピーしてから、VC6で[プロジェクト][プロジェクトへ追加][ファイル]を選択して、これらのファイルを追加します。

sqlite3.cがプリコンパイルを使用しないようにプロジェクトの設定を変更します。

ビルドして、エラーにならないか確認します。ウォーニングはいっぱい出ます。

コーディングする

ダイアログにボタンを追加して、ハンドラを追加してコードを書きます。最初にヘッダファイルをインクルードします。

つぎにハンドラにコードを書きます。

sqlite3_open()などに渡す文字列はUTF8で渡さなければなりませんので日本語が含まれる場合は、注意する必要があります。UTF16で渡すことができるバージョンの関数もあります。
 

実行

上のプログラムを実行すると、以下のように表示されます。

SetRedrawを使ってちらつきを抑え、処理を速くする

MFCとWin32の話です。

TreeViewやListViewに多くのアイテムを追加したり、アイテムを全部削除する場合、結構時間がかかります。どうもこれは一個足したり消したりする毎に描画処理が走ってる様なので、SetRedrawを使ってこの描画を抑えることにより、処理が高速化し、ちらつきも抑えられます。

サンプルプログラム(ツリービューのアイテムを全部削除)

Win32APIの場合はWM_SETREDRAWを使います。

実際にコードを書く場合は、SetRedraw(FALSE)を呼んだあとはSetRedraw(TRUE)が必ず呼ばれるようにしたほうがいいかもしれません。また、処理が終わったら以下のようにウインドウを再描画したほうがいいかもしれません。