エディットコントロールのスタイル変更

[戻る]
nfs 2009/10/03(土) 17:02:38
環境
VC2008 Express Edition
SDK
Vista SP1

エディットコントロールのスタイルを変更(ES_READONLYを追加・削除)したいのですが、
うまくいきません。
ES_XXXXXXXX系の場合のスタイル変更をご教授願います。

WS_XXXXXXX系は以下の関数でうまくいきます。
//  ウィンドウスタイルを外す
LONG testRemoveWindowStyle(HWND hWnd, LONG style)
{
    LONG old_style = GetWindowLong(hWnd, GWL_STYLE);
    LONG new_style = old_style & ~style;
    SetWindowLong(hWnd, GWL_STYLE, new_style);
    return new_style;
}

// ウィンドウスタイルを追加する
LONG testSetWindowStyle(HWND hWnd, LONG style)
{
    LONG old_style = GetWindowLong(hWnd, GWL_STYLE);
    LONG new_style = old_style | style;
    SetWindowLong(hWnd, GWL_STYLE, new_style);
    return new_style;
}

ITO 2009/10/03(土) 18:02:44
「CEdit::SetReadOnly」はだめですか?
リッチエディットの方が色も変えられるのでいいと思います。

nfs 2009/10/03(土) 19:09:30
ITOさん、お返事ありがとうございます。

実は、ES_AUTOHSCROLLも変更したいのです。
あと、できればMFCでない回答だとありがたいです。

ITO 2009/10/03(土) 19:46:03
http://www.nitoyon.com/vc/reference/gui/edit.htm
http://gurigumi.s349.xrea.com/programming/visualcpp/sdk_redit1.html
http://www.kumei.ne.jp/c_lang/sdk3/sdk_225.htm

参考にどうぞ

SDKは詳しくないのですが、「EM_SETREADONLY」がカギみたいですね。
例
>SendMessage(SELF:Handle(), EM_SETREADONLY, DWORD(_CAST, lNewValue),
0L)

FlatWest 2009/10/05(月) 01:39:10
LRESULT SetReadOnly( HWND hWndEdit, BOOL bReadOnly)
{
    return ::SendMessage( hWndEdit, EM_SETREADONLY, static_cast<WPARAM>( 
bReadOnly), 0L)
}

リードオンリーにする場合は bReadOnly = TRUE、しない場合は FALSE;

bun 2009/10/05(月) 10:36:49
参考までにですが、
非MFC使いにもMFCのヘルプとソースコードは役に立ちますよ。

まず、エディットコントロールのMFCラッパクラスである、CEditをMSDNで検索します。
CEditのメンバ をMSDNで検索すると日本語解説付きで非常に分かりやすいです。
で、すぐに、CEdit::SetReadOnly()が目に入ります。

その上で、MFCのソースコードフォルダ(VS2005なら C:Program Files\Microsoft 
Visual Studio 8\VC\atlmfc\ 以下)から、[CEdit::SetReadOnly]の文字列をgrepしま
す。
すると以下の行が見つかります。
_AFXWIN_INLINE BOOL CEdit::SetReadOnly(BOOL bReadOnly )
    { ASSERT(::IsWindow(m_hWnd)); return (BOOL)::SendMessage(m_hWnd, 
EM_SETREADONLY, bReadOnly, 0L); }

結果として、
  SendMessage(<ウィンドウハンドル>, EM_SETREADONLY, TRUE, 0L);
を導き出せるわけです。

nfs 2009/10/05(月) 11:48:37
[[解決]]
FlatWestさんもありがとうございます。
書籍とMSDN読んでみます。

古いスレッドには追加発言できません。