バイナリエディタを作ろうと思って試行錯誤しているのですがUIについて
疑問な点があります。
WEBで色々検索してみたのですがバイナリエディタの作り方を解説しているページがなかったので質問させていただきます。
現状Staticコントロールを2つ用意して
①16進数で表示する部分
②16進数を文字列で表す部分
を表現しています
①はカレットを作って、マウスの状態、キーの状態を取得して
カレットの上下左右、マウスのドラッグなどを実装しています。
①では選択した座標を計算しSetBkColorで文字の背景色を変更して選択していることを表現しています。
①に対応した文字に②で同じように選択していると表現するには何か良い方法はないでしょうか?
同じSetBkColorだとマルチバイト文字の場合半分選択時に対応できません。
カレットを使ってやってみましたが1行の場合は問題ないですが、
複数行にまたがっての選択だとカレットを複数個表示する方法がわかりませんでした。
そもそも作り方が間違っている、またはこの方が効率が良いなどありましたら助言ください。
質問をまとめますと
・①と②の選択状態の同期の取れた表現方法
・基本的なバイナリエディタのUIの作り方が間違っている?
よろしくお願い致します
個人的には、選択域とカレットが必要なら、
エディットボックスを使うのが良いと思います。
Staticコントロールと言うことは、ダイアログベースなんですか?
SDIとかならCEditViewを使うと楽ができそうですが、考え方一つかなと言う気がします。
何処までの機能を求めるのかによるのかなと。
例えば、極力簡単にと言う話であれば、CListCtrlあたりで表示しておいて
行単位の編集と言うことにしてその行がダブルクリックされたら行編集用のダイアログを出してそこで行単位を編集させる。
ダンプ形式の表示をイメージするなら一行を16個のカラムで表現して
一つのカラムを1バイト扱いにして編集ダイアログ上では1カラムを一つの
エディットコントロール扱いで作成すれば、比較的に簡単に出来そう。
使いやすいかどうかは疑問ですけれど。
エディットコントロールやエディットビュウを使うのであれば、
ダンプイメージの時にバイト間に表示しているホワイトスペース上での
カレットの扱いをどうするのかとか考える考える必要がありそうですし。
作り方が間違っていると言うよりも作り方は色々あるし、使い勝手も色々ありえるのだから
どういう使い勝手を目指しているのかによって作りも変わって来ると考えた方がいいでしょう。
一番大事なのは、perpleさんがどんな使い勝手のソフトを目指しているのか。
それがわからないとアドバイスしても空振りになりそうです。
まず説明不足だったことをお詫びいたします。
バイナリエディタを作っていると申しましたが実際バイナリの変更は致しません。
表示のみが目的です。
エディットコントロールを使った場合
・カレットの大きさ変更
・上下左右の動きでのカレットの移動幅
・マウスクリックでのカレット位置
などが思ったとおりにできませんでしたのでStaticコントロールを使っています。これをエディットコントロールで実装できるのだとしたら
エディットでやった方が確実に効率的だと思います
↓①コントロール ↓②コントロール
-------------------------------------------------------------
+0 +1 +2 +3 +4 +5 +6 +7 +8 +9... 0123456789...
000000 00 01 02 03 04 05 06 07 08 09...
-------------------------------------------------------------
このような感じで表示したい場合
カレットの位置が初期状態で「+0」の「00」部分の左側「0]を覆うような感じで表示したいわけです。その時左キーを押すと「+1」の「01」の「1」部分に移動したい。
また、マウスでクリックした場合カレットは必ず選択バイトの左部分に移動するような感じです。
ここまでの実装は済んでおり、問題は①コントロールでの選択状態(マウスでのドラッグ選択 or Shiftキー+方向キーでの選択)を②コントロールで該当部分の選択状態の表現方法に悩んでいます。
・カレットを使う方法だと複数行に対応できない
・文字の背景を変える方法だとマルチバイトに対応できない
これを打開するいい案が思いつきません、何かいい方法があればご教授お願い致します
開発環境
Windows XP ps2
VC8 SDK
> ここまでの実装は済んでおり、問題は①コントロールでの選択状態
> マウスでのドラッグ選択 or Shiftキー+方向キーでの選択)を②
> コントロールで該当部分の選択状態の表現方法に悩んでいます。
文字の座標をうまく算出できるなら、
OnEraceBkGnd で背景として表示する方法が可能かもしれません。
いっそのこと、全て自作する(CWndを派生する)のはどうですか?
現状で CStatic に頼っているのは、文字を描画する部分だけですし、
等幅フォントでの文字描画なら、比較的簡単だと思います。
OnEraceBkGndについて調べてみました。
検索結果が6件しか出てこなかったので微妙ですがMFCのクラスライブラリでしょうか?
SDKで開発している場合使えない模様です。
何かいい方法を考えてはいるのですが、なかなか思いつきません。
どなたかいい案をお持ちではないでしょうか
WM_ERASEBKGNDとか
すみません、MFCと勘違いした上に、綴りが間違っていました。
旧通りすがりさんの仰るとおり、WM_ERASEBKGND が該当します。
WM_ERASEBKGNDでは文字の背景色が邪魔して思ったとおりの結果が得られませんでした。
SetBkModeにて文字の背景色を透明化してFillRectで思ったとおりの結果を得ることができました。みなさんありがとうございました
ツイート | ![]() |