Staticコントロールに文字列を表示させるとき「折り返しなし」を選択していないのに文字が右端まで行っても折り返されず表示されない部分が出来るんですがバグかと思いこちらに書き込みします。
いろいろ試してみましたが(SetWindowLong SetClassLongで後からSS_LEFTにしても折り返しされず。また、SS_CENTERやSS_RIGHTでも折り返しは出来なかった)変化がないようなので…。一応MSDNの記述によると
SS_LEFT 単純な四角形を指定し、指定されたテキストをその中に左揃えで表示します。テキストは書式設定されてから表示されます。テキストの長さが 1 行の長さよりも長い場合は、自動的に次の行に折り返され、新しい行も左揃えで表示されます。
となっているので文字が折り返されるものと思っているんですが違うんでしょうか?
Staticコントロールの文字の折り返しがされない?
-
- Site Admin
- 記事: 535
- 登録日時: 2005年5月30日(月) 15:08
うーん…ひょっとして自分の考えてる「折り返し」が間違っているのでしょうか?OSをXP(SP2)とMeどちらでやっても駄目だし最新版にしても駄目だったので…。当然リリースコンパイルもしてみたのですが駄目でした。とりあえず自分の考えてる折り返しは下の用に[]がStaticの両端だとした場合これは、RADツール上での表示が対応していないという認識でよろしいでしょうか?コンパイル&実行を行うと、スタイルの指定通り、折り返しのON/OFFがされていると思います。
コード: 全て選択
[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]AAAAAAA
コード: 全て選択
[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]
[AAAAAAA ]
因みにXPの方はPen4(クロック数忘れた、今手元にない物で)メモリも1Gあったはず。Meの方はCel(700MHz) メモリ320Mです。環境によっている訳では無いようなのでバグかと思ったんですが。
-
- Site Admin
- 記事: 535
- 登録日時: 2005年5月30日(月) 15:08
残念ながらどうやっても無理そうですorz
色々試してみましたがどうやっても折り返されることがなさそうですのであきらめます。ただ、試行錯誤していて気づいたことを最後に記入しときます。
プロジェクトでWindowを一つつくりEditBoxをひとつとボタンを二つとStaticを1つ用意します。そこに以下のようにコードを記入します。
ボタン1を押した後に文字をEditに入れボタン2を押してもSS_CENTERが反映されません。文字を先に入れボタン2→ボタン1でも無理でした。使い方が間違っているのかもしれませんが気になったので記入しておきます。
プロジェクトでWindowを一つつくりEditBoxをひとつとボタンを二つとStaticを1つ用意します。そこに以下のようにコードを記入します。
コード: 全て選択
Sub MainWnd_CommandButton1_Click()
SetClassLong(GetDlgItem(hMainWnd,Static1),GCL_STYLE,SS_CENTER)
End Sub
Sub MainWnd_CommandButton2_Click()
Dim str2 As String
GetWindowTextStr(GetDlgItem(hMainWnd, EditBox1), str2)
SetWindowText(GetDlgItem(hMainWnd,Static1),str2)
End Sub
亀レスですが、
>ボタン1を押した後に文字をEditに入れボタン2を押してもSS_CENTERが反映されません。
コントロールのスタイルを動的に変更したときは、InvalidateRect関数を使ってコントロールを再描写する必要があります。
また、SS_LEFT, SS_CENTER, SS_RIGHT は互いに排他です。
以上をまとめて,MainWnd_CommandButton1_Clickイベントを以下のように変更すると意図したとおりに動きます。
>ボタン1を押した後に文字をEditに入れボタン2を押してもSS_CENTERが反映されません。
コントロールのスタイルを動的に変更したときは、InvalidateRect関数を使ってコントロールを再描写する必要があります。
また、SS_LEFT, SS_CENTER, SS_RIGHT は互いに排他です。
以上をまとめて,MainWnd_CommandButton1_Clickイベントを以下のように変更すると意図したとおりに動きます。
コード: 全て選択
Sub MainWnd_CommandButton1_Click()
Dim Style As LONG_PTR
Style = GetWindowLong(GetDlgItem(hMainWnd,Static1), GWL_STYLE) And &HFFFFFFFC
SetWindowLong(GetDlgItem(hMainWnd,Static1), GWL_STYLE, Style Or SS_CENTER)
InvalidateRect(GetDlgItem(hMainWnd,Static1), ByVal NULL, 1)
End Sub
お答えいただきありがとうございます。
あと、このコードの&HFFFFFFFCの意味はGetWindowLongで得た32bit値との論理積を求めて最後をCにすることで現在設定されているSS_LEFT, SS_CENTER, SS_RIGHTがStyleに反映されないようにするためと考えればよいのでしょうか?
なんとなくそんな気はしてたんですがやっぱり更新に関する関数がありましたか。どうもありがとうございました。コントロールのスタイルを動的に変更したときは、InvalidateRect関数を使ってコントロールを再描写する必要があります。
コード: 全て選択
Style = GetWindowLong(GetDlgItem(hMainWnd,Static1), GWL_STYLE) And &HFFFFFFFC