Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Заблокирован
1

Непонятно с рисованием GDI

04.06.2013, 02:42. Просмотров 736. Ответов 4
Метки нет (Все метки)


Рисую матрицу 8х8 в окне. В порядке, обратном шахматному (сменить местами белые и черные диагонали) мне надо разбить клетки пополам с помощью штриховой линии. Но при этом перекрашиваются и границы клеток, которые я бы хотел оставить черными и сплошными. На первом скрине клетки такие, как должны быть, а на втором -- испорченные. Как исправить?
0
Миниатюры
Непонятно с рисованием GDI   Непонятно с рисованием GDI  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.06.2013, 02:42
Ответы с готовыми решениями:

Есть ли в WPF полноценная замена GDI+? Чтобы можно было всё, что можно в GDI+? Просто думаю углубляться в работу с изображениями в WPF или GDI.
Ну собственно весь вопрос в заголовке темы.

Проблема с рисованием.
Здравствуйте. Немного предыстории: пару недель назад я решил начать изучать с#, чтобы можно было...

Проблема с рисованием
Почему то на форме нет рисунка. Подскажите что не так. using System; using...

что то не то с рисованием(
Здравствуйте, появился такой вопрос. То есть его не было до того момента пока я не выложил...

4
Заблокирован
04.06.2013, 02:54  [ТС] 2
Рисование поля

Кликните здесь для просмотра всего текста
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
extern cell_data_t brd_matx[ BRD_ROWS ][ BRD_COLMN ];
 
static BOOL Line(HDC, int, int, int, int);
 
void draw_brd (HDC hdc, RECT * brd_rect) {
    
    HBRUSH hbrush_white;
    HBRUSH hbrush_black;
    HPEN wave_pen;
    int i, j; 
    
    hbrush_black = CreateSolidBrush(RGB(0, 0, 0));
    hbrush_white = CreateSolidBrush(RGB(255, 255, 255));
    wave_pen = CreatePen(PS_DASHDOT, 1, RGB(140, 140, 140));
    
    
    SelectObject(hdc, hbrush_black);
 
    //рисуем черную обводку всей области
    Rectangle(hdc,
        brd_rect->left, brd_rect->top, brd_rect->right, brd_rect->top + 3 );
    Rectangle(hdc,
        brd_rect->left, brd_rect->top, brd_rect->left + 3, brd_rect->bottom );
    Rectangle(hdc,
        brd_rect->left, brd_rect->bottom - 3, brd_rect->right, brd_rect->bottom);
    Rectangle(hdc,
        brd_rect->right - 3, brd_rect->top, brd_rect->right, brd_rect->bottom);
    
 
    // рисуем клетки
    SelectObject(hdc, hbrush_white);
 
    for (i = 0; i < BRD_ROWS; ++i) {
        for (j = 0; j < BRD_COLMN; ++j) {
            
            Rectangle(
                hdc, 
                brd_matx[i][j].coord.left,
                brd_matx[i][j].coord.top,
                brd_matx[i][j].coord.right,
                brd_matx[i][j].coord.bottom);
 
            if ( brd_matx[i][j].wave ) {
                SelectObject(hdc, wave_pen);
                Line(
                    hdc,
                    brd_matx[i][j].coord.left + brd_matx[i][j].width / 2,
                    brd_matx[i][j].coord.top + 2,
                    brd_matx[i][j].coord.left + brd_matx[i][j].width / 2,
                    brd_matx[i][j].coord.bottom - 2);
            }
            SelectObject(hdc, hbrush_white);
        } // end for
    }// end for
 
}
 
static BOOL Line(HDC hdc, int x1, int y1, int x2, int y2) 
{
    POINT lppoint;
    MoveToEx(hdc, x1, y1, &lppoint); //сделать текущими координаты x1, y1
    return LineTo(hdc, x2, y2); //нарисовать линию
}


Добавлено через 9 минут
В таком виде рисует как надо, но ... непорядочно же так писать
Кликните здесь для просмотра всего текста
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
extern cell_data_t brd_matx[ BRD_ROWS ][ BRD_COLMN ];
 
static BOOL Line(HDC, int, int, int, int);
 
void draw_brd (HDC hdc, RECT * brd_rect) {
    
    HBRUSH hbrush_white;
    HBRUSH hbrush_black;
    HPEN wave_pen;
    int i, j; 
    
    hbrush_black = CreateSolidBrush(RGB(0, 0, 0));
    hbrush_white = CreateSolidBrush(RGB(255, 255, 255));
    wave_pen = CreatePen(PS_DASHDOT, 1, RGB(140, 140, 140));
    
    
    SelectObject(hdc, hbrush_black);
 
    //рисуем черную обводку всей области
    Rectangle(hdc,
        brd_rect->left, brd_rect->top, brd_rect->right, brd_rect->top + 3 );
    Rectangle(hdc,
        brd_rect->left, brd_rect->top, brd_rect->left + 3, brd_rect->bottom );
    Rectangle(hdc,
        brd_rect->left, brd_rect->bottom - 3, brd_rect->right, brd_rect->bottom);
    Rectangle(hdc,
        brd_rect->right - 3, brd_rect->top, brd_rect->right, brd_rect->bottom);
    
 
    // рисуем клетки
    SelectObject(hdc, hbrush_white);
 
    for (i = 0; i < BRD_ROWS; ++i) {
        for (j = 0; j < BRD_COLMN; ++j) {
            
            Rectangle(
                hdc, 
                brd_matx[i][j].coord.left,
                brd_matx[i][j].coord.top,
                brd_matx[i][j].coord.right,
                brd_matx[i][j].coord.bottom);       
        } // end for
    }// end for
 
    SelectObject(hdc, wave_pen);
    for (i = 0; i < BRD_ROWS; ++i) {
        for (j = brd_matx[i][0].wave ? 0 : 1; j < BRD_COLMN; j += 2) {
            
            if ( brd_matx[i][j].wave ) {
                SelectObject(hdc, wave_pen);
                Line(
                    hdc,
                    brd_matx[i][j].coord.left + brd_matx[i][j].width / 2,
                    brd_matx[i][j].coord.top + 2,
                    brd_matx[i][j].coord.left + brd_matx[i][j].width / 2,
                    brd_matx[i][j].coord.bottom - 2);
            }
        } // end for
    }// end for
}
 
static BOOL Line(HDC hdc, int x1, int y1, int x2, int y2) 
{
    POINT lppoint;
    MoveToEx(hdc, x1, y1, &lppoint); //сделать текущими координаты x1, y1
    return LineTo(hdc, x2, y2); //нарисовать линию
}
0
Don't worry, be happy
16971 / 9852 / 1897
Регистрация: 27.09.2012
Сообщений: 24,429
Записей в блоге: 1
04.06.2013, 08:29 3
Ну во-первых, устраните утечки объектов GDI.
Во-вторых, приучите себя восстанавливать при завершении функции все перья,кисти, точки и т.д., которые Вы изменили в функции, ибо пути клиентские неисповедимы.
В третьих, всё что здесь рисуется:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    for (i = 0; i < BRD_ROWS; ++i) {
        for (j = 0; j < BRD_COLMN; ++j) {
            
            Rectangle(
                hdc, 
                brd_matx[i][j].coord.left,
                brd_matx[i][j].coord.top,
                brd_matx[i][j].coord.right,
                brd_matx[i][j].coord.bottom);
 
            if ( brd_matx[i][j].wave ) {
                SelectObject(hdc, wave_pen);
                Line(
                    hdc,
                    brd_matx[i][j].coord.left + brd_matx[i][j].width / 2,
                    brd_matx[i][j].coord.top + 2,
                    brd_matx[i][j].coord.left + brd_matx[i][j].width / 2,
                    brd_matx[i][j].coord.bottom - 2);
            }
            SelectObject(hdc, hbrush_white);
        } // end for
    }// end for
рисуется пером wave_pen в том числе и прямоугольники, а это перо имеет стиль PS_DASHDOT
1
Заблокирован
04.06.2013, 17:10  [ТС] 4
эмм, кэп, конечно спасибо, однако после вашего ответа вопросов еще больше:

Цитата Сообщение от Croessmah Посмотреть сообщение
утечки объектов GDI
можно подробней? с чем это едят.

Цитата Сообщение от Croessmah Посмотреть сообщение
восстанавливать при завершении функции все перья,кисти, точки и т.д., которые Вы изменили в функции
я бы и рад. Подскажите как это делается и зачем это надо делать

Цитата Сообщение от Croessmah Посмотреть сообщение
всё что здесь рисуется: рисуется пером wave_pen в том числе и прямоугольники, а это перо имеет стиль PS_DASHDOT
Ну я это и так вижу. Мне надо это устранить, для чего я в принципе и опубликовал пост.
0
Don't worry, be happy
16971 / 9852 / 1897
Регистрация: 27.09.2012
Сообщений: 24,429
Записей в блоге: 1
04.06.2013, 18:16 5
Цитата Сообщение от BAADF00D Посмотреть сообщение
Мне надо это устранить, для чего я в принципе и опубликовал пост.
Попробуйте как-то так:
C++
1
2
3
4
5
6
7
8
9
10
            if ( brd_matx[i][j].wave ) {
                HPEN hPen = (HPEN)SelectObject(hdc, wave_pen);
                Line(
                    hdc,
                    brd_matx[i][j].coord.left + brd_matx[i][j].width / 2,
                    brd_matx[i][j].coord.top + 2,
                    brd_matx[i][j].coord.left + brd_matx[i][j].width / 2,
                    brd_matx[i][j].coord.bottom - 2);
                    SelectObject(hdc, wave_pen);
            }
Добавлено через 2 минуты
Цитата Сообщение от BAADF00D Посмотреть сообщение
можно подробней? с чем это едят.
После каждого вызова данной функции будут создаваться перья и кисти, но они у Вас не удаляются, поэтому будет утечка ресурсов. В Windows установлен лимит объектов GDI. Как только этот лимит будет превышен программа упадет.

Добавлено через 1 минуту
Цитата Сообщение от BAADF00D Посмотреть сообщение
Подскажите как это делается
Сохраните старые значения. В конце функции восстановите их.

Добавлено через 4 минуты
Цитата Сообщение от BAADF00D Посмотреть сообщение
зачем это надо делать
ну а если я что-то рисую и у меня такая конструкция:
C++
1
2
3
4
//что-то рисуется(тут у меня свое перо, кисть, координаты начала рисования и т.д.)
//Ваша функция
//продолжаю рисовать(тут уже мои перья и кисти поменялись на те, которые создаются в Вашей фукнции. А оно мне врядли нужно
//Так что либо в документации необходимо описывать все изменения, которые делает функция, либо восстанавливать все как было.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.06.2013, 18:16

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Трудности с рисованием в Canvas
Рисую в Canvas`e квадрат и все вроде бы нормально, но когда я его перетаскиваю или начинаю вертеть...

Пoмогите разобраться с рисованием.
Помогите пожалуйста разобраться... Имею такой код: #include &lt;windows.h&gt; #include &quot;windowsx.h&quot;...

Проблема с рисованием на PictureBox с увеличением
Делаю графический редактор на подобии Paint.net ломаю голову не 1 ин год уже и вот надеюсь получю...

Проблема с рисованием прозрачных текстур в OpenGL
Сначала объявил все параметры: glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.