Изменить шрифт окна по умолчанию в проекте Windows Win32 - PullRequest
4 голосов
/ 22 мая 2010

Я создаю приложение с графическим интерфейсом, используя C и Win32 API. Я хотел бы знать, как мы можем изменить шрифт по умолчанию в главном окне на thaoma. Я пришел из .NET фона. В .NET, если мы изменим шрифт родительского элемента управления, автоматически дочерние элементы управления наследуют этот шрифт .... Есть ли что-то похожее на это или нам нужно вручную установить шрифт каждого элемента управления .....

Рассмотрим следующий код ...

#include <windows.h>

#define ID_EDIT 1
#define ID_BUTTON 2

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

  static HWND hwndEdit;
  static HWND hwndButton;
  static int len;
  static TCHAR text[30];


  switch(msg)
  {
    case WM_CREATE:
    hwndEdit = CreateWindow(TEXT("Edit"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER,
                50, 50, 150, 20, hwnd, (HMENU) ID_EDIT,
                NULL, NULL);

    hwndButton = CreateWindow(
        TEXT("button"), TEXT("Set Title"),       
        WS_VISIBLE | WS_CHILD,  
        50, 100, 80, 25,        
        hwnd, (HMENU) ID_BUTTON, NULL, NULL);      

    break;


    case WM_DESTROY:
        PostQuitMessage(0);
    break;
  }
  return DefWindowProc(hwnd, msg, wParam, lParam);
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
            LPSTR lpCmdLine, int nCmdShow )
{
  MSG  msg ;    
  WNDCLASS wc = {0};
  wc.lpszClassName = TEXT( "Edit Control" );
  wc.hInstance     = hInstance ;
  wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
  wc.lpfnWndProc   = WndProc ;
  wc.hCursor       = LoadCursor(0,IDC_ARROW);


  RegisterClass(&wc);
  CreateWindow( wc.lpszClassName, TEXT("Edit control"),
                WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                220, 220, 280, 200, 0, 0, hInstance, 0);  

  while( GetMessage(&msg, NULL, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  return (int) msg.wParam;
}

Как мне изменить шрифт кнопки, текстового поля в вышеуказанной программе ..

Пожалуйста, помогите мне здесь ....... и дайте мне знать общий процесс при кодировании в Win32 API ....

Спасибо заранее ..

Ответы [ 2 ]

5 голосов
/ 22 мая 2010

Возможно, вы пытаетесь создать диалоговое приложение с графическим интерфейсом, которое выглядит как приложение на основе форм в .NET. Вы можете определить шрифт для формы, и все ее дочерние элементы управления наследуют этот шрифт. Близкая ситуация существует и в каждом диалоге.

Как создать диалог с учетом Win32 API, вы можете прочитать здесь: http://msdn.microsoft.com/en-us/library/ms644996%28VS.85%29.aspx. Основное отличие в программировании диалога от создания форм заключается в том, что вы должны использовать редактор ресурсов (внутри Visual Studio или Windows). SDK например) для дизайна диалогов. Результаты будут сохранены в файле RC (еще не скомпилированный файл ресурсов). Результаты будут выглядеть следующим образом:

IDD_ABOUTBOX DIALOGEX 0, 0, 205, 98
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | 
    WS_SYSMENU
CAPTION "About"
FONT 8, "MS Shell Dlg 2", 400, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "OK",IDOK,77,77,50,14
    LTEXT           "Trust to User (T2U) v1.0\n\n(c) Copyright 2003, 2004",
                    IDC_STATIC,72,32,120,32
    ICON            IDR_MAINFRAME,IDC_STATIC,25,27,20,20
    GROUPBOX        "",IDC_STATIC,7,3,191,69
    LTEXT           "OK soft  GmbH",IDC_OK_SOFT_GMBH,72,16,120,8
END

Вы можете иметь более одного ресурса на разных языках, сохраненного в одном файле RC:

IDD_ABOUTBOX DIALOGEX 0, 0, 205, 98
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | 
    WS_SYSMENU
CAPTION "バージョンの情報"
FONT 8, "MS Shell Dlg 2", 400, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "OK",IDOK,77,77,50,14
    LTEXT           "Trust to User (T2U) v1.0\n\n(c) Copyright 2003, 2004",
                    IDC_STATIC,72,32,120,32
    ICON            IDR_MAINFRAME,IDC_STATIC,25,27,20,20
    GROUPBOX        "",IDC_STATIC,7,3,191,69
    LTEXT           "OK soft  GmbH",IDC_OK_SOFT_GMBH,72,16,120,8
END

Вы получите лучшие результаты в случае интернационализации, если будете использовать «MS Shell Dlg 2» или «MS Shell Dlg» вместо шрифта «Tahoma», но также возможно прямое использование «Tahoma»:

FONT 8, "Tahoma"

Вы должны использовать «MS Shell Dlg 2» вместе с флагом DS_SHELLFONT или комбинацией DS_FIXEDSYS и DS_SETFONT (см. http://blogs.msdn.com/oldnewthing/archive/2005/02/07/368423.aspx), которая следует за использованием «Tahoma» на большинстве компьютеров (проверьте значение «MS Shell Dlg 2» в разделе реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes). Прочтите об этом http://msdn.microsoft.com/en-us/library/dd374112%28v=VS.85%29.aspx или http://support.microsoft.com/kb/282187/en.

Кстати, вы можете открыть ресурс, сохраненный в EXE, DLL или EXE.MUI / DLL.MUI относительно Visual Studio. Вы должны просто открыть файл и выбрать «Открыть с помощью» и выбрать «Resoure Editor». В окне 7 вы можете найти C:\Windows\winsxs\x86_microsoft-windows-notepad и открыть как файл, например C:\Windows\winsxs\x86_microsoft-windows-notepad.resources_31bf3856ad364e35_6.1.7600.16385_en-us_1dbc2e35304db501\notepad.exe.mui. Затем вы можете сохранить файл как notepad.rc, затем открыть файл notepad.rc в текстовом редакторе en, ​​и вы найдете следующие фрагменты

15 DIALOGEX 30, 17, 300, 22
STYLE DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_CLIPSIBLINGS
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
    LTEXT           "&Encoding:",259,68,1,40,40,NOT WS_GROUP
    COMBOBOX        257,130,0,164,100,CBS_DROPDOWNLIST | WS_VSCROLL | WS_GROUP | WS_TABSTOP
END

51200 DIALOGEX 0, 0, 324, 140
STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_CAPTION
CAPTION "Software Licensing"
FONT 9, "Segoe UI", 0, 0, 0x0
BEGIN
    LTEXT           "To use this feature without interruption, this computer needs to be running genuine Windows.",-1,0,10,250,20
    LTEXT           "With genuine Windows you have access to all Windows updates and can be confident that your Windows software has the latest security and reliability enhancements from Microsoft.",-1,0,35,250,30
    CONTROL         51209,-1,"Static",SS_BITMAP,260,10,100,55
    CONTROL         "&Resolve online now",51201,"Button",BS_COMMANDLINK | BS_LEFT | WS_TABSTOP,0,75,250,24
    CONTROL         "<a>Read the privacy statement online</a>",51202,"SysLink",WS_TABSTOP,0,128,120,10
END

ОБНОВЛЕНО : попробуйте изменить функцию WndProc следующим образом:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  static HWND hwndEdit;
  static HWND hwndButton;
  static int len;
  static TCHAR text[30];
  HFONT hFont;
  LOGFONT lf;

  switch(msg)
  {
    case WM_CREATE:
    hwndEdit = CreateWindow(TEXT("Edit"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER,
                50, 50, 150, 20, hwnd, (HMENU) ID_EDIT,
                NULL, NULL);
    GetObject (GetStockObject(DEFAULT_GUI_FONT), sizeof(LOGFONT), &lf); 
    hFont = CreateFont (lf.lfHeight, lf.lfWidth, 
        lf.lfEscapement, lf.lfOrientation, lf.lfWeight, 
        lf.lfItalic, lf.lfUnderline, lf.lfStrikeOut, lf.lfCharSet, 
        lf.lfOutPrecision, lf.lfClipPrecision, lf.lfQuality, 
        lf.lfPitchAndFamily, lf.lfFaceName); 

    SendMessage (hwndEdit, WM_SETFONT, (WPARAM)hFont, TRUE);

    hwndButton = CreateWindow(
        TEXT("button"), TEXT("Set Title"),       
        WS_VISIBLE | WS_CHILD,  
        50, 100, 80, 25,        
        hwnd, (HMENU) ID_BUTTON, NULL, NULL);      

    SendMessage (hwndButton, WM_SETFONT, (WPARAM)hFont, TRUE);
    break;


    case WM_DESTROY:
        PostQuitMessage(0);
    break;
  }
  return DefWindowProc(hwnd, msg, wParam, lParam);
}
3 голосов
/ 19 января 2011

Вы можете установить шрифт окна, отправив ему сообщение WM_SETFONT:

HWND myButton = CreateWindowEx(/* ... */);
HFONT myFont  = /* ... load font from somewhere ... */

/* Change the button font. */
SendMessage(myButton, WM_SETFONT, WPARAM(myFont), TRUE);

Этот подход дает вам контроль за тем, какие шрифты вы используете, но вам нужно делать это только один раз для каждого окна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...