鏑矢の憂鬱2000年12月前半
透明1ドットイメージ
 
2000/12/01 (Fri)
・ ATL/WTL では、こういった特殊なポリモーフィズム(??)をしてます。
 
template< class type_Child >
class CParent
{
public:
    void CallChildOutput()
    {
        type_Child *pcChild = static_cast< type_Child* >(this);
        pcChild->Output();
    }

    void Output()
    {
        printf( "CParent::Output()\n" );
    }
};

class CChild
    : public CParent< CChild >
{
public:
    void Output()
    {
        printf( "CChild::Output()\n" );
    }
};

void Use_CChild()
{
    CChild cChild;
    cChild.CallChildOutput();
    // CChild::Output()
}
	
 
・まず、親クラスのテンプレート引数に子クラスを指定します。親クラスからは、親クラスの「オーバーライド可能な」メンバ関数を、子クラス経由で呼び出します。そのメンバ関数がオーバーライドされてれば子クラスのそのメンバ関数が、されてなければ親クラスのメンバ関数が呼ばれる、とゆー仕組みです。
 
・いやまー、これをポリモーフィズムって呼ぶのには無理があるわな(爆)。 static_cast を使ってたり、 virtual じゃないのにオーバーライドされてたりとなんか不思議な気分。でも、テンプレートを使ってるんで安全性は高いし、どれが呼ばれるか明確に分かるって点ではいい感じかもしんない。
 
・ ATL/WTL はもひとつこの類の仕組みを使ってるんだけど、それはまた明日(爆)。なんかおもいっきし延ばしてるなー。
 
・でわまたっ!
透明1ドットイメージ
 
2000/12/02 (Sat)
・今日も WTL の話、とは名ばかりでなんかテンプレートの話になってるけど(汗)。もひとつ、 ATL/WTL でよく使われてるのが、多重継承を使ったミョーな関係。
 
template< class type_Child >
class CParent1
{
public:
    void CallChildOutput()
    {
        type_Child *pcChild = static_cast< type_Child* >(this);
        pcChild->Output();
    }
};

class CParent2
{
public:
    void Output()
    {
        printf( "CParent2::Output()\n" );
    }
};

class CChildHas2Parent
    : public CParent1< CChildHas2Parent >
    , public CParent2
{};

void Use_CChildHas2Child()
{
    CChildHas2Parent cChildHas2Parent;
    cChildHas2Parent.CallChildOutput();
    // CParent2::Output()
}
	
 
・つまり、 CParent1 は(テンプレート引数で指定された)子クラスが「 CParent2 からも継承されている」という前提で作られてて、子クラス経由で CParent2 にアクセスするとゆー仕組みになってるわけです。一見危なっかしそうだけど、テンプレート使ってるんで無理な使い方すればコンパイルエラーになるんで問題なし。
 
・あ、この例だと「 CParent2 から継承せんでも CChildHas2Parent::Output() 」作ればいいんじゃ、って話になるね。 ATL/WTL では CWinDataExchange から子クラスを通して CDialogImpl の各メンバ関数を呼び出すって形なんで、実際はちょっと作るの大変。でもオーバーライドできるようにってこと……じゃないのかな(汗)。っつーか vritual とかないからオーバーライドし放題?
 
・ま、よーするに ATL/WTL の継承関係はちょっと特殊ってことで。これ分かんないと、どれをオーバーライドすればカスタマイズできるのか判んなくなるから結構重要。明日はリストコントロールでも使ってみるかなー。
 
・でわまたっ!
透明1ドットイメージ
 
2000/12/03 (Sun)
・今日も WTL プログラミング。今日はリストボックスを使ってみました。 WTL の AtlCtrls.h には各コントロールを操作するためのクラスが入ってて、たとえば CButton とか CListViewCtrl とか、あと最近の CDragListBox とか CMonthCalendarCtrl とか CIPAddressCtrl とかも入ってたりします。
 
・使い方は……よーわからん(汗)。とりあえず CListBox 型メンバ変数 m_cListBox を作って CMainDlg::OnInitDialog() で m_cListBox.Attach( GetDlgItem( IDC_LIST1 ) ); して、あとは m_cListBox.AddString( "あいうえお" ); って呼べば動きます。基本的には MFC と同じなんだよねー。ただ自前で Attach() せなならんのがなんか不安。
 
・ま、 CListBox とかはホントに操作専用ラッパークラスと化してるんで、問題はないんだろうけど。メッセージ処理したいときには class CMyListBox : CWindowImpl< CMyListBox, CListBox > ってするようにって書いてあるな。そっか、 ATL の中でも CWindow と CWindowImpl は独立してるからこういうことができるんだな。
 
・さてプログラミングだけど、本格的にしようと思った理由のひとつは、ホームページの管理をするアプリを作りたかったってのが一番なんで、そのへんのテストプログラムを組みつつ、 WTL を試してきたいと思ってます。もし WTL がかなり解ってきたら、 Codian 化したり、フリーウェアを WTL に移行したりするかもしんない。時間きついけど(汗)。
 
・でわまたっ!
透明1ドットイメージ
 
2000/12/04 (Mon)
・今日は「ほむぺ用プログラム」を作る関係で正規表現ライブラリを使ってみることに。……っつーかどこにあるんだ(爆)。とゆーわけで調べてみると、うにくすに標準で入っているものがあるとのこと。 Perl なんかが使ってるので regex っつーらしい。さて、どーやって手に入れようかな……。
 
・ハードディスク内を検索したらあった(爆)。前にダウンロードした gimp の中に regex.c と regex.h が入ってました。ラッキー。テスト用プロジェクトを作ってコピーして、試行錯誤したあと(ワーニングでまくりながらも)コンパイル通過。っつーか(ギャグではない)最終的にはソースを書き換えずに STDC_HEADERS REGEX_MALLOC __STDC__ を #define すれば通ったのがちょっと感動。
 
・検索して拾ってきたサンプルプログラムを使ってテスト。おー、ちゃんと検索ができてる!! すげー。とりあえずこれの解析をして、プログラムに使えるかどうか判断しましょう。あと…… WTL に慣れるために WTL モーダルダイアログプロジェクトでテストしてたら、コードをヘッダーに書いてたんでコンパイルエラーが見つけづらい(汗)。やっぱソースファイル作ってそっちに書いた方がいいな。
 
・でわまたっ!
透明1ドットイメージ
 
2000/12/05 (Tue)
・今日は正規表現ライブラリをちょっとだけ。まず regcomp() ってので正規表現の構文解析をするらしい。 [0-9] が 0-9] になってたらエラー出すみたいなことするんだすな。んで regexec() で実際に文字列がその正規表現とマッチするかどうかチェック。マッチしてたら 0 が返ってくるとゆー。
 
・この regexec() の方はちょっと使い方が複雑らしいんでまだ調べてる途中。なんか第4引数が鍵らしい。これ使うと、マッチしてる位置とかも解る……らしい。ま、リファレンスや使用例はネットに腐るほどあるんでなんとかなるでしょ。それより、自動的に文字列の置き換えとかしてくれないっぽいのがちょっとショック(爆)。 s/abc/ABC/ とかはできないんだなー。
 
・今作ろうとしてるのはホームページマネージャ。たとえば「 Codian フォルダ以下の全ファイルの背景を #000000 に」みたいなことを一発でできるようにしたくて。 Perl みたく一括処理じゃなく、ダイアログベースで対話処理っぽく解りやすくしたくてね。あと、今 Codian の各ページの「次へ」とかを Java スクリプトでやってるけど、これをこのアプリで自動生成するようにしたりとか。
 
・基本的には、これをフリーウェアとして公開する気はないです(爆)。時間なくて、細かい部分まで作り込めるかどうかは疑問だからね。でも、あんまないタイプっぽいからそれなりによさげな気もするし、あとうちかぶとかも WTL で組み直したいってのもあるんで、ちょっとフリーウェアがんばろうかなーとか。
 
・でわまた。
透明1ドットイメージ
 
2000/12/06 (Wed)
・今日は WTL の話。 WTL のコモンダイアログクラスを使ってみました。まず CFileDialog 。同名のクラスが MFC にもあるんだけど、なんか方向性が違う(汗)。たとえば GetPathName() がなかったり、 GetFilePath() はあるんだけどこれはウィンドウが開いてる間用だったり(汗)。つまり派生してカスタマイズするためのクラスって意味合いが強いみたいです。
 
・つっても CFileDialog::m_ofn にアクセスすればいいんでそんな問題ではないんだけどね。でも同名で方向性が違うってのはちょっときついかもしんない。テンプレートライブラリって完全に公開されてる分、コード読んで使ってくださいみたいなとこ少なからずあるかなー。しかも WTL はリファレンスないし。
 
・もひとつ CFolderDialog なんてクラスもあります。そう、 SHBrowseForFolder() のラッパークラス。 MFC にはないですねー。これひとつあれば「 Lhasa とかで使ってるフォルダダイアログってどーやって使うのん?」ってこともなくなりますな。これも継承できる設計になってるんで、早速継承してオーバーライドして楽しんでます。
 
・たぁだ、なぜか CDialogImplBase から継承してないんでダイアログとして使いづらい(汗)。一応 CDialogImpl と CFolderDialog とで多重継承するとうまくいくんだけど、なーんかアヤシイ(汗)。そうそう、この前紹介したテンプレート流オーバーライドの利点が分かりました。メンバ変数でもオーバーできる(爆)。き、気持ちわりー。
 
・でわまたっ!
透明1ドットイメージ
 
2000/12/07 (Thu)
・とりあえず、新しいフリーウェア「ほめかぶ」の作成に着手しました。つってもテストアプリ作ってく段階ですけど。作るのはホームページ管理用アプリね。だいたいイメージもできたし、でもそのイメージが結構大変な感じ(汗)。ま、会社で SE やるんだからこんくらい作れないとね。
 
・と言っといてなんだが、なんかのっけから結構大変(汗)。自分ができるからって人に教えられるもんではない、とゆーのがわての持論なんだけど、最近のわては教えられるけど自分でできないかも(爆)。とりあえず、クライアントのないウィンドウ、つまりタイトルバーとツールバーとステータスバーだけのウィンドウを作ろうとしてさっそくつまづく。
 
・「ウィンドウサイズを変更しようとしてもウィンドウの高さは一定」にする機能がある、それは知ってるんだけどどうすればいいのか分かんなかったり(汗)。だから分かったからここに書く(爆)。 WM_GETMINMAXINFO を受け取って、 lParam のポインタが指す構造体に値をセットすればOK。これで高さは変えられないように。
 
・高さは GetSystemMetrics() でタイトルバーとフレームを取得、 GetWindowRect() でツールバーとステータスバーの高さを取得してって形式。しかーし、ツールバーがリバーなんで、メニューと重ねられてしまう(汗)。その辺をどうするかがこれから。ホントはビューウィンドウのサイズから求められるはずなんで、その辺をうまく取得できれば。
 
・あと、なんか謎なエラー出まくり(汗)。上のテストしてた時に、リバーの上にカーソルを持ってくとアクセス違反でエラー。これが DLL の奥底で起きて、しかもエクスプローラーが落ちる(泣)。一度落ちると他のアプリでも落ちちゃうんでなんかミョーな原因があるのかも。
 
・でわまたっ!
透明1ドットイメージ
 
2000/12/08 (Fri)
・今日もほめかぶ作り。リバーを移動してサイズが変更したときに、ウィンドウ全体のサイズ変更をするってことでどーすればいいのかなとか。調べてみると、 RBN_HEIGHTCHANGE が通知されるらしい。なんで、 WTL の atlcrack.h から BEGIN_MSG_MAP_EX と NOTIFY_CODE_HANDLER_EX をメッセージマップに貼り付ければOK。この辺は WTL の便利なところやね。
 
・でも作成順がうまくいかなくてアサートしちゃいました。今日は時間がなかったんでそこまで。ウィンドウ初期化時の「メッセージが呼ばれる順番」っていっつもうまくいかないなーと思う。「いっちゃん最初にアクティブ化する」とかゆーメッセージがあると便利なんだけど。
 
・でわまたっ!
透明1ドットイメージ
 
2000/12/09 (Sat)
・今日はプログラミングしてないんだけど、代わりにお便りが来てるんでその紹介! では今日のお便り。
 
透明1ドットイメージ
透明1ドットイメージ
 オブジェクト指向でオブジェクト間のメッセージという概念が出てきますが、具体的にはどうやってこれを実現させているんですか? それから、状態遷移について教えてください
透明1ドットイメージ
透明1ドットイメージ
 
・どうもですー。オブジェクト指向での「メッセージの送信」ってのは、ぶっちゃけて言えば「他のオブジェクトのメソッドを呼び出す」ってことです。 C++ の言葉で言えば「他の変数のメンバ関数を呼び出す」ってことね。メンバ関数を呼び出すことで「あるオブジェクトが他のオブジェクトにして欲しいこと(メッセージ)を伝える」ってことなんでしょう。
 
・状態遷移ってのは、「内部状態が移り変わること」。これを図にしたのを「状態遷移図」っていーます。状態遷移図で検索すると図そのものも結構見つかったんでその図を見た方が早いかも。あるオブジェクトの内部状態が丸や四角で書かれてて、発生したイベントによって他の状態に移動する、って形になります。
 
・状態遷移図って古いもんだと思ってたんだけど、最近はオブジェクト指向設計やイベントドリブンプログラムに合うからか結構人気高いみたいです。オブジェクト指向に状態遷移図を使うと、オブジェクトの内部状態を図にして、イベントはメソッドの呼び出しって形になるっぽい。っつーか、もしかしたらオブジェクト指向専用の描き方があるのかもしんない。最近オブジェクト指向からは離れてるんでちょっと分かんないです。
 
・でわまたっ!
透明1ドットイメージ
 
2000/12/10 (Sun)
・今日はプログラミングしてないんでお便り紹介〜! では今日のお便り。
 
透明1ドットイメージ
透明1ドットイメージ
 質問でありませんが……。
 下記 URI よりリンクしました。問題があれば修正します。よろしくお願いいたします。以上、報告まで。それでは。
 
http://www.freeml.com/ml_view.php?ml=wtl&pg=1
透明1ドットイメージ
透明1ドットイメージ
 
・おお! これは ATL/WTL のメーリングリストですな! 密かに WTL コミュニティが広がりつつありますね〜。 WTL に注目してる方は入ってみてはどうでしょう。あ、リンクはオッケーです。結構 WTL について書いてるページってあるんだなー、ちょっと安心。
 
・でわまたっ!
透明1ドットイメージ
 
2000/12/11 (Mon)
・かなりくだらない話だけど、「圧縮」があるんなら、ファイルサイズをでかくするアルゴリズムとかあるんだろうか(爆)。まだ DVD-R ドライブが広まってない今なら、アプリをパッケージアプリを DVD-ROM に入りきるギリギリまで大きくして、 DVD-ROM からのみ起動、みたいにすればコピー対策になるかなーとか。くだらないなー。あ、あと Perl のちょっとしたことを日記で書くよてー。
 
・今日のツッコミ!
 
透明1ドットイメージ
透明1ドットイメージ
 こんにちは、質問です。
 各アプリから出されるメッセージボックスを一切表示させないようにしたいのですが、どうしたら良いでしょうか。
透明1ドットイメージ
透明1ドットイメージ
 
・メッセージボックスは MessageBox() で表示されるのですよね。メッセージボックスダイアログのウィンドウクラス名は #32770 って決まってるんで、システムフックとして CBT フックをセットして、作成されつつあるウィンドウのウィンドウクラス名を片っ端から調べて #32770 のウィンドウがあれば閉じるようにすればOKでしょう。
 
・ただ、どうやって閉じるかは不明(汗)。 WM_CLOSE 送れば閉じるかなー、それとも EndDialog() 呼ばなきゃいけないのかな、それとも直接 EndDialog() 呼んじゃいけないのかな。その辺調べないといけないかも。あと、一見メッセージボックスっぽくても違うダイアログって可能性もあるかも。そしたらちょっときついかもしんないなー。
 
・では次のお便り。
 
透明1ドットイメージ
透明1ドットイメージ
 とーとつですが、エクスプローラのポップアップメニューに「新規作成」がありますが、この「新規作成」のメニューの作り方があればおしえてください。
透明1ドットイメージ
透明1ドットイメージ
 
・こーれはどうすればいいのかなー。一応、コンテキストメニューそのものは IShellFolder::GetUIObjectOf() から IContextMenu を取得して表示するんだけど、このメニューに「新規作成」があるかどうかが鍵。あればなんとかうまく表示できるんじゃないかなー。なかったらちょっと大変かも。
 
・「新規作成」に入ってるファイルは、まず C:\WINDOWS\ShellNew フォルダにあるファイルがこれにあたります。でもこれだけじゃなくて、レジストリの HKEY_CLASSES_ROOT の拡張子一覧の中に ShellNew があるものを片っ端から調べたものもこれに加える必要があります。たとえば .txt なら HKEY_CLASSES_ROOT\.txt\ShellNew って感じになってるんで、そうなってる拡張子を集めて、そこからファイル形式の名称やアイコンとかを取得して、って形になると思うです。
 
・うーむ、結構めんどいなー。簡単に処理する方法がありそうなきもするけど、シェルエクステンションってできそうでできないし〜。
 
・でわまたっ!
透明1ドットイメージ
 
2000/12/12 (Tue)
・今日は Perl の話。昨日と違ってプログラムの内容だから今日はこっちで。簡単にこれまでの概要を書くと、ねすけ6だと xbm 画像を表示できないんで、アクセスカウンターを作り替えなきゃいけなくなってしまったとゆー状況で今に至る、と。あ、アクセスカウンターは表紙の一番下の方にちっこくあります。全画像ファイルを読み込んでからでないと表示されないかも。
 
・ xbm 画像フォーマットは、実は C 言語形式の構造体をテキストファイル内で定義してるだけなんで、扱いがすごく簡単だったりするんです。 GIF だとフォーマットを直接操作するのはめんどいし時間掛かるけど、 xbm なら直接操作できるから全桁まとめてひとつの画像で表示できるんだよね。ただ、白黒だし、フォトレタッチアプリとかで作れないからその点は不便。まー今のカウンターなら問題ないんだけどね。
 
・ま、使えないものはしょうがない、ってことで GIF 形式で出力することに。基本は Codian に書いてるの。ファンファーレフォトグラファーで数字画像を作って、あとはそれを直接表示させるだけ。画像ファイルを開いて、 binmode で念のためバイナリーモードにして、あとは foreach( <hFile> ) { print; } で出力するだけ。
 
・この binmode みたいに、 C でできることを Perl でどうすればいいのか、ってのが一番の壁かな。 xbm 版と違って一桁ずつ表示するから、整数値データの一桁ずつを同取得すればいいのかとか。 @OneData = split( //, $CountData ); で分解できるんですねー。逆に、こういうことができるってことが Perl の便利なとこかもしんない。
 
・てなわけで、現在稼働してるのはこの GIF 版アクセスカウンターです。 GIF でってことで、文字を白で、余白を透明にしてるんで、青地とか赤地でもできるのがいいとこ。メニューバーを取っ払ったら、辞書と Codian にも同じこれを設置するんだけど、そんときは黒地以外にしたかったからね、それなりにちょうど良かったかも。
 
・でわまたっ!
透明1ドットイメージ
 
2000/12/13 (Wed)
・今日はお休み〜。
透明1ドットイメージ
 
2000/12/14 (Thu)
・実は今日もあんまプログラミングしてないです(汗)。なんかここ最近雑務に追われてるよーな気が。なんだかなー。でも今日はちょこっとだけ、プログラミング辞書書いてました。でも今回はなんか「ありますよー」ばかりだなー。なんでこう波が激しいんだろう。謎だ。
 
・でも数少ない当たりのおかげで色々分かったり。インスタンスハンドルって必ず 0x00400000 が返って来て「これなんなのん?」とか思ってたんだけど、これってベースアドレスなんですねー。プロジェクトの設定で変更すると、ちゃんと返ってくる値も変わるし。この設定値で決まるから、プロセス単位じゃなくて実行ファイル単位の設定なんですね。 GetModuleHandle() でなんでファイル名を指定するのかこれで判明。
 
・でもさ、これひとつの話で、機械語コードをロードするとか仮想メモリがどーとか、むっちゃくちゃ複雑怪奇な話が展開しちゃうんですよね。ウィンドウズプログラミングってこーゆーのがかなり障壁になってるんじゃないかなー。 VC が難しいってのもうなずけます。ま、これはうにくすでもマックでもそうなんだろうけどね。そうなると、スクリプト系の Perl や Java スクリプトなんかの方がファーストタッチにはいいのかもしんない。あーでも Perl はまずいか(汗)。
 
・でわまたっ!
透明1ドットイメージ
 
2000/12/15 (Fri)
・今日はぷらとわを1話書きました。でも Spy++ 使ってウィンドウの設定がどーとかウィンドウクラスの話とかで終止したんでここに書くことなし(汗)。
 
・でわまたっ!
 
 
(C)KAB-studio 2000 ALL RIGHTS RESERVED.