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

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

21.03.2023, 16:46. Показов 6570. Ответов 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,638
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,638
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,638
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,638
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,638
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,638
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
Ответ Создать тему
Новые блоги и статьи
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru