文字色
Posted: 2006年5月06日(土) 21:22
MainWndのEditBox1のフォント色をカラーダイアログで指定できるように
する機能がほしいのですが、わたしは初心者のため解説とソースを教えていただけませんか。初心者のくせにすみません。
する機能がほしいのですが、わたしは初心者のため解説とソースを教えていただけませんか。初心者のくせにすみません。
コード: 全て選択
Dim chc As *CHOOSECOLOR ' ダイアログ情報を管理する
Dim buf[16] As DWord ' ユーザーが作った色を残しておきたいならグローバルにする
' カラー選択ダイアログの表示に必要な情報をセット
chc=calloc(SizeOf(CHOOSECOLOR))
chc->lStructSize=SizeOf(CHOOSECOLOR)
chc->hwndOwner=hMainWnd
chc->lpCustColors=VarPtr(buf)
chc->rgbResult=rgb
' カラー選択ダイアログの表示
If ChooseColor(ByVal chc) Then
' ユーザーが色を指定したなら rgb に代入
rgb=chc->rgbResult
End If
free(chc)
コード: 全て選択
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
Select Case dwMsg
Case WM_CTLCOLOREDIT
If lParam=GetDlgItem(hMainWnd,EditBox1) Then
' カラー選択ダイアログで取得した色を文字色にする
SetTextColor(wParam As HDC,rgb)
Exit Function
End If
End Select
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
ちゃんと書いておいたんですけどね。グローバル領域(モジュールレベル)でDWord型変数 rgb を宣言しておいてください。
コード: 全て選択
Dim rgb As DWord
InvalidateRect()でエディットボックスを再描画してやると変わります。7 さんが書きました:> カラー選択ダイアログで色を取得した直後も文字色を変更しようとして、デバイスコンテキストのハンドルとエディットボックスのハンドルを指定したWM_CTLCOLOREDITを送信したんですけど、変わりませんね...。
ブラシハンドルを返すと余白の部分(テキスト部分の背景は除く)が、そのブラシの色になります。何も返さないとABの仕様上0が返ると考えられる(Function名の変数を0で初期化?)から、無効なハンドルということでデフォルト値(白)になるのでしょう。7 さんが書きました:> あとWM_CTLCOLOREDITの処理が終わった後、何も返さずに関数を抜けてるので何か問題があるかもしれません。何も問題ないかもしれません。
コード: 全て選択
Dim rgbText As DWord
Dim rgbBack As DWord
Dim hBackBrush As HBRUSH
コード: 全て選択
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
Select Case dwMsg
Case WM_CTLCOLOREDIT
If lParam=GetDlgItem(hMainWnd,EditBox1) Then
' 文字色の変更
SetTextColor(wParam As HDC,rgbText)
' 文字の背景色の変更
SetBkColor(wParam As HDC,rgbBack)
MainWndProc=hBackBrush
Exit Function
End If
End Select
End Function
コード: 全て選択
rgbBack=chc->rgbResult
If hBackBrush Then
' ここら辺の処理が怪しい...。
DeleteObject(hBackBrush)
hBackBrush=NULL
End If
hBackBrush=CreateSolidBrush(rgbBack)
InvalidateRect(GetDlgItem(hMainWnd,EditBox1),ByVal NULL,TRUE)
コード: 全て選択
Sub MainWnd_Destroy()
If hBackBrush Then DeleteObject(hBackBrush) ' ブラシを破棄
ChooseColor_DestroyObjects()
PostQuitMessage(0)
End Sub
なるほど!InvalidateRect(インバリデートレクトと呼んでます)を使うんですね。Tomorrowさん さんが書きました:InvalidateRect()でエディットボックスを再描画してやると変わります。
コード: 全て選択
Dim rgbBack=RGB(255,255,255) As DWord ' 文字の背景色は白