Mesoscopic Programming

タコさんプログラミング専門

2012-10-01から1ヶ月間の記事一覧

Tips #019 マウスホイールは誰のもの?

マウスの真ん中のダイヤルをぐりぐりすると WM_MOUSEWHEEL メッセージが送られるわけだが、 それがフォーカス所有者あてなのが気に入らない。 だってさ、マウスボタンイベントは普通マウスカーソルの位置にあるウィンドウに来るじゃん。 だったらさ、マウス…

Tips #018 デストラクタ中の仮想関数

C++

仮想関数は奥が深い。 仮想関数はどこでも仮想だと思ったら大間違いだ。 以下のプログラムを見て欲しい。 class A { virtual ~A() { foo2(); } virtual void foo() { printf( "class A :: foo()\n" ); } void foo2() { foo(); } }; class B : public A { voi…

Tips #017 書式付デバッガ出力

不具合原因を調査するのにデバッガ出力はかかせない。 ウィンドウズには OutputDebugString() という便利な関数があるが、 変数の内容を見たいのに文字列しか受け付けないのはいただけない。 いちいち文字列変数を用意してたらめんどくさくて本末転倒なので…

もやもやはてなブログ

はてなブログはベータ版だからしょうがないのか。 カテゴリーの整理しようと思ったら、カテゴリー編集機能が何もないことに気がついた。 ダイアリーの方は確かあったと思うから、そのうちブログの方も追加されるかも。 あと記事の管理で、次のページはあるが…

Numer0n Programming Tips #1 シャッフル後の分析データにスラッシュの効果を反映させる

検証プログラムなんだけど、コンピュータと対戦しててバグを発見した。 シャッフルしたら分析データからスラッシュの効果が消えちゃった。 シャッフルはチェンジと違い、スラッシュナンバーは継続して有効なはずなのにだ。 修正するにはシャッフル後の正解候…

Programming Tips #16 ツリービューの余計な警告音を抑止する

あなたはツリービューでアイテムを選択したのち、リターンキーが押されたタイミングで何らかの処理を実施したいのではないのか? それは極めて自然な発想である。 しかしながら、それを実践するために TVN_KEYDOWN 通知だけで処理しようとすると不要な警告音…

Programming Tips #15 名前なし構造体って?

私はいま驚いた。 メッセージコールバック関数で WM_COMMAND が来たとき、wParam をそれぞれ LOWORD() と HIWORD() で id と code とに分ける処理を省けないものかと思案していた。 wParam を共用体のメンバとし、同時に WORD サイズの id と code を並べた…

Programming Tips #14 DefDlgProc() 関数の注意点

ダイアログクラスのウィンドウを作成しようとしてやられた。 デフォルト関数を DefDlgProc() にすると hbrBackground の設定値は無視され勝手に COLOR_MENU 色で塗りつぶされてしまう。以上。

Programming Tips #13 画像表示のちらつき対策

ウィンドウサイズ変更時の画像表示のちらつきをなくす 画像描画時に背景をクリアしなければちらつかないのだが、アイコン表示などで背景が透明の画像はごみが残ってしまうのでどうしても背景をクリアする必要がある。 そこで背景をクリアして画像を描画した…

Programming Tips #12 仮想関数使用時の注意点

Visual C++ だけかも知れないが… 派生クラスで仮想関数のオーバーライドをしてもビルド結果に反映されないことがある。 そんなときはリビルドするしかない。時間かかるので嫌だけど 以上。

Programming Tips #11 WS_POPUP スタイルの子ウィンドウを作るときの注意点

WS_POPUP スタイルの子ウィンドウを作るときは CreateWindow() 関数のメニューハンドルにウィンドウ識別子を渡してはならぬ。 普通に子ウィンドウをポップアップスタイルで作ろうとしてやられた。 何度やってもうまく行かない。 そこでいろいろ調査したとこ…

ウィンドウズプログラミング講座第15回:Xファイルの表示

概要 Xファイルを表示できるようにしました。 ツリービュークラスをやめてアプリケーションクラス直属にしました。 ビュークラスも不要になったのでドキュメントビュークラスに戻しました。 Xファイルの読込みは D3DXLoadMeshFromX() 関数一発なので超簡単…

Programming Tips #10 ツリービューの謎が解けた

スクロールバーの位置を変更したら WM_SIZE を送れ! ツリービューの選択アイテムを上下キーで変更すると、垂直スクロールバーは選択アイテムが表示されるように自動で調整されるけど、水平スクロールバーはそうならないよね。 なんでやねん、と怒りつつも自…

Programming Tips #9 ツリービューのスクロール位置の復帰

再起動時に、ツリービューのスクロール位置を終了時の位置に復帰する方法を調査しました。 終了時に保存してるのは選択アイテムとその座標だけで、各アイテムの展開状態までは保存していません。 どんだけ長くなるか分かりませんから。 そこで展開情報を再現…

Programming Tips #8 マウスカーソル設定方法のかん違い

場所によってマウスカーソルを一時的に変更するには てっきり WM_MOUSEMOVE で SetCursor() すれば良いと思ってたのだが間違いだった。 どうもカーソルがちらちらするので何か変だなと思って調査したら分かった。 本命は WM_SETCURSOR だった。 LRESULT App …

Programming Tips #7 スクロールバーのつまみの盲点

SB_THUMBTRACK と SB_THUMBPOSITION 通知の位置情報は誤り スクロールバーのつまみがドラッグされるとイベントが発生しますが、そのとき wParam 引数の位置情報を信じるとえらい目にあいます。 1メガ級のバイナリファイルを表示してて、スクロールバーをド…

ウィンドウズプログラミング講座第14回:マウスでドラッグ

概要 ドキュメントビュー画面をマウスでドラッグできるようにしました。 ドキュメントビューにフォーカスがあるとき、スペースキーで次のファイルまたは前のファイルを選択できるようにしました。 ドキュメントビュークラス メンバ変数と関数 class DocView …

Programming Tips #6 GDI+ の DrawImage() 関数の使い方

解像度の違いによる不具合 画像表示テストしてて、何か表示サイズが変なので調べてみたら分かった。 どうも Graphics インタフェースを通常のデバイスコンテキストに関連付けると、解像度が 96 DPI に固定されるらしいのだ。 したがって画像ファイルが 96 DP…

ウィンドウズプログラミング講座第13回:画像ファイルの表示

概要 画像ファイルの表示に対応しました。 GDI+ を使うと超簡単に処理できます。 でも Windows XP 以降でないと使えないらしいですよ GDI+ って。さすがにいまどき Windows 3.1 を使ってる人はいないだろうが 95 とか 98 とかはいるのかなぁ? まあそういう…

Programming Tips #5 ツリービューのスクロール位置の設定

ツリービューコントロールのスクロール位置を変更する際の注意点を述べる。 TreeView_Select() で選択項目を変更すると TVN_SELCHANGED イベントが発生するが、このイベント処理が終わる前にスクロール位置を変更してはならない。 アプリ終了時にツリービュ…

Programming Tips #4 ツリービューの子アイテムをあとで検索とした場合の注意点

ツリービューアイテムの cChildren を I_CHILDRENCALLBACK に設定してまだ TVN_GETDISPINFO 通知が来ていない場合、子アイテムを調査しようとして TreeView_GetChild() を実行すると NULL になってしまうので注意しろ。 先に TreeView_GetItem() を実行すれ…

ウィンドウズプログラミング講座第12回:ツリービュー連携

概要 ツリービューとドキュメントビューの連携処理を実装します。 ということはつまり、ツリービューでファイルを選択するとドキュメントビューで表示します。そういうことです。 但し、間違ってシステムファイルをこわすと危ないので保存機能は禁止してあり…

Programming Tips #3 子ウィンドウのフォーカス復帰

フォーカスを必要とする子ウィンドウが複数個あるケース フォーカスを必要とするウィンドウがドキュメントビューしかなかった時代は過ぎ去り、いまやツリービューもフォーカスを欲しているのだ。 しかしながらメインウィンドウが非アクティブになると同時に…

Programming Tips #2 ツリービューコントロールの I_CHILDRENCALLBACK

ツリービューコントロールのアイテム属性で cChildren メンバに I_CHILDRENCALLBACK を設定すると、表示が必要になったときに TVN_GETDISPINFO イベントが発生するわけだが、この発生順序がコントロールのペイントのあとであることがわかった。 TVN_GETDISPI…

Programming Tips #1 子ウィンドウのマウスイベント

はじめに 開発中に気づいた事などあとで書こうと思っていても、プログラミング講座の方だと忘れてたりすでに疲れきっていて書けないことが多い。 そこで気づいたらすぐ書くシリーズを始めました。 子ウィンドウのマウスイベント ツリービューを作っていて分…

ウィンドウズプログラミング講座第11回:ツリービューコントロール

概要 ツリービュークラスにツリービューコントロールを実装します。 名前がいっしょなのでややこしいけど、ツリービュークラスはツリービューコントロールの親ウィンドウです。 ツリービューコントロールは自分でスクロールしてくれるんで、本当はビュークラ…

ウィンドウズプログラミング講座第10回:2つのビューウィンドウ

概要 こんばんわ。今回は、とりあえずツリービューの元となる左側のビューウィンドウを作成します。表示/非表示の切り替えとマウスによるサイズ変更に対応しています。ウィンドウズのプログラミング技術紹介っちゅうことで最終的に何を作ろうか考えていまし…

ウィンドウズプログラミング講座第9回:バイナリファイルビュワー

概要 ドキュメントの読み込みと保存に対応するため、何か作らなきゃと思いバイナリファイルビュワーにしました。 ま、バイナリファイルビュワーはそれほどでもないんだけど、ウィンドウサイズ変更に伴う処理は大変でした。 ファイル分割 何かと今後のことを…

ウィンドウズプログラミング講座第8回:スクロールバー

概要 スクロールバーに対応します。 スクロールバーを表示するのは簡単だけど、ちゃんと対応するのはけっこう大変です。 今回はウィンドウのサイズ変更に合わせてスクロールバーを出したり消したり、スクロール位置を保存したりとちゃんとした対応処理を実装…

はてなブログ連携不具合調査

通知ボタンを押してないのにツイッターに通知される不具合を調査中です。編集すると勝手に通知される不具合を調査しています。再現できないな?