Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменить размер шрифта на BUTTON 
V
    Опции темы
ZufuS
Дата 18.7.2007, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Как изменить размер шрифта на окне класса BUTTON, который соответствует строке, полученной через второй параметр при создании его функцией CreateWindow и как эту строку изменить?
PM   Вверх
zkv
Дата 18.7.2007, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 12
Всего: 92



Цитата(ZufuS @  18.7.2007,  19:57 Найти цитируемый пост)
строку изменить? 

SetWindowText

Цитата(ZufuS @  18.7.2007,  19:57 Найти цитируемый пост)
Как изменить размер шрифта на окне класса BUTTON

думаю свой контрол придется делать, а в нем DrawItem и т.д. Смотри прикрепленную тему Coocky в этой ветке. Нет, в соседней (MFC)

Это сообщение отредактировал(а) zkv - 18.7.2007, 20:11
PM MAIL   Вверх
Santilka85
Дата 19.7.2007, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 202
Регистрация: 8.6.2007
Где: Новосибирск

Репутация: нет
Всего: 1



я не понял ГДе тебе надо шрифт менять, можно поподробнее...

Добавлено через 21 секунду
в заголовке что ли?

Добавлено через 36 секунд
или на батоне
--------------------
Снегоболотоходы WP8X8 всего за 480000 рублей и аксессуары к ним.
PM MAIL   Вверх
Pulse69
Дата 19.7.2007, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 28.4.2006
Где: Хабаровск

Репутация: 8
Всего: 10



Можно попробовать использовать сообщение WM_SETFONT.
Цитата

An application sends a WM_SETFONT message to specify the font that a control is to use when drawing text. 


--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
zkv
Дата 19.7.2007, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 12
Всего: 92



Цитата(Pulse69 @  19.7.2007,  09:00 Найти цитируемый пост)
Можно попробовать использовать сообщение WM_SETFONT

если будете пробовать, то потом скажите, что получилось, интересно smile
PM MAIL   Вверх
Pulse69
Дата 20.7.2007, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 28.4.2006
Где: Хабаровск

Репутация: 8
Всего: 10



Цитата(zkv @  19.7.2007,  14:06 Найти цитируемый пост)
если будете пробовать, то потом скажите, что получилось, интересно :)

Что-то я чувствую какой-то сарказм в этих словах :)

Если кнопка использует системный шрифт, тогда можно создать 
свой и установить его кнопке. Вот код (все проверки на ошибки опущены для простоты):
Код

        HWND hBtn = ::CreateWindowEx( 0,
            L"BUTTON",
            L"TestBtn",
            WS_VISIBLE|WS_CHILD,
            400,400,70,100,
            Handle(),
            (HMENU)ID_BTN,
            GetModuleHandle(0),
            NULL  );

        HFONT hFont = ::CreateFont( /*Нужный размер шрифта*/, 0, 0, 0, 
            FW_BOLD,
            FALSE, FALSE, FALSE, 
            DEFAULT_CHARSET,
            OUT_DEFAULT_PRECIS, 
            CLIP_DEFAULT_PRECIS, 
            DEFAULT_QUALITY, 
            DEFAULT_PITCH , 
            L"Verdana" );

        ::SendMessage( hBtn, WM_SETFONT, (WPARAM)hFont, (LPARAM)(MAKELONG(TRUE,0) ) );


В случае, если используется другой шрифт, можно получить его, выудить информацию,
и создать на его основе новый, но нужного размера. Примерно так (опять без проверок):
Код

        HWND hBtn = ::CreateWindowEx( 0,
            L"BUTTON",
            L"TestBtn",
            WS_VISIBLE|WS_CHILD,
            400,400,70,100,
            Handle(),
            (HMENU)ID_BTN,
            GetModuleHandle(0),
            NULL  );


        LOGFONT FontInfo;
        HFONT   hBtnFont = (HFONT)::SendMessage( hBtn, WM_GETFONT, 0, 0 );

       //  hBtnFont будет NULL если использвуется стандартный системный шрифт

        GetObject( hBtnFont, sizeof( LOGFONT ), (LPVOID)&FontInfo );

        //  Посмотрите какое Вам нужно значение: положительное или отрицательное
        FontInfo.lfHeight = /*Нужный размер шрифта*/;
        HFONT hFont = ::CreateFontIndirect( &FontInfo );

        ::SendMessage( hBtn, WM_SETFONT, (WPARAM)hFont, (LPARAM)(MAKELONG(TRUE,0) ) );




--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
ZufuS
Дата 27.7.2007, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Pulse69, спасибо, работает. Шрифт на кнопках у меня меняется при изменении размеров окна. Если ухватить за рамку и двигать мышью, через некоторое время окна приложений перестают перерисовываться (как называется это явление?). Также непонятно, почему у меня желаемый размер шрифта вычисляется правильно только в первый раз.
Код

// 15.cpp : Defines the entry point for the application.

#include "stdafx.h"
#include "15.h"

#define MAX_LOADSTRING 100
#define m 2000

HINSTANCE hInst;
TCHAR szTitle[MAX_LOADSTRING];
TCHAR szWindowClass[MAX_LOADSTRING];

HWND *hB, hWnd;
int n, c;
bool b, w;

ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK    hBProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

void SwapNumbers(int, int);
void NEW();
int pos(int);
int GetNumber(int);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    int i=0;
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    MSG msg;
    HACCEL hAccelTable;

    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_MY15, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY15));

    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style            = NULL;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra        = 0;
    wcex.cbWndExtra        = 0;
    wcex.hInstance        = hInstance;
    wcex.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY15));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground    = (HBRUSH)GetStockObject(GRAY_BRUSH);
    wcex.lpszMenuName    = MAKEINTRESOURCE(IDC_MY15);
    wcex.lpszClassName    = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassEx(&wcex);
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance;

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
              GetSystemMetrics(SM_CXSCREEN)/4, GetSystemMetrics(SM_CYSCREEN)/4-130,
              GetSystemMetrics(SM_CXSCREEN)/2, GetSystemMetrics(SM_CYSCREEN)/2+130,
              NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
   ::hWnd = hWnd;

   return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    RECT r, rb;

    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        default:
            if(wmId-m >= 0 && wmId-m < n*n && !w)
            {
                wmId -= m;
                int x = wmId%n;
                int y = wmId/n;

                for(int i=0; i<x; i++)
                    if(GetNumber(wmId-x+i)==n*n)
                        { SwapNumbers(wmId-x+i, wmId-x+i+1); c++; }
                for(int i=n-1; i>x; i--)
                    if(GetNumber(wmId-x+i)==(n*n))
                        { SwapNumbers(wmId-x+i, wmId-x+i-1); c++; }
                for(int i=0; i<y; i++)
                    if(GetNumber(x+i*n)==(n*n))
                        { SwapNumbers(x+i*n, x+i*n+n); c++; }
                for(int i=n-1; i>y; i--)
                    if(GetNumber(x+i*n)==(n*n))
                        { SwapNumbers(x+i*n, x+i*n-n); c++; }

                wchar_t wch[10];
                swprintf(wch, L"%d", c);
                SetWindowText(hWnd, wch);
                
                w=true;
                for(int i=0; i<n*n; i++)
                {
                    ShowWindow(hB[i], (GetNumber(i) == n*n)? false:true);
                    if(i<n*n-1) if(GetNumber(i)>GetNumber(i+1)) w=false;
                }
                if(w) MessageBox(hWnd, wch, L":)", MB_OK);
                break;
            }

            if(wmId >= ID_NEW_3X3 && wmId <= ID_NEW_14X14)
            {
                for(int i=0; i<n*n; i++) SendMessage(hB[i], WM_CLOSE, NULL, NULL);
                n = wmId-ID_NEW_3X3+3;
                NEW();
            }
            return DefWindowProc(hWnd, message, wParam, lParam);
        }        
        break;
    case WM_SIZE:
        if(!b) break;
        GetClientRect(hWnd, &r);
        GetWindowRect(hB[0], &rb);
        for(int i=0; i<n*n; i++)
        {
            MoveWindow(hB[i], (i%n)*(r.right)/n+0.5,
                              (i/n)*(r.bottom)/n+0.5,
                              (i%n+1)*(r.right)/n-(i%n)*(r.right)/n+0.5,
                              (i/n+1)*(r.bottom)/n-(i/n)*(r.bottom)/n+0.5,
                              true);
            HFONT hFont = CreateFont( rb.bottom/2, 0, 0, 0, 
            FW_NORMAL,
            FALSE, FALSE, FALSE, 
            DEFAULT_CHARSET,
            OUT_DEFAULT_PRECIS,
            CLIP_DEFAULT_PRECIS,
            DEFAULT_QUALITY,
            DEFAULT_PITCH,
            L"Arial" );
            SendMessage( hB[i], WM_SETFONT, (WPARAM)hFont, (LPARAM)(MAKELONG(TRUE,0) ) );
        }
        break;
    case WM_DESTROY:
        delete[] hB;
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

void SwapNumbers(int b1, int b2)
{
    if(b2<0 || b2>=n*n) return;
    wchar_t str1[4], str2[4];
    GetWindowText(hB[b1], str1, 4);
    GetWindowText(hB[b2], str2, 4);
    SetWindowText(hB[b1], str2);
    SetWindowText(hB[b2], str1);
}

int GetNumber(int i)
{
    wchar_t wch[4];
    GetWindowText(hB[i], wch, 4);
    return _wtoi(wch);
}

void NEW()
{    
    if(!b) delete[] hB;
    try {
        hB = new HWND[n*n];
    }
    catch(...) {
        MessageBox(hWnd, L"Не достаточно памяти :(", L"Error", MB_OK);
    }
    c=0;
    SetWindowText(hWnd, szTitle);
    wchar_t wch[4];
    for(int i=0; i<n*n; i++)
    {
       swprintf(wch, L"%d", i+1);
       hB[i] = CreateWindow(L"BUTTON", wch, WS_CHILD,
                    0, 0, 0, 0,    hWnd, (HMENU)(i+m),
                    hInst, NULL);       
    }
    b = true;
    w = false;
    SendMessage(hWnd, WM_SIZE, NULL, NULL);

    int nn, r;

    for(int c=0; c<n*1500; c++)
    {
        for(int i=0; i<n*n; i++)
        {
            if(GetNumber(i) == n*n)
            {
                nn = i;
                break;
            }
        }
        r = rand()%4;
        if     (r==0) r = -1;
        else if(r==2) r = -n;
        else if(r==3) r =  n;
        if((r==1 || r==-1) && (nn/n!=(nn+r)/n)) continue;
        SwapNumbers(nn, nn+r);
    }

    for(int i=0; i<n*n; i++)
    {
        ShowWindow(hB[i], (GetNumber(i) == n*n)? false:true);
    }
}


Это сообщение отредактировал(а) ZufuS - 27.7.2007, 05:43

Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  15.rar 43,32 Kb
PM   Вверх
Santilka85
Дата 27.7.2007, 06:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 202
Регистрация: 8.6.2007
Где: Новосибирск

Репутация: нет
Всего: 1



Цитата(ZufuS @  27.7.2007,  05:29 Найти цитируемый пост)
окна приложений перестают перерисовываться (как называется это явление?). 



если не ошибаюсь Repaint smile 

Это сообщение отредактировал(а) Santilka85 - 27.7.2007, 06:41
--------------------
Снегоболотоходы WP8X8 всего за 480000 рублей и аксессуары к ним.
PM MAIL   Вверх
Pulse69
Дата 27.7.2007, 07:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 28.4.2006
Где: Хабаровск

Репутация: 8
Всего: 10



Код

HFONT hFont = CreateFont( rb.bottom/2, 0, 0, 0, 
            FW_NORMAL,
            FALSE, FALSE, FALSE, 
            DEFAULT_CHARSET,
            OUT_DEFAULT_PRECIS,
            CLIP_DEFAULT_PRECIS,
            DEFAULT_QUALITY,
            DEFAULT_PITCH,
            L"Arial" );
SendMessage( hB[i], WM_SETFONT, (WPARAM)hFont, (LPARAM)(MAKELONG(TRUE,0) ) );


Объект hFont нужно удалить с помощью DeleteObject когда он больше не нужен.
Здесь при каждом изменении размера создаётся новый экземпляр => происходит утечка GDI-объектов, а это нехорошо.
Сохраняйте где-нибудь ранее созданный шрифт и удаляйте его перед
созданием нового. Должно помочь.

Насчёт размра шрифта тоже не очень понятно.
Может лучше в качестве высоты выбрать не координату нижней грани окна, а его высоту?
Можно сделать так 
Код

HFONT hFont = CreateFont( (rb.bottom-rb.top)/2, 0, 0, 0, 
....


--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
ZufuS
Дата 27.7.2007, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Код

// 15.cpp : Defines the entry point for the application.

#include "stdafx.h"
#include "15.h"

#define MAX_LOADSTRING 100
#define m 2000

HINSTANCE hInst;
TCHAR szTitle[MAX_LOADSTRING];
TCHAR szWindowClass[MAX_LOADSTRING];

HWND *hB, hWnd;
int n, c;
bool b, w;
HFONT hFont; //////

ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK    hBProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

void SwapNumbers(int, int);
void NEW();
int pos(int);
int GetNumber(int);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    int i=0;
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    MSG msg;
    HACCEL hAccelTable;

    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_MY15, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY15));

    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style            = NULL;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra        = 0;
    wcex.cbWndExtra        = 0;
    wcex.hInstance        = hInstance;
    wcex.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY15));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground    = (HBRUSH)GetStockObject(GRAY_BRUSH);
    wcex.lpszMenuName    = MAKEINTRESOURCE(IDC_MY15);
    wcex.lpszClassName    = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassEx(&wcex);
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;   
   hInst = hInstance;

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
              GetSystemMetrics(SM_CXSCREEN)/4, GetSystemMetrics(SM_CYSCREEN)/4-130,
              GetSystemMetrics(SM_CXSCREEN)/2, GetSystemMetrics(SM_CYSCREEN)/2+130,
              NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
   ::hWnd = hWnd;

   return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    RECT r, rb;

    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        default:
            if(wmId-m >= 0 && wmId-m < n*n && !w)
            {
                wmId -= m;
                int x = wmId%n;
                int y = wmId/n;

                for(int i=0; i<x; i++)
                    if(GetNumber(wmId-x+i)==n*n)
                        { SwapNumbers(wmId-x+i, wmId-x+i+1); c++; }
                for(int i=n-1; i>x; i--)
                    if(GetNumber(wmId-x+i)==(n*n))
                        { SwapNumbers(wmId-x+i, wmId-x+i-1); c++; }
                for(int i=0; i<y; i++)
                    if(GetNumber(x+i*n)==(n*n))
                        { SwapNumbers(x+i*n, x+i*n+n); c++; }
                for(int i=n-1; i>y; i--)
                    if(GetNumber(x+i*n)==(n*n))
                        { SwapNumbers(x+i*n, x+i*n-n); c++; }

                wchar_t wch[10];
                swprintf(wch, L"%d", c);
                SetWindowText(hWnd, wch);
                
                w=true;
                for(int i=0; i<n*n; i++)
                {
                    ShowWindow(hB[i], (GetNumber(i) == n*n)? false:true);
                    if(i<n*n-1) if(GetNumber(i)>GetNumber(i+1)) w=false;
                }
                if(w) MessageBox(hWnd, wch, L":)", MB_OK);
                break;
            }

            if(wmId >= ID_NEW_3X3 && wmId <= ID_NEW_14X14)
            {
                for(int i=0; i<n*n; i++) SendMessage(hB[i], WM_CLOSE, NULL, NULL);
                n = wmId-ID_NEW_3X3+3;
                NEW();
            }
            return DefWindowProc(hWnd, message, wParam, lParam);
        }        
        break;
    case WM_SIZE:
        if(!b) break;
        DeleteObject(hFont); //////
        GetClientRect(hWnd, &r);
        GetWindowRect(hB[0], &rb);
        for(int i=0; i<n*n; i++)
        {
            wParam = lParam = NULL;
            MoveWindow(hB[i], (i%n)*(r.right)/n+0.5,
                              (i/n)*(r.bottom)/n+0.5,
                              (i%n+1)*(r.right)/n-(i%n)*(r.right)/n+0.5,
                              (i/n+1)*(r.bottom)/n-(i/n)*(r.bottom)/n+0.5,
                              true);
            hFont = CreateFont( (rb.bottom-rb.top)/4, 0, 0, 0, 
            FW_NORMAL,
            FALSE, FALSE, FALSE, 
            DEFAULT_CHARSET,
            OUT_DEFAULT_PRECIS,
            CLIP_DEFAULT_PRECIS,
            DEFAULT_QUALITY,
            DEFAULT_PITCH,
            L"Arial" );
            SendMessage( hB[i], WM_SETFONT, (WPARAM)hFont, (LPARAM)(MAKELONG(TRUE,0) ) );            
        }        
        break;
    case WM_DESTROY:
        delete[] hB;
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

void SwapNumbers(int b1, int b2)
{
    if(b2<0 || b2>=n*n) return;
    wchar_t str1[4], str2[4];
    GetWindowText(hB[b1], str1, 4);
    GetWindowText(hB[b2], str2, 4);
    SetWindowText(hB[b1], str2);
    SetWindowText(hB[b2], str1);
}

int GetNumber(int i)
{
    wchar_t wch[4];
    GetWindowText(hB[i], wch, 4);
    return _wtoi(wch);
}

void NEW()
{    
    if(!b) delete[] hB;
    try {
        hB = new HWND[n*n];
    }
    catch(...) {
        MessageBox(hWnd, L"Не достаточно памяти :(", L"Error", MB_OK);
    }
    c=0;
    SetWindowText(hWnd, szTitle);
    wchar_t wch[4];
    for(int i=0; i<n*n; i++)
    {
       swprintf(wch, L"%d", i+1);
       hB[i] = CreateWindow(L"BUTTON", wch, WS_CHILD,
                    0, 0, 0, 0,    hWnd, (HMENU)(i+m),
                    hInst, NULL);       
    }
    b = true;
    w = false;
    SendMessage(hWnd, WM_SIZE, NULL, NULL);

    int nn, r;

    for(int c=0; c<n*500; c++)
    {
        for(int i=0; i<n*n; i++)
        {
            if(GetNumber(i) == n*n)
            {
                nn = i;
                break;
            }
        }
        r = rand()%4;
        if     (r==0) r = -1;
        else if(r==2) r = -n;
        else if(r==3) r =  n;
        if((r==1 || r==-1) && (nn/n!=(nn+r)/n)) continue;
        SwapNumbers(nn, nn+r);
    }

    for(int i=0; i<n*n; i++)
    {
        ShowWindow(hB[i], (GetNumber(i) == n*n)? false:true);
    }
}

Написал так, не помогло.
Цитата(Pulse69 @  27.7.2007,  08:06 Найти цитируемый пост)
HFONT hFont = CreateFont( (rb.bottom-rb.top)/2, 0, 0, 0, 

А это работает. Я думал, что bottom - это и есть высота, а не координата. Но тогда первый раз он вычисляется неправильно. Это происходит когда в функции NEW() вызывается SendMessage(hWnd, WM_SIZE, NULL, NULL).
PM   Вверх
ZufuS
Дата 27.7.2007, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Цитата(ZufuS @  27.7.2007,  13:30 Найти цитируемый пост)
 Но тогда первый раз он вычисляется неправильно. Это происходит когда в функции NEW() вызывается SendMessage(hWnd, WM_SIZE, NULL, NULL).

С этим разобрался.
PM   Вверх
ZufuS
Дата 11.8.2007, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



UP
PM   Вверх
586
Дата 11.8.2007, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



ZufuS, а что не получается?
PM   Вверх
ZufuS
Дата 11.8.2007, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Когда
Цитата(ZufuS @  27.7.2007,  06:29 Найти цитируемый пост)
Шрифт на кнопках у меня меняется при изменении размеров окна. Если ухватить за рамку и двигать мышью, через некоторое время окна приложений перестают перерисовываться

http://forum.vingrad.ru/act-Attach/type/post/id-1208386.html
PM   Вверх
586
Дата 11.8.2007, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



ого! прям все окна стали серые. У тебя утечка GDI ресурсов.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0815 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.