Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638

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

21.03.2023, 16:46. Показов 6310. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru