dポイントプレゼントキャンペーン実施中!

win32、VC++2005にて開発しております。

static文字が上に張り付いているのですが中央にしたい場合どうすればいいのでしょうか?
SS_CENTERだけだと中央に表示されますが上に張り付いてます。

文字のサイズも変更したいのですが分かりません。

非常に初歩的な質問で申し訳ありません。
よろしくお願いします。

A 回答 (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;
といった具合でしょう
    • good
    • 0

どうも Movileでは SS_CENTERIMAGEで垂直の中央寄せは無理なようです


# Windowsの方も 本来SS_BITMAP時の指定ですから
# テキストに対して指定すると 縦の中央寄せになるのは副産物ですし

方法としては Staticテキストをサブクラス化して
これのWindowProcコールバックでWM_PAINTを捕まえ
DrawTextで DT_SINGLELINE | DT_CENTER | DT_VCENTER を uFormatに与えて描画って方法かな

または、描画領域をDrawTextのuFormatにDT_CALCRECTを与えてlpRectに取り出して
余白分大きくしたlpRectでスタティックテキストをリサイズして
ベースのダイアログ内での表示位置を変えるとか
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

ダイアログ内にある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 );
}
}

お礼日時:2008/09/21 05:44

★アドバイス


 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 );

※文字サイズを動的に変更するにはフォントの作成/破棄を繰り返して切り替えます。
※文字サイズは変数にでも保存しておけば良いでしょう。(取得も可能だが保存して使う)
    • good
    • 0

プロジェクトのテンプレートって何を使ってるのでしょう?



コントロールの作成はどのようなコードで行っていますか
ダイアログリソースで指示となると アプリ自体がダイアログベースなんでしょうか
    • good
    • 0
この回答へのお礼

mobile5.0 poket PCです。

メイン画面はwindowでボタンから各ダイアログに飛ぶようにしてます。

CTEXT "***",IDC_S,5,25,150,15,SS_CENTERIMAGE
このようにしましたが上に張り付きます。

お礼日時:2008/09/20 19:26

SS_CENTERIMAGEをスタイルに追加してださい

    • good
    • 0
この回答へのお礼

回答ありがとうございます。

SS_CENTERIMAGEでなぜかうまく行きません。
SS_LEFTにしても左に張り付きませんでした・・・

言ってませんでしたがWindowsモバイルのアプリなんですが、
自動でフォントを調整する機能があるようです。
その辺が関係してるのでしょうか?

CTEXT "位置出し",IDC_ICHI2_S,5,80,150,15,SS_CENTERIMAGE
とダイアログリソース(拡張子が.rc)で記入しました。

お礼日時:2008/09/19 13:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています