色が変わらない

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
Toshi

色が変わらない

#1 投稿記事 by Toshi »

ボタンを押したらウィンドウを赤で塗りつぶしたいのですが、
(必要な部分だけ抜粋)

Sub MainWnd_Paint(hDC As DWord)

hMemDC=CreateCompatibleDC(hDC)
hPen=CreatePen(PS_SOLID,1,RGB(255,0,0))
hOldObject=SelectObject(hMemDC,hPen)
Rectangle(hMemDC,0,0,300,60)
BitBlt(hDC,0,0,300,60,hMemDC,0,0,NULL)

End Sub

Sub MainWnd_CommandButton1_Click()

InvalidateRect(hMainWnd,ByVal NULL,TRUE)

End Sub

赤ではなく黒で塗りつぶされてしまいます。
赤以外の色でも同じです。
さっぱり原因が分からないのですが、どこか見落としているのでしょうか?
イグトランス

#2 投稿記事 by イグトランス »

Paintイベントは最初にウィンドウが表示されたときなど、いつでも呼ばれるのでボタンが押された後かどうかを識別する手段が必要です。
Rectangle()ではペンは周りの枠線を書くのに使われます。
内部の塗りつぶしにはブラシを使うのでブラシを作らなければなりません。
またCreateCompathibleDC()の返すデバイスコンテキストは1×1のサイズなのでそのままではうまくいきません。
とりあえず今回はPaintイベントのhdcに直接Rectangle()を実行することにします。

というわけでこんな感じになります。

コード: 全て選択

Typedef BOOL = Long

Dim bClicked = FALSE As BOOL

Sub MainWnd_Paint(hdc As HDC)
	If bClicked Then
		Dim hBrush As HBRUSH, hOldBrush As HBRUSH
		hBrush=CreateSolidBrush(RGB(255, 0, 0))
		hOldBrush=SelectObject(hdc, hBrush)
		Rectangle(hdc, 0, 0, 300, 60)
		SelectObject(hdc, hOldBrush)
		DeleteObject(hBrush)
	End If
End Sub

Sub MainWnd_CommandButton1_Click()
	bClicked = TRUE
	InvalidateRect(hMainWnd, ByVal NULL, TRUE)
End Sub
Toshi

#3 投稿記事 by Toshi »

指摘を頂いて確認すると、僕のすごいミスってますね^^;;
今度はちゃんと真っ赤です。
ありがとうございました。
返信する