Форум программистов, компьютерный форум CyberForum.ru

Раскрасить прямоугольники исходя из условия - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
23.09.2011, 00:30     Раскрасить прямоугольники исходя из условия #1
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
          double x=2.5;//отступ от границы
          int y=20;
          const double a=x;
          RECT r[7*32];//массив прямоугольников
          int k=0;
          for(int i=0;i<7;i++)
          {
             for(int j=0;j<32;j++)
             {
                if (level1b[i][j]==2)
                {
                    hbr=CreateSolidBrush(GRAY_BRUSH);
                    r[k].top=x;
                    r[k].left=y;
                    r[k].right=x+20;
                    r[k].bottom=y+20;
                    FillRect(hdc,&r[k],hbr);
                    //DeleteBrush(hbr);
                }
                else if (level1b[i][j]==0)
                {
                    hbr=CreateSolidBrush(BLACK_BRUSH);
                    r[k].top=x;
                    r[k].left=y;
                    r[k].right=x+20;
                    r[k].bottom=y+20;
                    k++;
                    FillRect(hdc,&r[k],hbr);
                   // DeleteBrush(hbr);
                }
                else
                {
                    r[k].top=x;
                    r[k].left=y;
                    r[k].right=x+20;
                    r[k].bottom=y+20;
                    k++;
                }
                if (level1b[i][j]!=0 && level1b[i][j]!=2)
                Ellipse(hdc,x+10-2,y+10-2,x+10+2,y+10+2);
                x+=20;
             }
             y+=20;
             x=a;
          }
когда рисовались прямоугольники через Rectangle было все нормально и эллипсы были нормально расположены.
чтобы использовать FillRect я переделал из Rectangle в RECT. Создал массив прямоугольников.

есть такая матрица. Единицы должны не закрашиваться.
C++
1
2
3
4
5
6
7
8
int level1b[7][32]={
{0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
{0, 1, 0, 0, 0, 0, 1, 0, 1, 2, 1, 0, 1, 0, 1, 2, 2, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 2, 1, 0, 1, 0},
{0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 2, 2, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0},
{1, 1, 0, 1, 2, 2, 1, 0, 0, 0, 0, 0, 1, 0, 1, 2, 2, 1, 0, 1, 0, 1, 2, 2, 1, 0, 0, 0, 0, 0, 1, 1},
{0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0},
{0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 2, 2, 1, 0},
{0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0} };
1)как раскрасить не только черным и серым, а другими цветами?
2)вот что получается после выполнения программы
Миниатюры
Раскрасить прямоугольники исходя из условия  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
jonson
 Аватар для jonson
231 / 204 / 61
Регистрация: 18.03.2010
Сообщений: 749
23.09.2011, 01:14     Раскрасить прямоугольники исходя из условия #2
например создайте свою кисть
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
23.09.2011, 01:22     Раскрасить прямоугольники исходя из условия #3
Цитата Сообщение от Artishok Посмотреть сообщение
hbr=CreateSolidBrush(GRAY_BRUSH);
Artishok, так используй CreateSolidBrush( RGB(255, 0, 255))
RGB(255, 0, 0) - красный
RGB(0, 255, 0) - зелённый
RGB(0, 0, 255) - синий
RGB(255, 255, 0) - жёлтый
RGB(0, 255, 255) - голубой

....
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
23.09.2011, 14:07  [ТС]     Раскрасить прямоугольники исходя из условия #4
теперь все залило синим

Добавлено через 12 часов 24 минуты
.....
jonson
 Аватар для jonson
231 / 204 / 61
Регистрация: 18.03.2010
Сообщений: 749
23.09.2011, 15:07     Раскрасить прямоугольники исходя из условия #5
Цитата Сообщение от Artishok Посмотреть сообщение
теперь все залило синим
Добавлено через 12 часов 24 минуты
.....
Artishok, собственно, в чём проблема то?
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
23.09.2011, 15:34  [ТС]     Раскрасить прямоугольники исходя из условия #6
Проблема в том что заливает почему-то весь фон..и иногда почти весь фон цветом которые определен в условии ==0
jonson
 Аватар для jonson
231 / 204 / 61
Регистрация: 18.03.2010
Сообщений: 749
23.09.2011, 15:40     Раскрасить прямоугольники исходя из условия #7
Цитата Сообщение от Artishok Посмотреть сообщение
Проблема в том что заливает почему-то весь фон..и иногда почти весь фон цветом которые определен в условии ==0
код можно глянуть?
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
23.09.2011, 15:52  [ТС]     Раскрасить прямоугольники исходя из условия #8
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
#include <windows.h>
#include <WindowsX.h>
#include <tchar.h>
#include "resource.h"
 
int level1b[7][32]={
{0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
{0, 1, 0, 0, 0, 0, 1, 0, 1, 2, 1, 0, 1, 0, 1, 2, 2, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 2, 1, 0, 1, 0},
{0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 2, 2, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0},
{1, 1, 0, 1, 2, 2, 1, 0, 0, 0, 0, 0, 1, 0, 1, 2, 2, 1, 0, 1, 0, 1, 2, 2, 1, 0, 0, 0, 0, 0, 1, 1},
{0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0},
{0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 2, 2, 1, 0},
{0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0} };
 
BOOL RegClass(WNDPROC,LPCWSTR,UINT);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE hInst;
wchar_t szClass[]=L"Pacman";
 
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPevInstance,LPSTR lpszCmdLine,int nCmdShow)
{
    MSG msg;
    HWND hwnd;
    hInst=hInstance;
    if (!RegClass(WndProc,szClass,COLOR_WINDOW))
       return FALSE;
    hwnd=CreateWindow(szClass,szClass,WS_OVERLAPPEDWINDOW|WS_VISIBLE,10,10,660,240,0,0,hInst,NULL);
    if (!hwnd) return FALSE;
    while(GetMessage(&msg,0,0,0))DispatchMessage(&msg);
    return msg.wParam;
}
//регистрация классов
BOOL RegClass(WNDPROC Proc,LPCWSTR szName,UINT brBackground)
{
    WNDCLASS wc; 
    wc.style=CS_HREDRAW|CS_VREDRAW;
    wc.cbClsExtra=wc.cbWndExtra=0;
    wc.lpfnWndProc=Proc;
    wc.hInstance=hInst;
    wc.hIcon=LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_MYICON));
    wc.hCursor=LoadCursor(NULL,IDC_ARROW);
    wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+2);
    wc.lpszMenuName=NULL;
    wc.lpszClassName=szName;
    return (RegisterClass(&wc)!=0);
}
 
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    HBRUSH hbr;
    switch (msg)
    {
    case WM_PAINT:
       {
          PAINTSTRUCT ps;
          hdc=BeginPaint(hwnd,&ps);
          int x=2.5;//отступ от границы
          int y=20;
          const int a=x;
          RECT r[7*32];//массив прямоугольников
          int k=0;
          //SetPen
          for(int i=0;i<7;i++)
          {
             for(int j=0;j<32;j++)
             {
                if (level1b[i][j]==2)
                {
                    hbr=CreateSolidBrush(RGB(255,0,0));
                    //Rectangle(hdc,x,y,x+20,y+20);
                    r[k].top=x;
                    r[k].left=y;
                    r[k].right=x+20;
                    r[k].bottom=y+20;
                    FillRect(hdc,&r[k],hbr);
                    //DeleteBrush(hbr);*/
                }
                else if (level1b[i][j]==0)
                {
                    hbr=CreateSolidBrush(RGB(0,0,255));
                    //Rectangle(hdc,x,y,x+20,y+20);
                    r[k].top=x;
                    r[k].left=y;
                    r[k].right=x+20;
                    r[k].bottom=y+20;
                    k++;
                    FillRect(hdc,&r[k],hbr);
                   // DeleteBrush(hbr);*/
                }
                else
                {
                    r[k].top=x;
                    r[k].left=y;
                    r[k].right=x+20;
                    r[k].bottom=y+20;
                    k++;
                    hbr=CreateSolidBrush(RGB(0,0,0));
                    //Rectangle(hdc,x,y,x+20,y+20);
                }
                if (level1b[i][j]!=0 && level1b[i][j]!=2)
                Ellipse(hdc,x+10-2,y+10-2,x+10+2,y+10+2);
                x+=20;
             }
             y+=20;
             x=a;
          }
          EndPaint(hwnd,&ps);
          return 0;
       }
    case WM_DESTROY:
       {
          PostQuitMessage(0);
          return 0;
       }
    }
    return DefWindowProc(hwnd,msg,wParam,lParam);
}
jonson
 Аватар для jonson
231 / 204 / 61
Регистрация: 18.03.2010
Сообщений: 749
23.09.2011, 17:04     Раскрасить прямоугольники исходя из условия #9
Artishok, может я не совсем понял, ожидалось примерно такое?
Миниатюры
Раскрасить прямоугольники исходя из условия  
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
23.09.2011, 17:08  [ТС]     Раскрасить прямоугольники исходя из условия #10
Цитата Сообщение от jonson Посмотреть сообщение
Artishok, может я не совсем понял, ожидалось примерно такое?
именно(правда фон белый)
jonson
 Аватар для jonson
231 / 204 / 61
Регистрация: 18.03.2010
Сообщений: 749
23.09.2011, 17:16     Раскрасить прямоугольники исходя из условия #11
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
case WM_PAINT:
{
    PAINTSTRUCT ps;
    hdc=BeginPaint(hwnd,&ps);
    int x=3;//отступ от границы
    int y=20;
    const int a=x;
    RECT r[7*32];//массив прямоугольников
    int k=0;
    //SetPen        
           for(int i=0;i<7;i++)
    {
        for(int j=0;j<32;j++)
        {
            if (level1b[i][j]==2)
            {
                hbr=CreateSolidBrush(RGB(255,0,0));
                SelectObject(hdc, hbr);
                Rectangle(hdc,x,y,x+20,y+20);
                DeleteObject(hbr);
                DeleteBrush(hbr);
            }
            else if (level1b[i][j]==0)
            {
                hbr=CreateSolidBrush(RGB(0,0,255));
                SelectObject(hdc, hbr);
                Rectangle(hdc,x,y,x+20,y+20);
                DeleteObject(hbr);
                DeleteBrush(hbr);
            }
            else
            {
                hbr=CreateSolidBrush(RGB(0,0,0));
                SelectObject(hdc, hbr);
                Rectangle(hdc,x,y,x+20,y+20);
                DeleteObject(hbr);
                DeleteBrush(hbr);
            }
            if (level1b[i][j]!=0 && level1b[i][j]!=2)
            {
                hbr=CreateSolidBrush(RGB(0,255,0));
                SelectObject(hdc, hbr);
                Ellipse(hdc,x+10-2,y+10-2,x+10+2,y+10+2);
                DeleteObject(hbr);
                DeleteBrush(hbr);
            }   
                x+=20;
        }
        y+=20;
        x=a;
    }
                
    EndPaint(hwnd,&ps);
    return 0;
}
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
23.09.2011, 17:23  [ТС]     Раскрасить прямоугольники исходя из условия #12
но надо именно чтобы через RECT т.к. нужен будет доступ к отдельным элементом поля.
jonson
 Аватар для jonson
231 / 204 / 61
Регистрация: 18.03.2010
Сообщений: 749
23.09.2011, 18:39     Раскрасить прямоугольники исходя из условия #13
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
static RECT r[7*32];//массив прямоугольников
 
case WM_CREATE:
{
    int x=3;//отступ от границы
    int y=20;
    int k=0;
    const int a=x;
    for(int i=0;i<7;i++)
    {
        for(int j=0;j<32;j++)
        {
            SetRect(&r[k], x,y, x+20,y+20 );
            x+=20;
            k++;
        }
               y+=20;
        x=a;    
    }   
    break;
}
        
        
case WM_PAINT:
{
    PAINTSTRUCT ps;
    hdc=BeginPaint(hwnd,&ps);
    int x=3;//отступ от границы
    int y=20;
    const int a=x;
    int k=0;
    //SetPen                
    for(int i=0;i<7;i++)
    {
        for(int j=0;j<32;j++)
        {
            if (level1b[i][j]==2)
            {
                       hbr=CreateSolidBrush(RGB(255,0,0));
                SelectObject(hdc, hbr);
                Rectangle(hdc,r[k].left, r[k].top,   r[k].right,  r[k].bottom);
                DeleteObject(hbr);
                DeleteBrush(hbr);
                k++;
            }
            else if (level1b[i][j]==0)
            {
                hbr=CreateSolidBrush(RGB(0,0,255));
                SelectObject(hdc, hbr);
                       Rectangle(hdc,r[k].left, r[k].top,   r[k].right,  r[k].bottom);
                DeleteObject(hbr);
                DeleteBrush(hbr);
                k++;
            }
            else
            {
                hbr=CreateSolidBrush(RGB(0,0,0));
                SelectObject(hdc, hbr);
                Rectangle(hdc,r[k].left, r[k].top,   r[k].right,  r[k].bottom);
                DeleteObject(hbr);
                DeleteBrush(hbr);
                k++;
            }
            
                                 if (level1b[i][j]!=0 && level1b[i][j]!=2)
            {
                hbr=CreateSolidBrush(RGB(0,255,0));
                SelectObject(hdc, hbr);
                       Ellipse(hdc,x+10-2,y+10-2,x+10+2,y+10+2);
                DeleteObject(hbr);
                DeleteBrush(hbr);
            }       
            x+=20;
        }
        y+=20;
        x=a;
    }
            
    EndPaint(hwnd,&ps);
    return 0;
}
вообщето, если хочешь рисовать можешь используя FillRect.
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
23.09.2011, 21:48  [ТС]     Раскрасить прямоугольники исходя из условия #14
Цитата Сообщение от jonson Посмотреть сообщение
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
static RECT r[7*32];//массив прямоугольников
 
case WM_CREATE:
{
    int x=3;//отступ от границы
    int y=20;
    int k=0;
    const int a=x;
    for(int i=0;i<7;i++)
    {
        for(int j=0;j<32;j++)
        {
            SetRect(&r[k], x,y, x+20,y+20 );
            x+=20;
            k++;
        }
               y+=20;
        x=a;    
    }   
    break;
}
        
        
case WM_PAINT:
{
    PAINTSTRUCT ps;
    hdc=BeginPaint(hwnd,&ps);
    int x=3;//отступ от границы
    int y=20;
    const int a=x;
    int k=0;
    //SetPen                
    for(int i=0;i<7;i++)
    {
        for(int j=0;j<32;j++)
        {
            if (level1b[i][j]==2)
            {
                       hbr=CreateSolidBrush(RGB(255,0,0));
                SelectObject(hdc, hbr);
                Rectangle(hdc,r[k].left, r[k].top,   r[k].right,  r[k].bottom);
                DeleteObject(hbr);
                DeleteBrush(hbr);
                k++;
            }
            else if (level1b[i][j]==0)
            {
                hbr=CreateSolidBrush(RGB(0,0,255));
                SelectObject(hdc, hbr);
                       Rectangle(hdc,r[k].left, r[k].top,   r[k].right,  r[k].bottom);
                DeleteObject(hbr);
                DeleteBrush(hbr);
                k++;
            }
            else
            {
                hbr=CreateSolidBrush(RGB(0,0,0));
                SelectObject(hdc, hbr);
                Rectangle(hdc,r[k].left, r[k].top,   r[k].right,  r[k].bottom);
                DeleteObject(hbr);
                DeleteBrush(hbr);
                k++;
            }
            
                                 if (level1b[i][j]!=0 && level1b[i][j]!=2)
            {
                hbr=CreateSolidBrush(RGB(0,255,0));
                SelectObject(hdc, hbr);
                       Ellipse(hdc,x+10-2,y+10-2,x+10+2,y+10+2);
                DeleteObject(hbr);
                DeleteBrush(hbr);
            }       
            x+=20;
        }
        y+=20;
        x=a;
    }
            
    EndPaint(hwnd,&ps);
    return 0;
}
вообщето, если хочешь рисовать можешь используя FillRect.
Получается тут на нарисованном через setRect прямоугольнике рисуется еще один через rectangle?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2011, 02:52     Раскрасить прямоугольники исходя из условия
Еще ссылки по теме:

C++ Найти все прямоугольники заданной площади
C++ Определить, пересекаются ли прямоугольники, заданные координатами своих углов
Равновеликие прямоугольники C++

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

Или воспользуйтесь поиском по форуму:
jonson
 Аватар для jonson
231 / 204 / 61
Регистрация: 18.03.2010
Сообщений: 749
24.09.2011, 02:52     Раскрасить прямоугольники исходя из условия #15
Artishok, Функция SetRect только устанавливает координаты заданного прямоугольника, она ничего не рисует, т.е. до первого вызова WM_PAINT, все координаты уже подготовлены через WM_CREATE.
Yandex
Объявления
24.09.2011, 02:52     Раскрасить прямоугольники исходя из условия
Ответ Создать тему
Опции темы

Текущее время: 11:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru