Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
63 / 63 / 77
Регистрация: 22.11.2012
Сообщений: 241
Записей в блоге: 1

Обработкой регионов

11.07.2016, 14:09. Показов 2591. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток. Учу wiapi по книжке Петзольда. Пытаясь написать что-то похожее на то, что написано у него в теме "регионы", столкнулся с проблемой: если выбрать регион отсечения, то рисование на экране не происходит вовсе. Поиск в гугле особых результатов не дал, по нескольку раз(возможно, десятков) перечитал его код и свой, но ошибки так и не нашел, поэтому обращаюсь за Вашей помощью. Заранее спасибо. Ссылка на оригинальный код Петзольда, вдруг будет необходимость. ftp://ftp.charlespetzold.com/P... 4/CLOVER.C
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include "windows.h"
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR cmdString, int cmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
 
    WNDCLASSEX wc;
    HWND hWnd;
    MSG msg;
    CHAR CLASS_NAME[] = "CLASS_NAME";
 
    wc.cbClsExtra = 0;
    wc.cbSize = sizeof(wc);
    wc.cbWndExtra = 0;
    wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    wc.hInstance = hInstance;
    wc.lpfnWndProc = WndProc;
    wc.lpszClassName = CLASS_NAME;
    wc.lpszMenuName = NULL;
    wc.style = CS_HREDRAW | CS_VREDRAW;
 
    RegisterClassEx(&wc);
 
    hWnd = CreateWindow(CLASS_NAME, "Let's try regions!",
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        NULL, NULL, hInstance, NULL);
 
   ShowWindow(hWnd, cmdShow);
   UpdateWindow(hWnd);
 
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return (int) msg.wParam;
}
 
HRGN createCircleRegion(int x0, int y0, int r)
{
    int dr = (int) (r / 1.41);
 
    return CreateEllipticRgn(x0 - dr, y0 - dr, x0 + dr, y0 + dr);
}
 
void setCoordinateSystem(HDC hDC,
                         int xOrg, int yOrg,
                         int viewportExtX, int viewportExtY,
                         int windowExtX, int windowExtY)
{
    SetMapMode(hDC, MM_ANISOTROPIC);
    SetViewportExtEx(hDC, viewportExtX, viewportExtY, NULL);
    SetWindowExtEx(hDC, windowExtX, windowExtY, NULL);
    SetViewportOrgEx(hDC, xOrg, yOrg, NULL);
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    HRGN rgns[5];
    static HRGN clipRgn;
    int i, x, y;
    float deg;
    HDC hDC;
    PAINTSTRUCT ps;
    static int cxClient, cyClient, r;
 
    switch (msg)
    {
    case WM_SIZE :
        cxClient = LOWORD(lParam);
        cyClient = HIWORD(lParam);
        r = min(cxClient / 4, cyClient / 4);
 
        if (clipRgn)
            DeleteObject(clipRgn);
 
        rgns[0] = createCircleRegion(0, 0, r);
        rgns[1] = createCircleRegion(-r  * 3 / 4, 0, r / 2);
        rgns[2] = createCircleRegion(0, r * 3 / 4, r / 2);
        rgns[3] = createCircleRegion(r * 3 / 4, 0, r / 2);
        rgns[4] = createCircleRegion(0, -r * 3 / 4, r / 2);
        clipRgn = CreateRectRgn(0, 0, 1, 1);
 
        for (i = 0; i < 5; i++)
        {
            CombineRgn(clipRgn, clipRgn, rgns[i], RGN_OR);
            DeleteObject(rgns[i]);
        }
 
        return 0;
 
    case WM_PAINT :
        hDC = BeginPaint(hWnd, &ps);
 
        setCoordinateSystem(hDC, cxClient / 2, cyClient / 2, 1, 1, 1, -1);
        SelectClipRgn(hDC, clipRgn);
 
    
        for (deg = 0; deg < 360; deg+=5)
        {
            MoveToEx(hDC, 0, 0, NULL);
            x = (int) (r * cos(deg));
            y = (int) (r * sin(deg));
            LineTo(hDC, x, y);
        }
        MoveToEx(hDC, 0, 0 ,NULL);
        LineTo(hDC, 1000, 1000);
 
        EndPaint(hWnd, &ps);
         
        return 0;
 
    case WM_DESTROY :
        DeleteObject(clipRgn);
        PostQuitMessage(0);
        return 0;
    }
 
    return DefWindowProc(hWnd, msg, wParam, lParam);
}
Добавлено через 19 часов 16 минут
Неужели никто не может подсказать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.07.2016, 14:09
Ответы с готовыми решениями:

Проблема с обработкой сообщений
Задание на лабораторную: Разработать программу, которая создает три окна. Действия по сворачиванию и закрытию одного окна должны...

Проблемы с обработкой сообщений текстового поля
с++ WinAPI. Здравствуйте. Не могу найти\понять как работать со следующей ситуацией: у меня в диалоговом окне есть edit (текстовое...

Чтение из csv файла с обработкой данных
Есть файл вида: n,timestamp,latitude,longitude,speed 3439817,1519930809,54.9084609874777,56.076194964367,0.4 с записями о место...

4
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
11.07.2016, 20:00
Посмотри в отладчике что у тебя происходит в 98 строке. Функция CombineRgn возвращает ERROR, т.е. региона не создается. Может быть нельзя комбинировать регион и в него же записывать результат (т.е. clipRgn, clipRgn).
0
63 / 63 / 77
Регистрация: 22.11.2012
Сообщений: 241
Записей в блоге: 1
12.07.2016, 02:08  [ТС]
Спасибо, попробую. Так как если убрать SelectClipRgn и вызвать PaintRgn или FrameRgn, регион отображается на экране, то не думал в сторону ошибок создания. Вернее, думал, но попытки исправления создания региона не дали особых результатов, возможно, что-то не так делал.

Добавлено через 28 минут
Хм, у меня возвращается COMPLEXREGION как при SelectRgn, так и при CombineRgn.

Добавлено через 51 минуту
Если убрать код, изменяющий систему координат, то работает. Изучая msdn на тему регионов, возник вопрос. Для CreateEllipticRgn сказано, что "...specifies the x-coordinate in logical units...", а для SelectClipRgn, что "the SelectClipRgn function assumes that the coordinates for a region are specified in device units". Тогда в каком месте логические координаты региона переводятся в физические? И как правильно изменить систему координат в моем случае?
0
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
12.07.2016, 22:14
Ага, у меня тоже стало возвращать COMPLEXREGION
Видимо где-то не там поковырялся.

Цитата Сообщение от senich Посмотреть сообщение
в каком месте логические координаты региона переводятся в физические?
Про это тут немножко написано: Transformation of Coordinate Spaces. А здесь формула есть: Mapping Modes and Translations.

Добавлено через 4 минуты
В твоем случае я бы не стал преобразовывать систему координат. Пускай остается по умолчанию MM_TEXT.
Регион после создания можно просто подвинуть:
C++
1
OffsetRgn(clipRgn, cxClient / 2, cyClient / 2);
а в WM_PAINT'e
C++
1
2
3
4
5
6
7
        hDC = BeginPaint(hWnd, &ps);
 
        SelectClipRgn(hDC, clipRgn);
        SetViewportOrgEx(hDC, cxClient / 2, cyClient / 2, NULL);        
 
        for (deg = 0; deg < 360; deg+=5)
        // и т.д.
1
63 / 63 / 77
Регистрация: 22.11.2012
Сообщений: 241
Записей в блоге: 1
13.07.2016, 09:29  [ТС]
Спасибо, помогло!) Систему координат оставил Декартовой, только перенес регион с помощью OffsetRgn.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.07.2016, 09:29
Помогаю со студенческими работами здесь

Присваивание регионов
Домен присвоен к Региону. Если я добавлю субдомен, возможно его привязать к другому региону Федерации ?

присвоение регионов
Народ такой вопросец можно ли домену присобачить 2 региона одновременно(Питер, Москва)?Или есть вариант делать регион Россию и пробовать...

склейка регионов
Сегодня в очередной раз после жуткого АПа проверял позиции и обратил внимание на одну интересную вещь Мой сайт по трем фразам и после...

Справочники регионов и городов
Здравствуйте еще раз, не могу разобраться со справочниками регионов и городов, скажу больше не могу понять принцип реализации. То есть...

Захват регионов в Яндексе
Здравствуйте. Хотел бы спросить мнение людей более опытных, чем я. Задача такая. В России есть 50 городов, чье население превышает 500 тыс....


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK сделайте это, JDK, то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Перейдите по ссылке:. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru