文字色
Re: 文字色
> MainWndのEditBox1のフォント色をカラーダイアログで指定できるように
> する機能がほしいのですが、わたしは初心者のため解説とソースを教えていただけませんか。初心者のくせにすみません。
「カラーダイアログ」とか「エディットボックスのフォント色」って検索しましたか?
検索すると分かりますけど、検索するだけで答えが分かることも多々ありますよ。
それでは。
まず、カラー選択ダイアログを表示するにはChooseColor()関数を使います。
グローバル領域(モジュールレベル)でDWord型変数 rgb を宣言しておいてください。
ウィンドウメッセージを監視して、WM_CTLCOLOREDITが送られたことが分かればエディットボックスの文字色を変更できます。
これはコールバック関数を改造するだけで済みます。
あとWM_CTLCOLOREDITの処理が終わった後、何も返さずに関数を抜けてるので何か問題があるかもしれません。何も問題ないかもしれません。
ここら辺は宿題でしょうか。
> する機能がほしいのですが、わたしは初心者のため解説とソースを教えていただけませんか。初心者のくせにすみません。
「カラーダイアログ」とか「エディットボックスのフォント色」って検索しましたか?
検索すると分かりますけど、検索するだけで答えが分かることも多々ありますよ。
それでは。
まず、カラー選択ダイアログを表示するにはChooseColor()関数を使います。
グローバル領域(モジュールレベル)でDWord型変数 rgb を宣言しておいてください。
カラー選択ダイアログの手抜きサンプル [ここをクリックすると内容が表示されます]
次はエディットボックスの文字色を変更します。コード: 全て選択
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)
ウィンドウメッセージを監視して、WM_CTLCOLOREDITが送られたことが分かればエディットボックスの文字色を変更できます。
これはコールバック関数を改造するだけで済みます。
[ここをクリックすると内容が表示されます]
カラー選択ダイアログで色を取得した直後も文字色を変更しようとして、デバイスコンテキストのハンドルとエディットボックスのハンドルを指定したWM_CTLCOLOREDITを送信したんですけど、変わりませんね...。コード: 全て選択
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
あとWM_CTLCOLOREDITの処理が終わった後、何も返さずに関数を抜けてるので何か問題があるかもしれません。何も問題ないかもしれません。
ここら辺は宿題でしょうか。
無効..??what//.
"rgb" 無効な識別子です
と出るのですが、何かの変数がかけてるっポくて何を書き込んだらよろしいでしょうか。
また、解説とソースをお願いします。 (反省)
と出るのですが、何かの変数がかけてるっポくて何を書き込んだらよろしいでしょうか。
また、解説とソースをお願いします。 (反省)
Re: 文字色
InvalidateRect()でエディットボックスを再描画してやると変わります。7 さんが書きました:> カラー選択ダイアログで色を取得した直後も文字色を変更しようとして、デバイスコンテキストのハンドルとエディットボックスのハンドルを指定したWM_CTLCOLOREDITを送信したんですけど、変わりませんね...。
ブラシハンドルを返すと余白の部分(テキスト部分の背景は除く)が、そのブラシの色になります。何も返さないとABの仕様上0が返ると考えられる(Function名の変数を0で初期化?)から、無効なハンドルということでデフォルト値(白)になるのでしょう。7 さんが書きました:> あとWM_CTLCOLOREDITの処理が終わった後、何も返さずに関数を抜けてるので何か問題があるかもしれません。何も問題ないかもしれません。
ありがとうございました。
またわからんことがありまして、今度は文字色ではなくEditBoxの色をカラー
ダイアログで選択する機能をつけたいのですが。どうすれば前回同様
ソースをお願いします。あとは自分でやりますので。
ダイアログで選択する機能をつけたいのですが。どうすれば前回同様
ソースをお願いします。あとは自分でやりますので。
Re: ありがとうございました。
> またわからんことがありまして、今度は文字色ではなくEditBoxの色をカラー
> ダイアログで選択する機能をつけたいのですが。どうすれば前回同様
前回同様、「エディットボックスのフォント色」とか「WM_CTLCOLOREDIT」って検索しましたか?
文字色を変更する方法と背景色を変更する方法が1ページにまとまっているサイトが多く見受けられます。
初心者だから検索ができないって訳じゃ、ないですよね?。
背景色はSetBkColor()関数でパッと、と思ったらそうでもなくてちゃんとブラシを用意しなくてはならないようです。
使う時は使うんですけど、思い付きませんでした...。
> ダイアログで選択する機能をつけたいのですが。どうすれば前回同様
前回同様、「エディットボックスのフォント色」とか「WM_CTLCOLOREDIT」って検索しましたか?
文字色を変更する方法と背景色を変更する方法が1ページにまとまっているサイトが多く見受けられます。
初心者だから検索ができないって訳じゃ、ないですよね?。
背景色はSetBkColor()関数でパッと、と思ったらそうでもなくてちゃんとブラシを用意しなくてはならないようです。
グローバル変数の宣言 [ここをクリックすると内容が表示されます]
コード: 全て選択
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
ChooseColor()関数が成功した時 [ここをクリックすると内容が表示されます]
コード: 全て選択
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()でエディットボックスを再描画してやると変わります。
使う時は使うんですけど、思い付きませんでした...。
Re: そうすると../
> 何か、背景ではなくカーソル行の背景色になってしまって
> EditBox全体の色を変えるにはどうすればできますかね。
あー。手抜きコードだったので疎かになってる処理を見て出来てないって思ったんでしょうね。たぶん...。
とりあえず自分はChooseColor()関数が成功した場合、ちゃんとエディットボックスの背景色が変わります。
起動時、一行目だけが黒の背景色になりますけど、これは背景色を任意の値に初期化してないからです。
文字の背景色を持つ変数を宣言する時に適当な値に初期化してください。
> ヘルプで検索しても関係無いものしか出てこなくて。
ヘルプには関数の説明は載ってますけど、ダイレクトな解決策は書かれていません。
ヘルプを片っ端からじっくりと眺めてても解決することがあるんですけど、GoogleでググったりYahooでヤフったり(?)した方がいいですよ。
> EditBox全体の色を変えるにはどうすればできますかね。
あー。手抜きコードだったので疎かになってる処理を見て出来てないって思ったんでしょうね。たぶん...。
とりあえず自分はChooseColor()関数が成功した場合、ちゃんとエディットボックスの背景色が変わります。
起動時、一行目だけが黒の背景色になりますけど、これは背景色を任意の値に初期化してないからです。
文字の背景色を持つ変数を宣言する時に適当な値に初期化してください。
コード: 全て選択
Dim rgbBack=RGB(255,255,255) As DWord ' 文字の背景色は白
ヘルプには関数の説明は載ってますけど、ダイレクトな解決策は書かれていません。
ヘルプを片っ端からじっくりと眺めてても解決することがあるんですけど、GoogleでググったりYahooでヤフったり(?)した方がいいですよ。