• 締切済み

エディットの文字サイズ変更

エディットボックスの文字サイズを変更する方法を教えてください。 HFONTを使う方法でやってみたけど、エディットのフォントは デフォルトのままで、フォントが変更されていないように見えました。 LRESULT CALLBACK WndProc( …  static HWND hEdit;  static HFONT hFont;  switch (msg) {  case WM_CREATE:   hEdit = CreateWindow( … );   hFont = CreateFont( … );   if(!hFont)エラー処理 …;   SendMessage(hEdit, WM_SETFONT, (WPARAM)hFont, 0);   break;  case WM_DESTROY:   DeleteObject(hFont);   PostQuitMessage(0);   break;

  • A__
  • お礼率59% (194/328)

みんなの回答

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

正しいフォントが作成できていないのでは? フォント名が間違っているとか。 次の処理でフォントが置き換わることを確認しました。 case WM_CREATE: hEdit = CreateWindow("EDIT", "Edit", WS_CHILD | WS_VISIBLE, 0,0,200,100, hWnd, (HMENU)1, hInst, NULL ); hFont = CreateFont( 100,0,0,0,0,0,0,0,SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_DONTCARE,"MS Pゴシック"); SendMessage( hEdit, WM_SETFONT, (WPARAM)hFont, 0); break; "MS"と"P"の間のスペースは半角です。

A__
質問者

お礼

フォントはきちんと作られているみたいです。  HFONT hFontOld;  hdc = BeginPaint(hWnd, &ps);  hFontOld = (HFONT)SelectObject(hdc, hFont);  TextOut(hdc, 0, 0, "a", 1);  SelectObject(hdc, hFontOld);  EndPaint(hWnd, &ps); ならフォントは変わりました。 それの前後でGetTextExtentPoint32()を使っても、フォントが変わっているのを 確認できたけど、エディットについてはGetTextExtentPoint32()を使っても フォントの変更はされていないみたいでした。 taka_tetsuさんは #include <iostream.h> main(){ char *buf = new char[100]; memset(buf, 0, 100); delete []buf; } がコンパイルできないみたいだから、結果が同じにならないこともあるみたいです。

A__
質問者

補足

実際のソースではエディットのハンドルを、隣のエディットと間違えていたことが分かりました。 それができなかった原因でした。 できました。 ありがとうございました。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

LPARAMをTRUEにしてもだめですか? SendMessage(hEdit, WM_SETFONT, (WPARAM)hFont, (LPARAM)TRUE);

A__
質問者

お礼

ありがとうございます。 LPARAM は再描画フラグだと思います。 WM_CREATEでは、まだhEditが表示されていないから再描画は 関係ないと思うけど、(LPARAM)TRUEをやってみました。 結果は、(LPARAM)0の時と同じでした。 PostMessage()もやってみたけど、結果は変わりませんでした。

  • mneko
  • ベストアンサー率33% (46/139)
回答No.1

Visual c++として答えます。 リソースのダイアログを開いて、ダイアログ全体を選択して、右クリック プロパティを開き、「フォント」ボタンをクリックしてサイズを変更してください。

関連するQ&A

  • TABによるフォーカス移動

    実行環境: Microsoft Visual Studio 2005 質問: TABによるフォーカス移動が行えません。どのようにソースを変更すれば宜しいか教えてください。 以下ソース //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { HINSTANCE main_inst; static HFONT main_hfont; main_inst = (HINSTANCE)GetWindowLong( hWnd, GWL_HINSTANCE ) ; static HWND hEdit1,hEdit2,hEdit3; switch (msg) { case WM_SETFOCUS: SetFocus(hEdit1); break; case WM_COMMAND: switch(LOWORD(wp)){ case ID_EDIT1: if(wp == VK_TAB) SetFocus(hEdit2); break; case ID_EDIT2: if(wp == VK_TAB) SetFocus(hEdit3); break; case ID_EDIT3: if(wp == VK_TAB) SetFocus(hEdit1); break; } case WM_CREATE: hEdit1 = CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("EDIT"),NULL,WS_CHILD|ES_NUMBER|WS_VISIBLE|ES_AUTOHSCROLL, 106, 89, 158, 34, hWnd, (HMENU)ID_EDIT1, main_inst, NULL ); hEdit2 = CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("EDIT"),NULL,WS_CHILD|ES_NUMBER|WS_VISIBLE|ES_NUMBER|ES_AUTOHSCROLL, 106, 143, 158, 34, hWnd, (HMENU)ID_EDIT2, main_inst, NULL ); hEdit3 = CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("EDIT"),NULL,WS_CHILD|ES_NUMBER|WS_VISIBLE|ES_AUTOHSCROLL, 106, 198, 158, 34, hWnd, (HMENU)ID_EDIT3, main_inst, NULL ); CreateWindow( TEXT("BUTTON"),TEXT("起動"),WS_CHILD|WS_VISIBLE|BS_MULTILINE|BS_CENTER, 89, 301, 112, 40, hWnd, (HMENU)ID_BUTTON, main_inst, NULL ); main_hfont = CreateFont( -19, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, FIXED_PITCH|FF_MODERN, TEXT("MS ゴシック") ); SendDlgItemMessage( hWnd, ID_EDIT1, WM_SETFONT, (WPARAM)main_hfont, MAKELPARAM(TRUE, 0) ); SendDlgItemMessage( hWnd, ID_EDIT2, WM_SETFONT, (WPARAM)main_hfont, MAKELPARAM(TRUE, 0) ); SendDlgItemMessage( hWnd, ID_EDIT3, WM_SETFONT, (WPARAM)main_hfont, MAKELPARAM(TRUE, 0) ); SendDlgItemMessage( hWnd, ID_BUTTON, WM_SETFONT, (WPARAM)main_hfont, MAKELPARAM(TRUE, 0) ); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; }

  • フォントの指定 猫でもわかるwindowsプログラミングより

    猫でもわかるwindowsプログラミングの本で勉強している学生なんですが、第2章の2.4フォントの指定のところでプログラムを打ち込んでコンパイルしたのですがなぜか識別子が見つかりませんというエラーがでてコンパイルできません。どなたかわかる方お願いします。 一応プログラム(CALLBACK関数と論理フォント作成の関数のみ)↓ //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){ static HFONT hFont1, hFont2, hFont3; PAINTSTRUCT ps; HDC hdc; char *szName1 = "○○"; char *szName2 = "▲▲"; switch (msg) { case WM_CREATE: hFont1 = MyCreateFont(40, SHIFTJIS_CHARSET, "HG行書体"); hFont2 = MyCreateFont(40, ANSI_CHARSET, "Fraktur JS"); hFont3 = MyCreateFont(40, SHIFTJIS_CHARSET, "MS 明朝"); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); SelectObject(hdc, hFont1); TextOut(hdc, 0, 0, (LPCTSTR)szName1, (int)strlen(szName1)); SelectObject(hdc, hFont2); TextOut(hdc, 0, 60, (LPCTSTR)szName2, (int)strlen(szName2)); SelectObject(hdc, hFont3); TextOut(hdc, 0, 120, (LPCTSTR)szName1, (int)strlen(szName1)); EndPaint(hWnd, &ps); break; case WM_DESTROY: DeleteObject(hFont1); DeleteObject(hFont2); DeleteObject(hFont3); PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } //論理フォントの作成 HFONT MyCreateFont(int nHeight, DWORD dwCharSet, LPCTSTR lpName){ return(CreateFont(nHeight, 0, 0, 0, FW_DONTCARE. FALSE, FALSE, FALSE, dwCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, lpName)); } エラー内容↓ MyCreateFontの識別子が見つかりません。 論理フォントの関数のFALSEの値が構文エラーで参照できない。

  • エディットコントロール入力時の背景色変更について

    Win32 APIについて質問です。(前回質問させてもらった続きです) Microsoft Visual Studio .NET 2002、XP、API 2つのエディットコントロール(hEdit_DatDelay、hEdit_DatDelay2) のことなんですが、2つのエディットコントロールは、「0」を入力し フォーカスを外すと、メッセージを表示し、背景色を赤色表示する。 その後「0」以外の値を入力しフォーカスを外すと、背景色が元の 白色に戻る仕様を予定しています。 次のコードのように作成すると、両方のエディットコントロールで、 「0」を入力しフォーカスを外すとメッセージは表示しますが、 背景色は白色のままとなります。 (3)、(4)の行をコメントアウトすると「hEdit_DatDelay」のみ赤色と なります。 (1)~(4)のあたりが何か問題があるのではと思っているのですが、 お手上げ状態です。 ご存じの方すいませんがご教授の程よろしくお願いします。 //・・・ switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); switch (wmId) { //・・・ case IDC_DAT_DELAY: //一つ目のエディットコントロール switch (wmEvent) { case EN_KILLFOCUS: GetWindowText(hEdit_DatDelay , DatDelay , 4); DatDelay_int = atoi(DatDelay); if(DatDelay_int == 0) { Bck_Red = 1; MessageBox(hWnd, (PCTSTR)Text, _T("ftp"), MB_OK); SetFocus(hEdit_DatDelay); break; }else{ Bck_Red = 3; //(1) InvalidateRect(hEdit_DatDelay, NULL, TRUE); //(2) break; } break ; } break; case IDC_DAT_DELAY2://二つ目のエディットコントロール switch (wmEvent) { case EN_KILLFOCUS: GetWindowText(hEdit_DatDelay2 , DatDelay2 , 4); DatDelay_int2 = atoi(DatDelay2); if(DatDelay_int2 == 0) { Bck_Red = 2; MessageBox(hWnd, (PCTSTR)Text, _T("ftp"), MB_OK); SetFocus(hEdit_DatDelay2); break; }else{ Bck_Red = 4; //(3) InvalidateRect(hEdit_DatDelay2, NULL, TRUE); //(4) break; } break ; } break; //・・・ case WM_INITDIALOG: //ブラシの作成 RedBrush = CreateSolidBrush(RGB(255,0,0));// 赤ブラシ ClearBrush = (HBRUSH)GetStockObject( NULL_BRUSH );//透明 break; case WM_CTLCOLOREDIT: { switch(Bck_Red) { case 1: if ((HWND)lParam == GetDlgItem(hWnd, IDC_DAT_DELAY)) { SetBkColor((HDC)wParam, RGB(255,0,0)); //背景を赤色 return (LRESULT)RedBrush; } break; case 2: if ((HWND)lParam == GetDlgItem(hWnd, IDC_DAT_DELAY2)) { SetBkColor((HDC)wParam, RGB(255,0,0)); //背景を赤色 return (LRESULT)RedBrush; } break; case 3: SetBkColor( (HDC)wParam, GetSysColor( COLOR_WINDOW ) ); return (LRESULT)ClearBrush; break; case 4: SetBkColor( (HDC)wParam, GetSysColor( COLOR_WINDOW ) ); return (LRESULT)ClearBrush; break; default: break; } } break;

  • Edit_SetTextでのフォント指定についての質問です。

    Edit_SetTextでのフォント指定についての質問です。 Windowsのプログラム作成で、hEdit = CreateWindow(。。。)で作ったウインドにEdit_SetText(hEdit, "文字")で文字を書く処理を作っておりますが、この文字のフォントを変えるのに苦戦しております。 ちなみに、hFont = CreateFont(20, 0, 0, 0, FW_BOLD, TRUE, TRUE, FALSE, SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS ,DEFAULT_QUALITY ,VARIABLE_PITCH | FF_ROMAN, "MS ゴシック"); SetWindowFont(hEdit, hFont, false); を試しましたが、フォントの高さの値は効いているのですがフォントが変わりません。 どなたか、ご存知の方おりましたらご教示お願いしたく、宜しくお願いします。

  • Win32APIでのエディットボックスの文字化け

    Win32APIでウィンドウズプログラムを組んでいます。 以下のコードで、エディットボックスへの文字列表示が文字化けします。 <エディットボックスの作成> hWndEdit = CreateWindowEx( WS_EX_CLIENTEDGE, _T("EDIT"), NULL, ES_LEFT | ES_AUTOHSCROLL | ES_MULTILINE | ES_READONLY | ES_AUTOHSCROLL | WS_TABSTOP | WS_VISIBLE | WS_CHILD, (int)(WINDOW_W * 0.01), 30, (int)(WINDOW_W * 0.8), (clientRect.bottom-clientRect.top) - 35, hWndMain, (HMENU)IDC_EDITLOG, hInstance, NULL ); <フォントの設定> HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); SendMessage( hWndEdit, WM_SETFONT, (WPARAM)hFont, TRUE ); <出力文字列の設定> std::ostringstream stream; stream << "************ Start TEST ************\n"; std::string strOut = stream.str(); <出力> SetWindowText( hWndEdit, (LPCTSTR)(strOut.c_str()) ); デバッガでの、strOutは、文字化けせずに表示されます。(strOut[0] が、'*'となっている) どこか確認したらよい場所をアドバイスいただけますか?

  • 不思議な現象が起こるプログラムで悩んでいます。

    よろしくお願いします。 不思議な現象が起こるプログラムで悩んでいます。 『猫でもわかる第2版』を参考にして、『メモ帳』を作成しているのですが、コンパイルして作られた メモ帳の動作を理解できません。 詳しい方、アドバイスをお願いします。 1、メニューを付けない『メモ帳』の時は、『直接入力、半角入力、全角入力』が可能、漢字変換も可能 問題点 1、メニューを付けない『メモ帳』の時、『コーディングしていないのに』右クリックでポップアップメニューが表示でき、切り取り、削除、貼り付け、その他が使える。 2,メニュー項目を付けると『直接入力が出来ない』、半角入力、全角入力は可能、但し、Enterキーを押すと、入力した文字が消えてしまう 3、コンパイルには、BCC, VC++の両方でテストしたが、結果は同じ /*ウィンドウプロシージャ*/ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id; RECT rc; static HWND hEdit; switch (msg){ case WM_CREATE: hEdit = CreateWindow("EDIT", NULL, WS_CHILD | WS_VISIBLE | ES_WANTRETURN | ES_MULTILINE | ES_AUTOVSCROLL | WS_VSCROLL, 0, 0, 0, 0, hWnd, (HMENU)ID_EDIT, hInst, NULL); strcat(szTitle, "「無題」"); SetWindowText(hWnd, szTitle); break; case WM_SIZE: MoveWindow(hEdit, 0, 0, LOWORD(lp), HIWORD(lp), TRUE); break; SetWindowText(GetParent(hEdit), "メモ帳[無題]"); case WM_SETFOCUS: SetFocus(hEdit); break; /*case WM_COMMAND: switch (LOWORD(wp)){ case IDM_NEW: MyNew(hEdit); break; } break;*/ case WM_CLOSE: id = MyConfirm(hEdit); if(id == IDCANCEL) break; id = MessageBox(hWnd, "終了してもいいですか", "確認", MB_YESNO | MB_ICONQUESTION); if(id == IDYES){ DestroyWindow(hEdit); DestroyWindow(hWnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } /*新規作成 int MyNew(HWND hEdit) { int id; id = MyConfirm(hEdit); if(id == IDCANCEL){ return -1; } Edit_SetText(hEdit, ""); SetWindowText(GetParent(hEdit), "メモ帳[無題]"); strcpy(szFile, ""); return 0; }*/ //文書保存の確認 int MyConfirm(HWND hEdit) { int id; if(SendMessage(hEdit, EM_GETMODIFY, 0, 0) == TRUE){ id = MessageBox(hEdit, "文書が更新されています。\n変更を保存しますか?", "メモ帳", MB_YESNOCANCEL | MB_ICONEXCLAMATION); if(id == IDYES){ MySaveAs(hEdit); }else if (id == IDCANCEL){ return IDCANCEL; }else if (id == IDNO){ return IDNO; } } return 0; }

  • エディットボックス内でキー押されたときのメッセージ

    VC++6.0です。 メインウインドウ内のエディットボックス(一行)で、特定のキー入力を検知したいのですが、どのようにすればよいでしょうか。 mfcは使ってません。 //ウインドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {  switch( message )  {   case WM_CREATE:    //エディットボックスを作成    CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT","",          WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL,          0,0,2000, 20, hWnd, (HMENU)IDC_EDIT, g_hInst, NULL );    break;   case WM_COMMAND:    //エディットボックス内の変更はEN_CHANGEで受け取れるが、    //キーコードは送られてこない    break;  } }

  • WindowsSDKのCALLBACK内について

    猫でも分かるWindowsSDKを参考にして、とりあえずウィンドウプロシージャの関数内を下のようにしてプログラムを組んでみました。 //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_CREATE: break; case WM_TIMER: break; case WM_PAINT: break; case WM_COMMAND: break; case WM_CLOSE: SendMessage(hWnd, WM_DESTROY, wp, lp); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0L; } しかし、これで何もないWindow表示をさせるとCPU使用率が80%くらいまで跳ね上がります。 調べてみたところcase WM_PAINT:を削ったらCPU使用率が下がりました。 普通にクライアント領域に文字を表示したり画像を表示したりするだけだったら、それほどCPU使用率が上がらないのに、上のようにあらかじめ用意しておいたらCPU使用率が跳ね上がるのは何故でしょうか。 まだ勉強したてでレベルの低い質問でしたらすみません。

  • 最初ボタンが見えない

    ボタンを大きく中央に表示するプログラムを作りました。 しかし中央をクリックするまでボタンが現れません。 どうしたら最初からボタンが現れるのでしょうか? またフォントをクリエイトし続けてリソースは尽きないのでしょうか? #include <windows.h> #include <stdio.h> HWND hB; LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP) { RECT rt; char s[99]; int W,H; static HFONT hF; switch(wM) { case WM_PAINT: GetClientRect(hW,&rt); W=rt.right-rt.left;H=rt.bottom-rt.top; DeleteObject(hF); hF=CreateFont(H/4,W/4,0,0,FW_NORMAL,FALSE,FALSE,FALSE,SHIFTJIS_CHARSET,OUT_TT_ONLY_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_MODERN,"MS Pゴシック"); SendMessage(hB,WM_SETFONT,(WPARAM)hF,1); MoveWindow(hB,W/4,H/4,W/2,H/2,1); sprintf(s,"幅=%d,高さ=%d",H,W);SetWindowText(hW,s); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return(DefWindowProc(hW,wM,wP,lP)); } } WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int) { WNDCLASS wc; --略--(ここにウィンドウクラスwcをクラス名"I"で登録) RegisterClass(&wc); hW=CreateWindow("I","ボタンの親",WS_OVERLAPPEDWINDOW,0,0,0,0,0,0,hI,0); hB=CreateWindow("BUTTON","子",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,0,0,0,0,hW,0,hI,0); ShowWindow(hW,SW_SHOWMAXIMIZED); UpdateWindow(hW); while(GetMessage(&ms,0,0,0)) { TranslateMessage(&ms); DispatchMessage(&ms); } return (ms.wParam); }

  • プロセスとか

    101 case WM_CLOSE: 102  id = MessageBox(hWnd,"終了する?","",MB_YESNO); 103  if(id == IDYES)DestroyWindow(hWnd); 104 break; 105 case WM_DESTROY: 106  PostQuitMessage(0); 107 break; 103行目が実行されたら、WM_DESTROY が発生します。 そしたらそのまま104、105、106行目が順に実行されるんですか? それとも、103が実行されたら104が実行される前に、 新しいプロセスで WM_DESTROY が入った WndProc( ) が 実行されて、それと同時に104が実行されて break で ループが終了するんですか?

専門家に質問してみよう