Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 24.09.2021
Сообщений: 7

Равномерно выровнять элементы управления

02.10.2021, 03:03. Показов 1704. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Кнопки, текстовые поля, чекбоксы и др.

Принцип такой. Должна быть структура (таблица) для текущего окна. Состоящая из column-ов и благодаря определению максимальной ширины должно быть выравнивание
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct st_column
{
   int width;
   int lasty;
   void dovoid(){width=0; lasty=0;}
   void newp(int swidth, int sheight)
   {
      if(width<swidth) width=swidth;
      width=width+25;
      lasty=sheight+10;
   }
};
Потом при создании таблицы из элементов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct xy
{
   int x;
   int y;
}
struct st_table
{
   st_column *cols;
   init(int n) {cols=new st_column[n]; for (int i=0; i<n; i++) cols[i].dovoid();}
   xy getxy(int n, int w, int h)
   {
      xy ret;
      ret.y=cols[n].lasty;
      cols[n].newp(w, h);
      for (int i=0; i<n; i++) ret.x=cols[i].width+ret.x;
      return ret;
    }
Потом я хочу например создать текст в первом столбце
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
st_table stt;
//...
stt.init(6);//Текст, поле, текст, кнопка, чекбокс, текст
//...
xy temp;
temp=stt.getxy(0, 40, 10);
HWND hwnd1TextfromCol1 = CreateWindow(
            "STATIC",  
            "Text1",   
           WS_VISIBLE | WS_CHILD
           temp.x     
           temp.y,        
           40,        
           10,       
            hwnd,     
            NULL,       
            (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
            NULL);      
temp=stt.getxy(0, 40, 10);
HWND hwnd2TextfromCol1 = CreateWindow(
            "STATIC",  
            "Text2",   
           WS_VISIBLE | WS_CHILD
           temp.x     
           temp.y,        
           40,        
           10,       
            hwnd,     
            NULL,       
            (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
            NULL);      
temp=stt.getxy(0, 40, 10);
HWND hwnd3TextfromCol1 = CreateWindow(
            "STATIC",  
            "Text3",   
           WS_VISIBLE | WS_CHILD
           temp.x     
           temp.y,        
           40,        
           10,       
            hwnd,     
            NULL,       
            (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
            NULL);
Т.е. чтобы вручну не надо было считать, функцию вызвал и она автоматом вставила окно в нужное место (указав только столбец, ширину, высоту)
Мне надо это как-то упростить и довести до рабочего. (Тут не более чем не рабочее техзадание из урывков чужого кода это я об CreateWindow()) И главное я не додумался как сделать чтобы текст стоял ровно с полем (указание одинакового y, а что если не помещается текст в 1 строку и надо чуть отступить, получается надо создавать список координат сначала по тексту, потом создавать окна, не по порядку)
И хотелось бы автоматически определять width и height по шрифту
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.10.2021, 03:03
Ответы с готовыми решениями:

Выровнять блоки li равномерно
Подскжите как реализовать выравниваение. Есть следующее: Элемент ul .category-list ul { padding-left: 0px; text-align:...

Элементы управления для выбора из нескольких альтернатив. Создание элементов управления в программном коде
Здравствуйте! помогите!!! нужно:1. реализовать построитель предложений по типу «Студент получает знания». 2. GroupBox –...

Равномерно распределить элементы по ширине
Пытаюсь расположить 2 кнопки в ряд так, что бы они занимали ровно по половине экрана по ширине. Изначально все вроде шло хорошо, но на...

7
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,100
02.10.2021, 07:04
Цитата Сообщение от g9g Посмотреть сообщение
И хотелось бы автоматически определять width и height по шрифту
GetTextExtentPoint32

Добавлено через 48 секунд
если есть возможность, переходи на Qt , там такая задача решается на раз через компоновщик
1
0 / 0 / 0
Регистрация: 24.09.2021
Сообщений: 7
02.10.2021, 18:34  [ТС]
Алексей1153, скажите пожалуйста а откуда брать HDC?
Я нашел примеры
https://cpp.hotexamples.com/ex... mples.html
Там вначале создается окно, потом берется hdc, потом определяются размеры и вызывается MoveWindow
Я и не дочитал до конца
А можно ли сначала брать размеры, а потом создавать окно? Или тогда {создавать временное окно, удалять, создавать вновь}?
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,100
02.10.2021, 18:37
Цитата Сообщение от g9g Посмотреть сообщение
откуда брать HDC
с того окна, где будет выводиться текст (GetDC/ReleaseDC). Думаю, можно взять у родительского диалогового окна. Или вообще временно создать HWND
1
0 / 0 / 0
Регистрация: 24.09.2021
Сообщений: 7
02.10.2021, 19:09  [ТС]
не дошел пока что до исп. GetTextExtentPoint32()
Скомпилил это
twapi.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
struct st_column
{
   int width;
   int lasty;
   void dovoid(){width=0; lasty=0;}
   void newp(int swidth, int sheight)
   {
      if(width<swidth) width=swidth;
      width=width+25;
      lasty=sheight+10;
   }
};
 
struct xy
{
   int x;
   int y;
};
struct st_table
{
   st_column *cols;
   init(int n) {cols=new st_column[n]; for (int i=0; i<n; i++) cols[i].dovoid();}
   xy getxy(int n, int w, int h)
   {
      xy ret;
      ret.y=cols[n].lasty;
      cols[n].newp(w, h);
      for (int i=0; i<n; i++) ret.x=cols[i].width+ret.x;
      return ret;
    }
};
main.cpp (комменты из шаблона)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <windows.h>
#include "twapi.cpp"
st_table stt;
 
/* This is where all the input to the window goes to */
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
    switch(Message) {
        case WM_CREATE:
        {
            stt.init(6);
            xy temp;
            temp=stt.getxy(0, 40, 20);
            HWND hwnd1TextfromCol1 = CreateWindow(
                                        "STATIC",  
                                        "Text1",   
                                        WS_VISIBLE | WS_CHILD,
                                        temp.x,     
                                        temp.y,        
                                        40,        
                                        20,       
                                        hwnd,     
                                        (HMENU)1,
                                        NULL, NULL);      
            temp=stt.getxy(0, 40, 20);
            HWND hwnd2TextfromCol1 = CreateWindow(
                                        "STATIC",  
                                        "Text2",   
                                        WS_VISIBLE | WS_CHILD,
                                        temp.x,     
                                        temp.y,        
                                        40,        
                                        10,       
                                        hwnd,     
                                        (HMENU)1,
                                        NULL, NULL);      
            temp=stt.getxy(0, 40, 20);
            HWND hwnd3TextfromCol1 = CreateWindow(
                                        "STATIC",  
                                        "Text3",   
                                        WS_VISIBLE | WS_CHILD,
                                        temp.x,     
                                        temp.y,        
                                        40,        
                                        20,       
                                        hwnd,     
                                        (HMENU)1,
                                        NULL, NULL);
            break;
        }
        /* Upon destruction, tell the main thread to stop */
        case WM_DESTROY: {
            PostQuitMessage(0);
            break;
        }
        
        /* All other messages (a lot of them) are processed using default procedures */
        default:
            return DefWindowProc(hwnd, Message, wParam, lParam);
    }
    return 0;
}
 
/* The 'main' function of Win32 GUI programs: this is where execution starts */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    WNDCLASSEX wc; /* A properties struct of our window */
    HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */
    MSG msg; /* A temporary location for all messages */
 
    /* zero out the struct and set the stuff we want to modify */
    memset(&wc,0,sizeof(wc));
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.lpfnWndProc   = WndProc; /* This is where we will send messages to */
    wc.hInstance     = hInstance;
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    
    /* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszClassName = "WindowClass";
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */
 
    if(!RegisterClassEx(&wc)) {
        MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
        return 0;
    }
 
    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, /* x */
        CW_USEDEFAULT, /* y */
        640, /* width */
        480, /* height */
        NULL,NULL,hInstance,NULL);
 
    if(hwnd == NULL) {
        MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
        return 0;
    }
 
    /*
        This is the heart of our program where all input is processed and 
        sent to WndProc. Note that GetMessage blocks code flow until it receives something, so
        this loop will not produce unreasonably high CPU usage
    */
    while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */
        TranslateMessage(&msg); /* Translate key codes to chars if present */
        DispatchMessage(&msg); /* Send it to WndProc */
    }
    return msg.wParam;
}
Вывод:
Миниатюры
Равномерно выровнять элементы управления  
0
0 / 0 / 0
Регистрация: 24.09.2021
Сообщений: 7
02.10.2021, 19:09  [ТС]
*куда-то делся Text2
0
0 / 0 / 0
Регистрация: 24.09.2021
Сообщений: 7
02.10.2021, 19:28  [ТС]
Прошу прощение за мой флуд. Дальше я буду доделывать сам. Потому что для писателя кода доделка занимает меньше времени чем для помогающего Я там наделал кучу смысловых ошибок
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
struct st_column
{
   int width;
   int lastx;
   int lasty;
   void dovoid(){width=0; lasty=0;}
   void newp(int swidth, int sheight)
   {
      if(width<swidth) {width=swidth; width=width+25;}
      lasty=lasty+sheight;
   }
};
 
struct xy
{
   int x;
   int y;
};
struct st_table
{
   st_column *cols;
   init(int n) {cols=new st_column[n]; for (int i=0; i<n; i++) cols[i].dovoid();}
   xy getxy(int n, int w, int h)
   {
      xy ret;
      ret.y=cols[n].lasty;
      cols[n].newp(w, h);
      if(n>0) for (int i=0; i<n; i++) ret.x=cols[i].width+ret.x;
      else ret.x=0;
      return ret;
    }
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <windows.h>
#include "twapi.cpp"
st_table stt;
char* text=new char[20];
const char* ctext="Text";
/* This is where all the input to the window goes to */
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
    switch(Message) {
        case WM_CREATE:
        {
        
            stt.init(6);
            
            xy temp;
            for(int i=0; i<20; i++)
            {
            temp=stt.getxy(0, 40, 20);
            wsprintf(text, "%s%i", ctext, i);
            HWND hwnd1TextfromCol1 = CreateWindow(
                                        "STATIC",  
                                        text,   
                                        WS_VISIBLE | WS_CHILD,
                                        temp.x,     
                                        temp.y,        
                                        40,        
                                        20,       
                                        hwnd,     
                                        (HMENU)1,
                                        NULL, NULL); 
             }    
            
            break;
        }
        /* Upon destruction, tell the main thread to stop */
        case WM_DESTROY: {
            PostQuitMessage(0);
            break;
        }
        
        /* All other messages (a lot of them) are processed using default procedures */
        default:
            return DefWindowProc(hwnd, Message, wParam, lParam);
    }
    return 0;
}
 
/* The 'main' function of Win32 GUI programs: this is where execution starts */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    WNDCLASSEX wc; /* A properties struct of our window */
    HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */
    MSG msg; /* A temporary location for all messages */
 
    /* zero out the struct and set the stuff we want to modify */
    memset(&wc,0,sizeof(wc));
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.lpfnWndProc   = WndProc; /* This is where we will send messages to */
    wc.hInstance     = hInstance;
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    
    /* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszClassName = "WindowClass";
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */
 
    if(!RegisterClassEx(&wc)) {
        MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
        return 0;
    }
 
    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, /* x */
        CW_USEDEFAULT, /* y */
        640, /* width */
        480, /* height */
        NULL,NULL,hInstance,NULL);
 
    if(hwnd == NULL) {
        MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
        return 0;
    }
 
    /*
        This is the heart of our program where all input is processed and 
        sent to WndProc. Note that GetMessage blocks code flow until it receives something, so
        this loop will not produce unreasonably high CPU usage
    */
    while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */
        TranslateMessage(&msg); /* Translate key codes to chars if present */
        DispatchMessage(&msg); /* Send it to WndProc */
    }
    return msg.wParam;
}
P>S. Теперь осталось только заюзать GetTextExtentPoint32() и можно сделать какой то калькулятор
Миниатюры
Равномерно выровнять элементы управления  
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,100
02.10.2021, 19:45
g9g, отладчик и OutputDebugString в помощь

Добавлено через 1 минуту
цифру туда можно отправить так std::to_string(N).c_str()

Добавлено через 14 минут
[/INLINE]
Цитата Сообщение от g9g Посмотреть сообщение
struct st_column
....
....
код какой-то кривенький, вот так покрасивше будет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <string> 
#include <vector> 
 
struct st_column
{
   int width{};
   int lastx{};
   int lasty{};
 
   void newp(int swidth, int sheight)
   {
      if(width<swidth)
      {
          width=swidth;
          width=width+25;
      }
      lasty=lasty+sheight;
   }
};
 
struct xy
{
   int x{};
   int y{};
};
 
struct st_table
{
    std::vector<st_column> cols;
    
    void init(const size_t n)
    {
        cols.resize(n);
    }
 
    xy getxy(const size_t n, const int w, const int h)
    {
        xy ret;
        if(n>=cols.size() || n==0)
        {
            return ret;
        }
 
        ret.y=cols[n].lasty;
        cols[n].newp(w, h);
 
        for(const auto& i:cols)
        {
            ret.x+=i.width;
        }
        return ret;
    }
};
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.10.2021, 19:45
Помогаю со студенческими работами здесь

Сформировать матрицу элементы из равномерно распределенных случайных чисел
3. Сформировать матрицу B(m, n), элементами которой являются случайные числа, равномерно распределенные в интервале . Переставляя ее строки...

Подскажите как равномерно разместить элементы li и отцентрировать их по вертикале на примере ниже
Подскажите как равномерно разместить элементы li и отцентрировать их по вертикале на примере ниже. Пример: &lt;div...

Выровнять элементы
Как сделать так, чтобы было ровно инпут со стрелкой. при уменьшении окна браузера (ctrl-) создается впечатление , что стрелки меньше. ...

Как сделать чтобы панели элементов управления находились "элементы управления" нужного формата?
По умолчанию формат &quot;элемента управления&quot; &quot;Поле&quot;: высота - 0,556 см; ширина - 3,0 см; шрифт - 11. Как сделать чтобы по...

Элементы управления, созданные в одном потоке, не могут быть родительскими для элемента управления в другом потоке
Привет :) Есть задача - нужно динамически добавлять компоненты. Все работает хорошо. Но если добавлять через цикл то начинает зависать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru