Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633

Необработанное исключение по адресу

21.03.2023, 16:46. Показов 6217. Ответов 50
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Мне нужно сделать следующее: На диалоговой панели расположить временное окно. В центре этого окна нарисовать мишень из 10 полей и в каждом поле вывести его значение (от 1 до 10). Поля выделять различными цветами, выбранными с помощью стандартной диалоговой панели выбора цвета.

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

Но при запуске стандартной диалоговая панель выбора цвета вылетает ошибка, причём ошибка указывает на функцию DialogBoxIndirect(), ошибка такая:
Вызвано исключение по адресу 0x76F66EB1 (comdlg32.dll) в Ex6_10.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00000000.
Что вообще происходит?

Код:
CreateDlg
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
int CreateDlg(HWND hwnd)
{
    const TCHAR szCaption[] = TEXT("TARGET...");
 
    WORD* p, * pdlgTempl;
    p = pdlgTempl = (LPWORD)LocalAlloc(LPTR, 1024);
    if (!p)
    {
        MessageBox(NULL, TEXT("Can't allocated memory"),
            TEXT("Error"), MB_OK);
        return 1;
    }
    int cxChar, cyChar;
    {
        TEXTMETRIC tm;
        HDC hdc = GetDC(hwnd);
        GetTextMetrics(hdc, &tm);
        ReleaseDC(hwnd, hdc);
        cxChar = tm.tmAveCharWidth + 1;
        cyChar = tm.tmHeight + tm.tmExternalLeading;
    }
    DWORD dwBaseUnit = GetDialogBaseUnits();
    cxChar = cxChar * 4 / LOWORD(dwBaseUnit);
    cyChar = cyChar * 8 / HIWORD(dwBaseUnit);
 
    DWORD lStyle = DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION;
    int wDlg, hDlg, cxWnd, cyWnd, left, top;
    wDlg = 320;
    hDlg = 240;
    RECT rc;
    GetClientRect(hwnd, &rc);
    left = ((rc.right * 4 / LOWORD(dwBaseUnit)) >> 1) - (wDlg >> 1);
    top = ((rc.bottom * 8 / HIWORD(dwBaseUnit)) >> 1) - (hDlg >> 1);
 
    LPDLGTEMPLATE lpdt;
    LPDLGITEMTEMPLATE lpdit;
    LPWSTR szDst;
    LPCWSTR szSrc;
    lpdt = (LPDLGTEMPLATE)p;
    lpdt->style = lStyle;
    lpdt->dwExtendedStyle = 0;
    lpdt->cdit = 1;
    lpdt->x = left;
    lpdt->y = top;
    lpdt->cx = wDlg;
    lpdt->cy = hDlg;
    p = (LPWORD)(lpdt + 1);
    *p++ = 0;
    *p++ = 0;
    szDst = (LPWSTR)(p);
    szSrc = szCaption;
    for (; *szDst++ = *szSrc++;)
        ;
    p = (LPWORD)szDst;
    p = lpwAlign((LPWORD)p);
 
    //1
    left = 10;
    top = 10;
    cxWnd = wDlg - 20;
    cyWnd = hDlg - 20;
    lStyle = WS_CHILD | WS_VISIBLE | WS_CHILDWINDOW | WS_BORDER | WS_DLGFRAME;
 
    lpdit = (LPDLGITEMTEMPLATE)p;
    lpdit->style = lStyle;
    lpdit->dwExtendedStyle = 0;
    lpdit->x = left;
    lpdit->y = top;
    lpdit->cx = cxWnd;
    lpdit->cy = cyWnd;
    lpdit->id = ID_POPUPWINDOW;
    szDst = (LPWSTR)(lpdit + 1);
    szSrc = szPopupClass;
    for (; *szDst++ = *szSrc++;)
        ;
    szSrc = TEXT("\0");
    for (; *szDst++ = *szSrc++;)
        ;
    p = (LPWORD)szDst;
    *p++ = 0;
    p = lpwAlign((LPWORD)p);
 
    int ret;
//Когда пытаюсь открыть стандартную диалоговую панель выбора цвета, попадаю сюда,
//с ошибкой "Вызвано исключение по адресу 0x76F66EB1 (comdlg32.dll) в Ex6_10.exe: //0xC0000005: нарушение прав доступа при чтении по адресу 0x00000000."
 
    ret = DialogBoxIndirect(hInstance, (LPCDLGTEMPLATE)pdlgTempl,
        hwnd, (DLGPROC)DlgProc);
    if (ret == -1)
        DWORD er = GetLastError();
    LocalFree(LocalHandle(pdlgTempl));
 
    return ret;
}


WndProc,DlgProc
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
LRESULT CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HWND hPop;
    switch (msg)
    {
        case WM_INITDIALOG:
        {
            hPop = GetDlgItem(hDlg, ID_POPUPWINDOW);
            return TRUE;
        }
        case WM_COMMAND:
        {
            switch (LOWORD(wParam))
            {
                case IDCANCEL:
                {
                    EndDialog(hDlg, TRUE);
                    return TRUE;
                }
                default:
                    break;
            }
        }
    }
    return FALSE;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HMENU hMainMenu, hPopMenu;
    static MENUITEMINFO mii;
    switch (msg)
    {
    case WM_CREATE:
    {
        hMainMenu = CreateMenu();
        hPopMenu = CreatePopupMenu();
        SetMenu(hwnd, hMainMenu);
        mii.cbSize = sizeof(mii);
        mii.fMask = MIIM_TYPE | MIIM_STATE | MIIM_ID | MIIM_SUBMENU;
        mii.fType = MFT_STRING;
        mii.fState = MFS_ENABLED;
        mii.wID = CM_TARGET_OPEN;
        mii.hSubMenu = NULL;
        mii.dwTypeData = (LPTSTR)TEXT("Open target");
        mii.cch = _tcslen(TEXT("Open target"));
 
        InsertMenuItem(hPopMenu, CM_TARGET_OPEN, FALSE, &mii);
 
        mii.fType = MFT_SEPARATOR;
        mii.fState = MFS_ENABLED;
        mii.wID = 0;
        mii.hSubMenu = NULL;
        mii.dwTypeData = (LPTSTR)NULL;
        mii.cch = 0;
        InsertMenuItem(hPopMenu, 0, FALSE, &mii);
 
        mii.fType = MFT_STRING;
        mii.fState = MFS_ENABLED;
        mii.wID = CM_TARGET_QUIT;
        mii.hSubMenu = NULL;
        mii.dwTypeData = (LPTSTR)TEXT("Exit");
        mii.cch = _tcslen(TEXT("Exit"));
        InsertMenuItem(hPopMenu, CM_TARGET_QUIT, FALSE, &mii);
 
        mii.fType = MFT_STRING;
        mii.fState = MFS_ENABLED;
        mii.wID = 0;
        mii.hSubMenu = hPopMenu;
        mii.dwTypeData = (LPTSTR)TEXT("TARGET");
        mii.cch = _tcslen(TEXT("TARGET"));
        InsertMenuItem(hMainMenu, 0, TRUE, &mii);
 
        DrawMenuBar(hwnd);
 
        return 0;
    }
    case WM_COMMAND:
    {
        switch (LOWORD(wParam))
        {
        case CM_TARGET_OPEN:
        {
            CreateDlg(hwnd);
            return 0;
        }
        case CM_TARGET_QUIT:
        {
            DestroyWindow(hwnd);
            return 0;
        }
        }
        return 0;
    }
    case WM_DESTROY:
    {
        PostQuitMessage(0);
        return 0;
    }
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}


PopProc
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
LRESULT CALLBACK PopProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static int cxClient, cyClient;
    static HRGN hRgn[10];
    static RECT rcRgn[10];
    static HPEN hPen, hOldPen;
    const int indent = 0;
    static int radius, rad;
    static COLORREF lpCustColors[16], rgbResult = RGB(255, 255, 255);
    static COLORREF crCellTarget[10]; //Здесь цвет для каждого поля мишени
    static CHOOSECOLOR cc;
    static POINT ptCenter;
 
    switch (msg)
    {
    case WM_CREATE:
    {
        ZeroMemory(&cc, sizeof(CHOOSECOLOR));
        cc.lStructSize = sizeof(cc);
        cc.hwndOwner = hwnd;
        cc.hInstance = NULL;
        cc.rgbResult = rgbResult;
        cc.Flags = CC_ANYCOLOR | CC_RGBINIT;
 
        for (int i = 0; i < 10; ++i)
        {
            //hRgn[i] = CreateEllipticRgn(0, 0, 0, 0);
            crCellTarget[i] = GetClassLong(hwnd, GCL_HBRBACKGROUND);
        }
        return 0;
    }
    case WM_SIZE:
    {
        cxClient = LOWORD(lParam);
        cyClient = HIWORD(lParam);
        int d = (cxClient > cyClient) ? cyClient : cxClient;
        rad = radius = (d >> 1);
        rad /= 10; //Значение промежутка между эллипсами(или регионами, как удобнее).
        ptCenter.x = (cxClient >> 1);
        ptCenter.y = (cyClient >> 1);
 
        int l = (cxClient >> 1) - (d >> 1);
        int t = indent;
        int r = (cxClient >> 1) + (d >> 1);
        int b = cyClient - indent;
        for (int i = 0; i < 10; ++i)
        {
            SetRect(&rcRgn[i], l, t, r, b);
            hRgn[i] = CreateEllipticRgn(l, t, r, b);
            l += rad;
            t += rad;
            r -= rad;
            b -= rad;
        }
        return 0;
    }
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);
 
        int OldBk = SetBkMode(hdc, TRANSPARENT);
        //int OldBkColor = SetBkColor(hdc, crColorRgn);
        hPen = CreatePen(PS_SOLID, 2, RGB(0, 0, 0));
        hOldPen = (HPEN)SelectObject(hdc, hPen);
        TCHAR szNum = '1';
        HBRUSH hBrush, hOldBrush;
        for (int i = 0; i < 10; ++i)
        {
            Ellipse(hdc, rcRgn[i].left, rcRgn[i].top,
                rcRgn[i].right, rcRgn[i].bottom);
            
            int OldAlign = SetTextAlign(hdc, TA_CENTER);
//Если это последняя ячейка-поле, то нужно сместить rad так чтобы 10-как была по середине 
//последнего эллипса. 
            if (i == 9)
                TextOut(hdc, rcRgn[i].left + rad,
                    ptCenter.y, (LPCTSTR)szNums[i], 2);
            else
            {
                TextOut(hdc, rcRgn[i].left + (rad >> 1),
                    ptCenter.y, (LPCTSTR)szNums[i], 1);
                TextOut(hdc, rcRgn[i].right - (rad >> 1),
                    ptCenter.y, (LPCTSTR)szNums[i], 1);
            }
 
            SetTextAlign(hdc, OldAlign);
        }
        for (int i = 0; i < 10; ++i)
        {
            hBrush = CreateSolidBrush(crCellTarget[i]);
            hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);
 
            /*ExtFloodFill(hdc, (rcRgn[i].right >> 1),
                rcRgn[i].top + (rad >> 1),
                RGB(0, 0, 0), FLOODFILLBORDER);*/
 
            SelectObject(hdc, hOldBrush);
            DeleteObject(hBrush);
        }
        SetBkMode(hdc, OldBk);
        //SetBkColor(hdc, OldBkColor);
        SelectObject(hdc, hOldPen);
 
 
        EndPaint(hwnd, &ps);
        return 0;
    }
    case WM_LBUTTONDOWN:
    {
        int x = LOWORD(lParam);
        int y = HIWORD(lParam);
        int iMaxRad = radius;
        int iMinRad = iMaxRad - rad;
 
        int iPowMaxRad = iMaxRad * iMaxRad;
        int iPowMinRad = iMinRad * iMinRad;
        x -= ptCenter.x;
        y -= ptCenter.y;
        int i;
        int len = x * x + y * y;
        for (i = 0; i < 10; ++i)
        {
            if (len >= iPowMinRad && len <= iPowMaxRad)
            {
                break;
            }
            else
            {
                iMaxRad = iMinRad;
                iMinRad -= rad;
 
                iPowMaxRad = iMaxRad * iMaxRad;
                iPowMinRad = iMinRad * iMinRad;
 
            }
        }
        if (i < 10)
        {
            //Ошибка вылезает отсюда, как эта диалоговая панель связана с
            //моим шаблоном, не понимаю. 
            if (ChooseColor(&cc) == TRUE)
            {
                crCellTarget[i] = cc.rgbResult;
                InvalidateRect(hwnd, &rcRgn[0], TRUE);
            }
            
        /*else
        {
            TCHAR szStr[64];
            _stprintf_s(szStr, 64,
            TEXT("Point(x = %d, y = %d) In not a Region"),
            x, y);
            MessageBox(NULL, szStr, TEXT("Message"), MB_OK);
        }*/
        }
        return 0;
    }
        case WM_DESTROY:
        {
            for (int i = 0; i < 10; ++i)
                DeleteObject(hRgn[i]);
            //PostQuitMessage(0);
            return 0;
        }
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.03.2023, 16:46
Ответы с готовыми решениями:

Необработанное исключение по адресу на х86, на х64 работает норм
ParWin = new Wnd (WS_EX_ACCEPTFILES, &quot;FRM_TEXTEDIT&quot;, &quot;Flat Assembler&quot;, WS_OVERLAPPEDWINDOW, 365,120,480,520, NULL,NULL, hInstance,...

Необработанное исключение и тд
Не вижу в чем ошибка, необработанное исключение. Вылетает где то в WM_PAINT. Плюс переменная indexfile, не индексируется. #define...

Необработанное исключение
Необработанное исключение Работало нормально. Компилятор ошибок не выдает. Что это может быть ? Необработанное исключение у...

50
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
25.03.2023, 23:23  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Алексей1153 Посмотреть сообщение
в доке написано
Значит не понятно написано, если спрашиваю.

Цитата Сообщение от Алексей1153 Посмотреть сообщение
level up )
Я что то смешное написал?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
28.03.2023, 05:48
Цитата Сообщение от Liss29 Посмотреть сообщение
Серьёзно,
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
#include <windows.h>
#include <iostream>
#include <algorithm>
 
COLORREF colors[3]{12800000, 64000, 200,};
RECT rc[3]; LONG rad = 10; POINT ptCenter;
LPCWSTR szNums[] = { L"10", L"20", L"30",};
 
void
OnPaint( HWND hwnd)
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd, &ps);
    //Если функцию SelectObject() вызвать здесь, тогда да,
    //есть ощутимые преимущества.
    SaveDC(hdc);
    
    SetBkMode(hdc, TRANSPARENT);
    SetTextAlign(hdc, TA_CENTER | TA_BASELINE);
    SelectObject( hdc, GetStockObject( DC_BRUSH ));
    for (int i = 0; i < 3; ++i)
    {
        SetDCBrushColor( hdc, colors[i]);
        Ellipse  //Rectangle
        (hdc, rc[i].left, rc[i].top,
            rc[i].right, rc[i].bottom);
    }
    //SetTextColor(hdc, RGB(200,200,0));
    for (int i = 0; i < 3; ++i)
    {
        if (i == 2)
            TextOutW(hdc, rc[i].left + rad,
                ptCenter.y, szNums[i], 2);
        else
        {
            TextOutW(hdc, rc[i].left + (rad >> 1),
                ptCenter.y, szNums[i], 1);
            TextOutW(hdc, rc[i].right - (rad >> 1),
                ptCenter.y, szNums[i], 1);
        }
    }
 
    RestoreDC(hdc, -1); // но не будет ли тогда утечки ресурсов?
    EndPaint(hwnd, &ps);
}
 
INT_PTR
Dlg( HWND hwnd, UINT message, WPARAM w, LPARAM l)
{
    switch(message)
    {
        case WM_COMMAND: return EndDialog(hwnd, LOWORD(w)), 1;
        case WM_INITDIALOG:
        {
            RECT client;
            GetClientRect(hwnd, &client);
            LONG w = client.right - client.left;
            LONG h = client.bottom - client.top;
            LONG d = (std::min)(w,h);
            InflateRect(&client, (d-w)/2, (d-h)/2 );
            for ( size_t i = 0; i < 3; i++)
            {
                rc[i] = client;
                InflateRect(rc+i, - (i * d / 6), - (i * d / 6));
            }
            rad = d/6;
            ptCenter = {client.left + d/2, client.top + d/2 };
        }break;
        case WM_PAINT: return OnPaint(hwnd), 1;
    }
        return 0;
}
 
int 
main(){
    DialogBoxIndirectParamW( 0,
        reinterpret_cast< LPDLGTEMPLATE>( L"\0\0\0\0\0\0\0"
            "~~"
            "\0\0Circles" ), 
            0,
            Dlg,
        0);
    for ( const auto & r : rc )
        std::cerr << r.left << 'x'<< r.top  << '\t' << r.right << 'x' << r.bottom << '\n';
}
_Pragma("comment(lib, \"gdi32\" )") _Pragma("comment(lib, \"user32\" )")
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
29.03.2023, 06:56  [ТС]
ДА ЛАДНО, не может быть.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
29.03.2023, 09:34
Цитата Сообщение от Liss29 Посмотреть сообщение
сразу после старта программы GDI Handles 13, после запуска диалогового окна 29, после закрытия 19, после повторного открытия диалогового окна и выбора, замены в нескольких полях мишени цветов 35, после закрытия диалогового окна 25, как сие трактовать, утечка?
Если подтвердится регулярная потеря 6 handleов.

В данном Вами фрагменте hPen создаётся, но нигде не используется, и непонятно, где удаляется.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
30.03.2023, 04:11  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
В данном Вами фрагменте hPen создаётся, но нигде не используется, и непонятно, где удаляется.
Про этот фрагмент речь?
Кликните здесь для просмотра всего текста
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
case WM_PAINT:
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd, &ps);
    //Если функцию SelectObject() вызвать здесь, тогда да,
    //есть ощутимые преимущества.
    //SaveDC(hdc);
    
    SetBkMode(hdc, TRANSPARENT);
    
    hPen = CreatePen(PS_SOLID, 2, RGB(0, 0, 0));
    hOldPen = (HPEN)SelectObject(hdc, hPen);
    HBRUSH hBrush, hOldBrush;
    UINT OldAlign = SetTextAlign(hdc, TA_CENTER);
    for (int i = 0; i < 10; ++i)
    {
        Ellipse(hdc, rcRgn[i].left, rcRgn[i].top,
            rcRgn[i].right, rcRgn[i].bottom);
    
    }
    for (int i = 0; i < 10; ++i)
    {
        //SaveDC(hdc);
        hBrush = CreateSolidBrush(crCellTarget[i]);
        //А если здесь SaveDC(), то не особо ощутимо 
        hOldBrush = SelectObject(hdc, hBrush);
 
        ExtFloodFill(hdc, ptCenter.x,
            rcRgn[i].top + (rad >> 1),
            RGB(0,0,0), FLOODFILLBORDER);
 
        if (i == 9)
            TextOut(hdc, rcRgn[i].left + rad,
                ptCenter.y, (LPCTSTR)szNums[i], 2);
        else
        {
            TextOut(hdc, rcRgn[i].left + (rad >> 1),
                ptCenter.y, (LPCTSTR)szNums[i], 1);
            TextOut(hdc, rcRgn[i].right - (rad >> 1),
                ptCenter.y, (LPCTSTR)szNums[i], 1);
        }
        //Здесь нет SelectObject()
        SelectObject(hdc, hOldBrush);
        DeleteObject(hBrush);
        //А здесь RestoreDC(hdc, -1);
    }
    //SetBkMode(hdc, OldBk);
    SelectObject(hdc, hOldPen);
    SetTextAlign(hdc, OldAlign);
    DeleteObject(hPen);
    //RestoreDC(hdc, -1), но не будет ли тогда утечки ресурсов?
    EndPaint(hwnd, &ps);
    return 0;
}


Добавлено через 1 минуту
Цитата Сообщение от politoto Посмотреть сообщение
Если подтвердится регулярная потеря 6 handleов
Откуда потеря аж 6-ти дескрипторов не ясно, если даже hPen не удаляется.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
30.03.2023, 07:37
Цитата Сообщение от Liss29 Посмотреть сообщение
Откуда потеря аж 6-ти дескрипторов
WM_PAINT может обрабатываться не один раз. Может быть, где-то ещё есть утечки.

Добавлено через 12 минут
Цитата Сообщение от Liss29 Посмотреть сообщение
Про этот фрагмент речь?
https://www.cyberforum.ru/post16823759.html
В этом фрагменте SelectObject(hdc, hPen) закомментировано, а DeleteObject(hPen) удалено.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
31.03.2023, 05:09  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Может быть, где-то ещё есть утечки.
Может быть так что лучше делать по старинке.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
31.03.2023, 09:33
Лучше лишний раз Createxxx()/DeleteObject() не дёргать.
И, в частности, обходиться без CreatePen(PS_SOLID, ...) и CreateSolidBrush() там, где с готовыми стандартными объектами всё рисуется
https://www.cyberforum.ru/post16829345.html
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
31.03.2023, 22:57  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Лучше лишний раз Createxxx()/DeleteObject() не дёргать.
А если нужно перо стандартного цвета, но толщиной не один пиксел, а, скажем 2, 3, 4..., тогда что делать, как обойтись без CreatePen?
Тот же вопрос и про кисти, нужно что-то раскрасить не стандартным цветом?
C++
1
SelectObject( hdc, GetStockObject( [B]DC_BRUSH [/B]));
- DC_BRUSH - Что это?
C++
1
SetDCBrushColor( hdc, colors[i]);
- какие преимущества это даёт?

Добавлено через 1 час 33 минуты
Возможно, лучше заранее создавать несколько кистей и перьев, например, в WM_CREATE:, если точно известно, сколько, будет нужно этих объектов. Удалять их при закрытии приложения. Так и в производительности будет выигрыш, нет? Но..., как я подозреваю всегда есть но...)
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
11.04.2023, 09:26
Цитата Сообщение от Liss29 Посмотреть сообщение
нужно что-то раскрасить не стандартным цветом?
C++
1
SelectObject( hdc, GetStockObject( DC_BRUSH ));
- DC_BRUSH - Что это?
C++
1
SetDCBrushColor( hdc, colors[i]);
- какие преимущества это даёт?
Не нужны сотни нестандартных кистей для сплошной заливки сотней произвольных цветов.
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
#include <windows.h>
#include <random>
 
void
OnPaint( HWND hwnd)
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd, &ps);
    SaveDC(hdc);
    SelectObject( hdc, GetStockObject( DC_BRUSH ));
 
    RECT client;
    GetClientRect(hwnd, &client);
    LONG w = client.right - client.left;
    LONG h = client.bottom - client.top;
    LONG d = (std::min)(w,h);
    InflateRect(&client, (d-w)/2, (d-h)/2 );
 
    COLORREF RandomRGB();    
    for (int i = 0; i < 16; ++i)
        for (int j = 0; j < 16; ++j)
    {
        SetDCBrushColor( hdc, RandomRGB() );
        Ellipse  //Rectangle
        (hdc, client.left + d*i/16, client.top + d * j/16,
            client.left + d*(i+1)/16, client.top + d*(1+j)/16);
    }
 
    RestoreDC(hdc, -1); // возврат в предыдущее состояние
    EndPaint(hwnd, &ps);
}
 
COLORREF RandomRGB()
{
    static std::random_device rd;  // 
    static std::mt19937 g(rd()); // 
    static std::uniform_int_distribution<> rnd(0, 255);
    return RGB( rnd(g), rnd(g), rnd(g) );
}
 
INT_PTR
Dlg( HWND hwnd, UINT message, WPARAM w, LPARAM l)
{
    switch(message)
    {
        case WM_COMMAND: return EndDialog(hwnd, LOWORD(w)), 1;
        case WM_INITDIALOG: return 0;
        case WM_PAINT: return OnPaint(hwnd), 1;
    }
        return 0;
}
 
int 
main(){
    DialogBoxIndirectParamW( 0,
        reinterpret_cast< LPDLGTEMPLATE>( L"\0\0\0\0\0\0\0"
            "~~"
            "\0\0Circles" ), 
            0,
            Dlg,
        0);
}
#pragma comment(lib, "gdi32" )
#pragma comment(lib, "user32" )
Изображения
 
1
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
18.04.2023, 06:30  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Не нужны сотни нестандартных кистей для сплошной заливки сотней произвольных цветов.
Да, почитал об этих кистях DC_BRUSH & DC_PEN, теперь понятно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.04.2023, 06:30

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

Необработанное исключение
Добрый день, первый раз пишу. Вот такая ошибка вылезла, когда писал ЭГА Необработанное исключение по адресу 0x0124D42E в...

Необработанное исключение: Нарушение прав доступа при чтении
Работала с игрой &quot;Крестики-нолики&quot;. При компиляции выдает сообщение &quot;Необработанное исключение в &quot;0x0086297b&quot; в...

Необработанное исключение. Нарушение прав доступа при чтении
Здравствуйте! Пишу привязку программы к конкретному компьютеру, и получаю информацию о железе через WMI, но при сохранении данных...

Вызвано необработанное исключение: нарушение доступа для чтения. lpnmhdr было nullptr
Ошибка в фрагменте (см.скрин) после нажатия на кнопку &quot;ждать 5 сек&quot;. Строки 183-191 из общего кода: case WM_NOTIFY: LPNMHDR lpnmhdr =...


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

Или воспользуйтесь поиском по форуму:
51
Ответ Создать тему
Новые блоги и статьи
Главный вопрос моделирования сукцессии
anaschu 27.06.2026
главный вопрос. Если эктомикориза лучше добывает недоступный фосфор. И ее масса максимальна из всех. А широколиственный лес тоже имеет самую крутую биомассу. То почему не возникло их симбиоза? Это. . .
сукцессия 6. Питон реализация энилоджиковской модели, картинка про Центральную часть будущей модели
anaschu 26.06.2026
Етить. ИИ мне на основе моего старого файла R создал вот эту вот хмерь на пайтоне. Это уже новая модель, модель сукцессии грибной. потоки фосфора, азота. Углерода. 5 видов организмов. Я даже. . .
Как замкнутый ядерный цикл решит проблему недостатки фосфора? Био миграция фосфора со дна океана
anaschu 26.06.2026
Биологический лифт: Концепция подъема фосфора со дна океана с помощью ЗЯТЦ Предлагаю на обсуждение альтернативу тяжелому промышленному бурению океанического дна. Вместо сложной инженерии мы можем. . .
сукцессия 5
anaschu 26.06.2026
ПЛАН РАЗРАБОТКИ математической модели сукцессии микоризных систем Переход AM → EcM (Endo + ErM) · Шумилов А. С. · ИФХиБПП РАН · Пущино · 2026 . . .
сукцессия 4
anaschu 25.06.2026
Более детализированный план разработки План доработки модели динамики микоризных симбиозов (EcM с гистерезисом) Цель: Реализовать логику переключения между эрикоидным (ErM) и эктомикоризным. . .
сукцессия 3
anaschu 25.06.2026
Примерный план работ по модели
сукцессия 2
anaschu 25.06.2026
параметризировочная калибровочная таблица будущей модели
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал (мат мет мод 29)
anaschu 23.06.2026
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал Материалы для обсуждения с МГСУ · 2026 Рисунки внутри приложенного ворд файла. Что за. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru