エディッタを作る・その6 | 気ままなタルタル日記

気ままなタルタル日記

SEでもありバイクや車が好きだったりゲーム好きでもある多趣味な人の日記
FF11好き



風邪をひいて進捗率が悪いでずか、上下スクロールできるようになりました。
キーボードでの、スクロールはこれで完璧です。
ただしまだ入力機能は実装していません。

追加したのは、

行数表示部分
仮想ビュー制御
上下左右スクロール制御

です。
理論上、ほぼ無制限に表示する事ができます。(上下左右)
ほぼってのは約2億行とか2億列とかそういう所ですかね。
unsignedできってないのでそんなものです。

文字で説明するのも面倒ですが、

実際に画面に表示できる部分ってのはテキスト全体からみると少ないものです。
で、まるでのぞき窓からみているような感じで表示、編集する事になります。
その制御が面倒だったですよね。

現在の使い方だとただのビューワになってしまいますね。
後、忘れていた関係ではまったポイントを紹介しておきます。

OCXのベースウインドウは「STATIC」で作ってます。
一般には「ラベル」として使用されているあれですね。

BOOL CNECOMCtrl::PreCreateWindow(CREATESTRUCT& cs)
{
cs.lpszClass = _T("STATIC");
return COleControl::PreCreateWindow(cs);
}

で、このままだとマウスイベントがとれません。(※キーボードイベントもとれない。)
で、クラスウイザードで、

void CNECOMCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: ここにメッセージ ハンドラー コードを追加するか、既定の処理を呼び出します。
COleControl::OnLButtonDown(nFlags, point);
...

をいれても、マウスカチカチクリックしてもなんもおきません。
実は、ウインドウ自体に設定をしないとMFCのフレームワークは飛ばしてくれないのです。

SS_NOTIFY

このウインドウスタイルを追加設定してあげる必要があります。

::SetWindowLong( this->m_hWnd, GWL_STYLE , dwFlags );

お馴染みのSetWindowLong APIですね。
サブクラス化しないととれないのかな~とかメッセージフック使って奪うしかないのかな~
なんて違うこと考えていたら、問題は単純でした。
ソース飛ばしているので、前回やったこういうポイントを忘れているんですよね。
だって作ったの7年前だし(笑)

VisualStudioで通知してくれれば便利なんですけどねえ。
まあ現実的な話として、難しいかもしれませんが。
まあ、OCXなんてコアなもの作ろうとしている人間が知らないわけないかっみたいな
情報ですしね。
こういうコアものってインターネットでも情報があまり落ちてないのですよね。
結局調べていきついたのですが(MSのサイトに記載してありました。よく読めって事ですね)
二時間ぐらいはまったのでイライラしてました。

一人で開発していると、相談相手が全くいないので寂しい限りです。