Доброго времени суток! Есть небольшая проблемка: требуется реализовать небольшую программку на TASM. Принцип работы: создается главное окно. При щелчке на нем - создаются новые окна в которых рисуются разные рисунки. Необходимо, чтобы эти рисунки не стирались при перекрытии окон. Решение, которое есть сейчас: глобальные переменные (контекст устройства и памяти), одна оконная процедура на все окна. Как результат (что и логично) - при перерисовки окна на всех окнах остается один и тот же рисунок. Нужно это как-то исправить. Сначала хотел использовать static-переменные, но это вряд ли поможет. Вторая идея - ассоциативный массив: HWND - HMEM (хендл - контекст памяти). Может есть какой-то более простой способ через API функции? Вот код оконной функции, для наглядности: Код (Text): WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD cmp [wmsg], WM_DESTROY je wmdestroy cmp [wmsg], WM_CREATE je wmcreate cmp [wmsg], WM_PAINT je wmpaint cmp [wmsg], WM_RBUTTONDOWN je wmrbuttondown jmp defwndproc wmcreate: call GetDC, [hwnd] mov [hDC], eax call CreateCompatibleDC, [hDC] mov [hMem], eax call GetSystemMetrics, SM_CXSCREEN mov [width], eax call GetSystemMetrics, SM_CYSCREEN mov [height], eax call CreateBitmap, [width], [height], 1, 32, 0 mov [hBit], eax call SelectObject, [hMem], [hBit] call CreateSolidBrush, 0ffffffh mov [hBrush], eax call SelectObject, [hMem], [hBrush] call PatBlt, [hMem], 0, 0, [width], [height], PATCOPY call DeleteObject, [hBrush] cmp [isFirstRun], 1 jne wmcreatePaint dec [isFirstRun] jmp finish wmcreatePaint: xor esi, esi wmcreatePaintLoop: call WRandom call CreatePen, PS_SOLID, 3, eax mov [hPen], eax call SelectObject, [hMem], [hPen] call MoveToEx, [hMem], 0, esi, 0 call LineTo, [hMem], [windowSize], esi call MoveToEx, [hMem], esi, 0, 0 call LineTo, [hMem], esi, [windowSize] add esi, 10 cmp esi, [windowSize] jle wmcreatePaintLoop call InvalidateRect, [hwnd], 0, 0 jmp finish wmrbuttondown: call GetWindowTextA, [hwnd], offset szTitleBuffer, [bufferSize] cmp szTitleBuffer, 'M' je mainwindow cmp szTitleBuffer, 'S' je slavewindow mainwindow: call CreateWindowExA, 0, offset szClassName, offset szTitleSlaveName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, [windowSize], [windowSize], 0, 0, [hInstance], 0 call ShowWindow, eax, SW_SHOW call UpdateWindow, eax slavewindow: wmpaint: call BeginPaint, [hwnd], offset paintStructure call BitBlt, eax, 0, 0, [width], [height], [hMem], 0, 0, SRCCOPY call EndPaint, [hwnd], offset paintStructure jmp finish wmdestroy: call PostQuitMessage, 0 xor eax, eax jmp finish defwndproc: call DefWindowProcA, [hwnd], [wmsg], [wparam], [lparam] jmp finish finish: ret WndProc endp
SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)pImage); pImage = GetWindowLongPtr(hWnd, GWLP_USERDATA);