by jacoby » 2006年9月26日(火) 04:12
ヘルプセンターの「テキストエディタを作る」で説明されているサンプルのように、
ウインドウにエディットボックスを一つ貼り付けて、
リサイズ・イベントでその大きさを調整して表示するプログラムを下の様に
書きました。
(AB 4.24/プロジェクト名「EditBoxTest_Flickering」で製作。)
(ここにソースが表示されます) [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
コード: 全て選択
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
EditBoxTest_Flickering_DestroyObjects()
PostQuitMessage(0)
End Sub
'
'●リサイズ・イベント
'
Sub MainWnd_Resize(SizeType As Long, cx As Integer, cy As Integer)
Dim rc As RECT
Dim hEdit As HWND
'クライアント領域のサイズを取得
GetClientRect(hMainWnd,rc)
'EditBox1のウィンドウ ハンドルを取得
hEdit=GetDlgItem(hMainWnd,EditBox1)
'hEditの大きさを変更する
MoveWindow(hEdit,0,0,rc.right,rc.bottom,0)
End Sub
それからウインドウサイズの変更等に伴う、エディットボックスのちらつきを
防ごうと、メインウインドウの「子ウインドウをクリップ」にチェックを入れたのですが、
そうすると以降、ウインドウの初期表示時に
エディットボックスの枠線やエディットボックスのスクロールバーなどの部分が
描画されなくなってしまいました。
リサイズ・イベントの最後に「UpdateWindow」命令など、再描画出来そうな
命令を書いてみたりもしたのですが表示されず、
改めてサイズを変更したり、他のウインドウの下に敷いてからもう一度手前に
もってくるなりでもしないとそれらは再描画されないようです。
「子ウインドウをクリップ」にチェックを入れなければ問題ないのですが、
それだと何かにつけてちらつきが残ります。
「子ウインドウをクリップ」にチェックを入れて、エディットボックスを正しく表示
するにはどうしたら良いでしょうか?
(AB 4.24/WinMe)
ヘルプセンターの「テキストエディタを作る」で説明されているサンプルのように、
ウインドウにエディットボックスを一つ貼り付けて、
リサイズ・イベントでその大きさを調整して表示するプログラムを下の様に
書きました。
(AB 4.24/プロジェクト名「EditBoxTest_Flickering」で製作。)
[hide=(ここにソースが表示されます)]
[code]
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
EditBoxTest_Flickering_DestroyObjects()
PostQuitMessage(0)
End Sub
'
'●リサイズ・イベント
'
Sub MainWnd_Resize(SizeType As Long, cx As Integer, cy As Integer)
Dim rc As RECT
Dim hEdit As HWND
'クライアント領域のサイズを取得
GetClientRect(hMainWnd,rc)
'EditBox1のウィンドウ ハンドルを取得
hEdit=GetDlgItem(hMainWnd,EditBox1)
'hEditの大きさを変更する
MoveWindow(hEdit,0,0,rc.right,rc.bottom,0)
End Sub
[/code]
[/hide]
それからウインドウサイズの変更等に伴う、エディットボックスのちらつきを
防ごうと、メインウインドウの「子ウインドウをクリップ」にチェックを入れたのですが、
そうすると以降、ウインドウの初期表示時に
エディットボックスの枠線やエディットボックスのスクロールバーなどの部分が
描画されなくなってしまいました。
リサイズ・イベントの最後に「UpdateWindow」命令など、再描画出来そうな
命令を書いてみたりもしたのですが表示されず、
改めてサイズを変更したり、他のウインドウの下に敷いてからもう一度手前に
もってくるなりでもしないとそれらは再描画されないようです。
「子ウインドウをクリップ」にチェックを入れなければ問題ないのですが、
それだと何かにつけてちらつきが残ります。
「子ウインドウをクリップ」にチェックを入れて、エディットボックスを正しく表示
するにはどうしたら良いでしょうか?
(AB 4.24/WinMe)