- ベストアンサー
static 文字が上に張り付いて・・・
win32、VC++2005にて開発しております。 static文字が上に張り付いているのですが中央にしたい場合どうすればいいのでしょうか? SS_CENTERだけだと中央に表示されますが上に張り付いてます。 文字のサイズも変更したいのですが分かりません。 非常に初歩的な質問で申し訳ありません。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
サブクラス化するなら WM_PAINTで描画をしてやらないといけないかと ダイアログプロークで g_buttonWndProc = (WNDPROC)SetWindowLong( hSts, GWL_WNDPROC, (DWORD)DlgStaticProc); として コントロールのコールバックを変更します EndDialogを呼び出す前に if ( g_buttonWndProc ) { SetWindowLong( hSts, GWL_WNDPROC, g_buttonWndProc ); g_buttonWndProc = NULL; } としてコールバックを元に戻しておきましょう WM_CTLCOLORSTATICメッセージは親で処理するメッセージです DlgStaticProcで case WM_PAINT: // hdcを取得 hdc = BeginPaint( hDlg, &ps ); // 表示文字列を取得 GetWindowText( hDlg, buf, sizeof( buf )); // クライアントエリアの取得 GetClientRect( hDlg, &rc ); // 塗りつぶしようのペンを作成 hPen = CreatePen( PS_NULL, 0, 0 ); hPenOld = (HPEN)SelectObject(hdc, hPen); // 塗りつぶし Rectangle( hdc, 0, 0, rc.right, rc.bottom ); // ペンの後処理 SelectObject( hdc, hPenOld ); DeleteObject( hPen ); // 描画 DrawText( hdc, buf, _tcslen( buf ), &rc, DT_SINGLELINE | DT_VCENTER | DT_CENTER ); // Paintの後処理 EndPaint( hDlg, &ps ); return TRUE; # 必要な変数を宣言してください PAINTSTRUCT ps; HPEN hPen, hPenOld; TCHAR buf[256]; RECT rc; HDC hdc; といった具合でしょう
その他の回答 (4)
- redfox63
- ベストアンサー率71% (1325/1856)
どうも Movileでは SS_CENTERIMAGEで垂直の中央寄せは無理なようです # Windowsの方も 本来SS_BITMAP時の指定ですから # テキストに対して指定すると 縦の中央寄せになるのは副産物ですし 方法としては Staticテキストをサブクラス化して これのWindowProcコールバックでWM_PAINTを捕まえ DrawTextで DT_SINGLELINE | DT_CENTER | DT_VCENTER を uFormatに与えて描画って方法かな または、描画領域をDrawTextのuFormatにDT_CALCRECTを与えてlpRectに取り出して 余白分大きくしたlpRectでスタティックテキストをリサイズして ベースのダイアログ内での表示位置を変えるとか
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス Windowsモバイルの環境ですか。 >文字のサイズも変更したいのですが分かりません。 ↑ CreateFont 関数でフォントを作成。 WM_SETFONT メッセージで static コントロールにフォントを設定。 文字のサイズは CreateFont 関数でフォントを作成するときに指定します。 サンプル: // マクロ関数 #define myCreateFont(x,y,n,i,u,c,s) CreateFont(y,x,0,0,n,i,u,c,SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH,s) #define mySetEditFont(h,font) SendMessage(h,WM_SETFONT,(WPARAM)(font),MAKELPARAM(FALSE,0)) // グローバル変数など static HFONT hFont; // フォント作成(WM_INITDIALOGなど) hFont = myCreateFont( 0, // 平均文字幅 20, // フォントの高さ(これが文字サイズ) FW_NORMAL, // フォントの太さ FALSE, // 斜体 FALSE, // 下線 FALSE, // 取り消し線 TEXT("MS ゴシック") ); // フォント名 // フォント設定 HWND hWndStatic = GetDlgItem( hDlg, IDC_ICHI2 ); mySetEditFont( hWndStatic, hFont ); // 終了時(WM_CLOSEなど) DeleteObject( hFont ); ※文字サイズを動的に変更するにはフォントの作成/破棄を繰り返して切り替えます。 ※文字サイズは変数にでも保存しておけば良いでしょう。(取得も可能だが保存して使う)
- redfox63
- ベストアンサー率71% (1325/1856)
プロジェクトのテンプレートって何を使ってるのでしょう? コントロールの作成はどのようなコードで行っていますか ダイアログリソースで指示となると アプリ自体がダイアログベースなんでしょうか
お礼
mobile5.0 poket PCです。 メイン画面はwindowでボタンから各ダイアログに飛ぶようにしてます。 CTEXT "***",IDC_S,5,25,150,15,SS_CENTERIMAGE このようにしましたが上に張り付きます。
- redfox63
- ベストアンサー率71% (1325/1856)
SS_CENTERIMAGEをスタイルに追加してださい
お礼
回答ありがとうございます。 SS_CENTERIMAGEでなぜかうまく行きません。 SS_LEFTにしても左に張り付きませんでした・・・ 言ってませんでしたがWindowsモバイルのアプリなんですが、 自動でフォントを調整する機能があるようです。 その辺が関係してるのでしょうか? CTEXT "位置出し",IDC_ICHI2_S,5,80,150,15,SS_CENTERIMAGE とダイアログリソース(拡張子が.rc)で記入しました。
お礼
回答ありがとうございます。 ダイアログ内にあるSTATICをサブクラス化しました。 どうにかコンパイルは通りましたが、下記の様に記述しダメでした・・・ただ白いSTATICが表示されます。 元々STATICに表示させてた文字列を削除してます。 ダイアログのコントロールの場合別の方法でしょうか? BOOL DlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { int i; switch(uMsg) { case WM_INITDIALOG: // ダイアログボックスが作成されたとき // 作成したボタンのウィンドウプロシージャのアドレスを取得しておく g_buttonWndProc = (WNDPROC)(LONG_PTR)GetWindowLong( hStatic, GWL_WNDPROC ); // サブクラス化されたウィンドウプロシージャのアドレスに書き換える SetWindowLong( hStatic, GWL_WNDPROC, (LONG)(LONG_PTR)DlgStaticProc ); return TRUE; } BOOL DlgStaticProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { RECT rt; switch( uMsg) { case WM_CTLCOLORSTATIC: hStatic = GetDlgItem(hDlg,IDC_ICHI_S);//ダイアログ内のコントロールハンドル取得 GetClientRect(hStatic,&rt);//コントロールの領域座標取得 DrawText((HDC)wParam,L"位置出し",-1,&rt,DT_SINGLELINE | DT_CENTER | DT_VCENTER);//テキスト描画 // サブクラスで処理しなかったメッセージは、本来のウィンドウプロシージャに処理してもらう return CallWindowProc( g_buttonWndProc, hDlg, uMsg, wParam, lParam ); } }