エディットボックスの選択範囲をクリップボードを介さずに取得する方法
CStringの特定位置のデータを取得する方法




エディットボックスの選択された範囲の文字列をクリップボードを使わずに取得する方法です。
CEditやその派生元のクラスには選択範囲の文字列を取得するには、クリップボードを使えば、 簡単にできます。しかし、クリップボードを使わないとなると、1関数で取得できるようには なっていないのでちょっと、困りものです。
N村はちょっと強引にコーディングしましたが、他にもっと楽な方法があれば教えて下さい。
今回はついでに、CStringから特定位置の文字列を取得する方法を発見しました。

(サンプル)
void CSocpapiView::OnQuickDump() 
{
    // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください

    int     FirstPtr;                   // 先頭ポインタ
    int     LastPtr;                    // 終了ポインタ
    char    Buf[10];                    // 選択文字バッファ
    DWORD   Ptr;                        // 選択範囲ポインタ
    CString Buff;                       // 表示中のテキスト
    char    **buf2;                     // ワークアドレス
	

    // エディットボックスの選択範囲を取得する
    Ptr = E_Logging_ptr->GetSel( );
	
    // 選択範囲の先頭を取得する
    FirstPtr = LOWORD( Ptr );

    // 選択範囲の最後を取得する
    LastPtr = HIWORD( Ptr );

    // 範囲指定されていない時
    if( FirstPtr == LastPtr )
    {
        // リターンする
        return;
    }
    // 表示中テキストの全範囲を取得する
    E_Logging_ptr->GetWindowText(Buff);

    // ワーク用のアドレスに変換する
    buf2 = (char **)&Buff;

    // 選択範囲のみ切り出す
    memcpy( Buf, (*buf2)+FirstPtr, LastPtr-FirstPtr );
まずは、選択範囲の開始位置と終了位置を取得します。
ここからが本番です。GetWindowText()関数を使って、エディットボックスに表示されている 全ての文字列を取得します。
そのままではCString型で使えないのでchar型に変換してやります。
アドレスを調べてメモリダンプをすればCString型はchar**型と同じような構造であることが分かります。 N村が思いつく限りの方法を試した限りでは、サンプルのコーディング方法でしか動作しませんでした。
エディットボックスのサイズが小さければ、一時的に全ての文字列をCStringからcharのワークバッファに ベタコピーしてもいいのですが、今回は馬鹿でかいエリアを使うので、こんな方法となりました。
参考までにメモリ上はこんな感じでした。
&Buff = 0x00120000
0x00120000 の内容 0x00400000
0x00400000 の内容 エディットボックスの文字列
buf2 = 0x00120000
*buf2 = 0x00400000




N総研ソフトウェア開発部のTOPに戻る。

このページに関するご意見・質問は
ドンタコスN村 E-mail:wnaka@coco.ned.co.jp
まで送信してください。