スタティックテキストの文字色

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

スタティックテキストの文字色

#1 投稿記事 by まっ »

スタティックテキストの文字色

質問やその返信やヘルプや検索や、、、色々見ましたが、どうにも、、、
はずかしいのですが、怒らずに教えてくださいまし。

以下は、新規で pj を作って、Static1 を1つ貼り付けただけの状態です。
標準の黒文字 Text1 を、例えば、赤に変えるために必要な最低限の追加コードを教えていただけると助かります。その後のイタズラはまた自分で調べてみます。
EXE呼出し直後やイベントで変えるのではなく、できれば MainWnd.sbp の1つの sub(またはFunction)内で変えたいのですが。。。

test7.wnd ----------------------------------------
WINDOW:MainWnd
HANDLE = hMainWnd
POINT = -2147483648,-2147483648
SIZE = 480,360
CAPTION = "test7"
STYLE = &H10cf0000
EXSTYLE = &H00000000
ID = 0
BGCOLOR = 15
FONT = -12,0,0,0,400,0,0,0,128,3,2,1,32,"MS Pゴシック"
CLASS = "NORMAL"
CALLBACK = MainWndProc
TYPE = 0
FILEPATH = MainWnd.sbp
ITEM = Static1,111,88,62,26,"Text1",&H50000000,&H00000000,11
END

MainWnd.sbp --------------------------------------
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
Sub MainWnd_Destroy()
test7_DestroyObjects()
PostQuitMessage(0)
End Sub

Callback.wbp -------------------------------------
Const Static1=1000
Dim hMainWnd As HWND
Dim hFont_MainWnd As HFONT
hFont_MainWnd=CreateFont(-12,0,0,0,400,0,0,0,128,3,2,1,32,"MS Pゴシック")
Dim h3DFaceBrush As HBRUSH
h3DFaceBrush=CreateSolidBrush(GetSysColor(COLOR_3DFACE))
Sub test7_DestroyObjects()
DeleteObject(hFont_MainWnd)
DeleteObject(h3DFaceBrush)
End Sub
Function EventCall_MainWnd(hWnd As HWND, message As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT
Select Case message
Case WM_DESTROY
MainWnd_Destroy()
Case WM_CREATE
hMainWnd=hWnd
CreateWindowEx(&H00000000,"STATIC","Text1",&H50000000,111,88,62,26,hWnd,Static1 As HMENU,GetModuleHandle(0),0)
SendMessage(GetDlgItem(hWnd,Static1),WM_SETFONT,hFont_MainWnd As WPARAM,0)
以下略
--------------------------------------------------
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

#2 投稿記事 by 7 »

過去ログが参考になるかと思います。
「スタティックテキストの文字色」
まっ
記事: 18
登録日時: 2008年2月17日(日) 18:55

確認してましたが

#3 投稿記事 by まっ »

このトピックも既に確認してました。
が、あえて、というかそれでも、の質問です。
すいませんが、よろしくお汲み取りくださいませ。
ゲスト

#4 投稿記事 by ゲスト »

であればWM_CTLCOLORSTATICを処理すれば良いのでは?
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

#5 投稿記事 by 7 »

まずグローバル変数rgbを宣言しておきます。

コード: 全て選択

Dim rgb As DWord
そして、ウィンドウプロシージャ内部に以下のコードを突っ込んでください。 あとは例えばコマンドボタンを三つ配置して、それぞれを押すと「赤」「緑」「青」に変化するようなコードを書くだけです。
まっ
記事: 18
登録日時: 2008年2月17日(日) 18:55

ありがとうございました

#6 投稿記事 by まっ »

返信ありがとうございました。

はぁぁぁぁぁ~。ようやく。。。
ようやく解決しました。ホントにありがとうございました。

それにしても、最初は簡単に考えてましたが、この1つの事にこんなに日を取られるとは思ってもいませんでした。他に回避方法がなかったので、返信がなかったら、と思うとただただ感謝です。

以下は、同じ問題を抱えている、または抱えるかもしれない人に向けて。です。

pj を新規作成した状態から、:::::::: の行を追加したら、色が変更できました。
:::::::: の文字はあってもなくてもいいと思いますが、消したほうが確かです。
Callback.wbp は勝手に再構築される、という事になってるようですが、個人的にあまり信用していないので、ウマくいかない時はテキストエディタなどで見直してみてください。

test7.wnd ----------------------------------------------------------------------
WINDOW:MainWnd
HANDLE = hMainWnd
POINT = -2147483648,-2147483648
SIZE = 480,360
CAPTION = "test7"
STYLE = &H10cf0000
EXSTYLE = &H00000000
ID = 0
BGCOLOR = 15
FONT = -12,0,0,0,400,0,0,0,128,3,2,1,32,"MS Pゴシック"
CLASS = "NORMAL"
CALLBACK = MainWndProc
TYPE = 0
FILEPATH = MainWnd.sbp
::::::::ITEM = Static1,103,85,101,22,"Text1",&H50000000,&H00000000,11
::::::::ITEM = CommandButton1,51,136,54,35,"Button1",&H50000000,&H00000000,1
END

MainWnd.sbp --------------------------------------------------------------------
' イベント プロシージャ
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
::::::::Dim rgb As DWord
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
::::::::Select Case dwMsg
:::::::: Case WM_CTLCOLORSTATIC
:::::::: If lParam=GetDlgItem(hMainWnd,Static1) Then
:::::::: SetTextColor(wParam As HDC,rgb)
:::::::: SetBkMode(wParam As HDC,TRANSPARENT)
:::::::: MainWndProc=GetSysColorBrush(COLOR_3DFACE)
:::::::: Exit Function
:::::::: End If
::::::::End Select
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
test7_DestroyObjects()
PostQuitMessage(0)
End Sub
::::::::Sub MainWnd_CommandButton1_Click()
:::::::: rgb=RGB(255,0,0)
:::::::: InvalidateRect(GetDlgItem(hMainWnd,Static1),ByVal NULL,TRUE)
::::::::End Sub

Callback.wbp -------------------------------------------------------------------
'このファイルはウィンドウ定義ファイル(*.wnd)をもとに生成されています
::::::::Const Static1=1000
::::::::Const CommandButton1=1001
Dim hMainWnd As HWND
Dim hFont_MainWnd As HFONT
hFont_MainWnd=CreateFont(-12,0,0,0,400,0,0,0,128,3,2,1,32,"MS Pゴシック")
Dim h3DFaceBrush As HBRUSH
h3DFaceBrush=CreateSolidBrush(GetSysColor(COLOR_3DFACE))
Sub test7_DestroyObjects()
DeleteObject(hFont_MainWnd)
DeleteObject(h3DFaceBrush)
End Sub
Function EventCall_MainWnd(hWnd As HWND, message As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT
Select Case message
Case WM_DESTROY
MainWnd_Destroy()
Case WM_CREATE
hMainWnd=hWnd
:::::::: CreateWindowEx(&H00000000,"STATIC","Text1",&H50000000,103,85,101,22,hWnd,Static1 As HMENU,GetModuleHandle(0),0)
:::::::: SendMessage(GetDlgItem(hWnd,Static1),WM_SETFONT,hFont_MainWnd As WPARAM,0)
:::::::: CreateWindowEx(&H00000000,"BUTTON","Button1",&H50000000,51,136,54,35,hWnd,CommandButton1 As HMENU,GetModuleHandle(0),0)
:::::::: SendMessage(GetDlgItem(hWnd,CommandButton1),WM_SETFONT,hFont_MainWnd As WPARAM,0)
Case WM_CLOSE
Dim cancel=0 As Integer
If cancel=0 Then DestroyWindow(hWnd)
:::::::: Case WM_COMMAND
:::::::: Select Case LOWORD(wParam)
:::::::: Case CommandButton1
:::::::: Select Case HIWORD(wParam)
:::::::: Case BN_CLICKED
:::::::: MainWnd_CommandButton1_Click()
:::::::: End Select
:::::::: End Select
Case Else
EventCall_MainWnd=DefWindowProc(hWnd,message,wParam,lParam)
Exit Function
End Select
EventCall_MainWnd=0
End Function
以下略
--------------------------------------------------------------------------------
まっ
記事: 18
登録日時: 2008年2月17日(日) 18:55

色を変更するロジックを簡略化してみました

#7 投稿記事 by まっ »

色を変更するロジックを簡略化してみました。(まだ理解度68%ですが)
.pj を新規作成し、スタティックテキストを1つ作成した状態から :::::::::: の行を追加すると再現できます。スタティックテキストのプロパティの『通知』はチェック有り(&H50000100)にしてください。
InvalidateRect は、既に表示されているものを変更する際に使うようですが、ここでは、色を指定してから表示する手順にしてあります。たぶん、必要処理の後に色を標準(ZRGB=RGB(0,0,0)など)に戻しておいたほうがいいでしょう
クリックイベント MainWnd_Static1_Click をテストとして使用してるのは、どうやら、Function MainWndProc を通らないといけないようなので、簡単な方法として選んだだけです。
Callback.wbp は自動再構築に不安が残るのでチェック要です。
.exe の実行の際(このテストでは現象でませんが)、最大化,再表示,サイズ変更,などで色が戻ってしまう事があるようです。その際は問題をカバーするイベント処理が必要になりそうです。
初心者なので、変数の型使用の未熟はかんべんして。

(MainWnd.sbp)

コード: 全て選択


'-----------------------------------------------------------------------------
'  イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
:::::::::: Dim ZRGB As DWord
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
	' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
:::::::::: Select Case dwMsg
:::::::::: Case WM_CTLCOLORSTATIC
:::::::::: SetTextColor(wParam As HDC,ZRGB)
:::::::::: SetBkMode(wParam As HDC,TRANSPARENT)
:::::::::: MainWndProc=GetSysColorBrush(COLOR_3DFACE)
:::::::::: Exit Function
:::::::::: End Select
	' イベントプロシージャの呼び出しを行います。
	MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
	test7_DestroyObjects()
	PostQuitMessage(0)
End Sub
'
Sub MainWnd_Static1_Click()
:::::::::: Dim ZZZZ as long
:::::::::: ZRGB=RGB(255,0,0) : ZZZZ=SetWindowText(GetDlgItem(hMainWnd,Static1),"スタティックテキスト赤")
End Sub
(Callback.wbp)

コード: 全て選択


以上略
Function EventCall_MainWnd(hWnd As HWND, message As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT
	Select Case message
		Case WM_DESTROY
			MainWnd_Destroy()
		Case WM_CREATE
			hMainWnd=hWnd
			CreateWindowEx(&H00000000,"STATIC","Text1",&H50000100,79,94,247,108,hWnd,Static1 As HMENU,GetModuleHandle(0),0)
			SendMessage(GetDlgItem(hWnd,Static1),WM_SETFONT,hFont_MainWnd As WPARAM,0)
		Case WM_CLOSE
			Dim cancel=0 As Integer
			If cancel=0 Then DestroyWindow(hWnd)
::::::::::	Case WM_COMMAND
::::::::::		Select Case LOWORD(wParam)
::::::::::			Case Static1
::::::::::				Select Case HIWORD(wParam)
::::::::::					Case STN_CLICKED
::::::::::						MainWnd_Static1_Click()
::::::::::				End Select
::::::::::		End Select
		Case Else
			EventCall_MainWnd=DefWindowProc(hWnd,message,wParam,lParam)
			Exit Function
	End Select
	EventCall_MainWnd=0
End Function
以下略
返信する