5ドット絵エディタ「EDGE2」、MIDI音楽編集ソフト「Domino」、楽曲などを配布している個人サイトです。汎用的なスクロールイベントハンドラを作ってみたMFC,ProgrammingTipsMFCでアプリを書いていると、スクロール処理が必要になってくる場合が多々あります。CScrollViewで行ける場合は良いのですが、自前でやらないといけない場合には、OnHScrollとOnVScrollをインプリメントしてやらないといけません。これが結構面倒だなーといつも思っていたので使い回せるようなイベントハンドラを作ってみました。nOldPos;}スクロール位置に変更があったときにtrueを返しますので、これを見て画面更新などを行います。こんな感じで使います。ここで画面更新など}}page移動量は若干の調整が必要かもしれませんね。CScrollWnd的なものを作ってテンプレートっぽくしておくのがベストなんだろうなぁ。SP1)で作ったアプリのカスタマイズ機能が動かない場合の対処方法C/C++,MFC,ProgrammingTips適当にウィザードでプロジェクトを作成したのち、「カスタマイズ」機能でツールバーやメニューコマンドをドラッグ&ドロップしようと思ったら、動かない!なんて事がありましたので原因を探ってみたところ、プロジェクト作成ウィザードでActiveXのチェックを外してしまっていたのが原因のようです。中は見ていませんが、おそらくカスタマイズ時のドラッグ&ドロップ処理はOLEのドラッグ&ドロップなんでしょうね。CXXXXApp::InitInstanceの適当な所で「AfxOleInit()」を呼べばカスタマイズ機能が正常に動くようになります。APIのラッパー関数を作ってみました。言っても縦のグラデしか対応させていませんが。APIは古いOSでは動きませんのでご注意ください。MFCでExcelを操作するにはC/C++,MFC,ProgrammingTips仕事で開発を行っていると、他の人がエクセルファイルでデータ資料を作り、プログラマがその情報をアプリに組み込む、なんて事がよくあります。一度CSVに書き出してからプログラムでそれを読み、使いやすいデータ(XMLやCのソース)にコンバートして利用するのが定石かと思いますが、エクセルファイルを直接読めればCSVに書き出す手間が多少軽減されます。MFCだとどうやるんだろう?と思いましてちょっとやってみました。メニューからクラスの追加を実行します。「TypeLibからのMFCクラス」を選びます。エクセルのタイプライブラリを選び、使うインターフェースを追加して(今回は面倒なので全部追加)完了ボタンを押します。生成に時間が掛かりますが、ヘッダーファイルが生成されます。#import文が入っていて、コンパイル時にエラー(名前の競合)が出てしまうので一括置換でコメントアウトします。VC6ではできなかった芸当ですね(ソリューション内一括置換)あとはごりごりコードを書けばエクセルの操作ができます。既存のファイルを開いて、最初のシートのA1のテキストを取得するにはこんな感じになるかと思います。Cell.get_Text().bstrVal;}CRange::DialogBoxとかいう関数でコンパイルエラーが出ますが関数名変えるなどして回避します。当然ながら実行する環境にエクセルがインストールされている必要があります。使用したタイプライブラリと実行時のエクセルのバージョンが違うと、うまく動かない事があるかもしれません。上位互換はあるかも?もしいろんな操作をやりたい場合、エクセルのマクロのヘルプが参考になると思います。若干関数名は違いますが、構造などはほぼ同じです。CSplitterWndで非ビュー(CWndなど)を載せるにはMFC,ProgrammingTips,日記CSplitterWndと言えば、CView系のみスプリット表示するというイメージがありますが、ヘルプを見ていたら静的分割ウィンドウを作成するとき、同時にすべてのペインを作成する必要があります。メンバ関数は、この目的のために使われます。クラスも作成できます。書いてあるではありませんか。親にCSplitterWndのインスタンスを指定してコントロール等を作成IDをCSplitterWnd::IdFromRowCol関数で算出した値にしておくだけで良いみたいです。0));あとはm_wndSplitter自体をウィンドウ全体に広げて配置したりだとか、m_wndSplitter.SetRowInfoで行の高さを変更したりするだけです。ダイアログベースのアプリでも気軽に使えそうですね。blockworks.このサイトについてサイトマップRSSフィード。