Рисование в окне через контекст памяти + много окон

Тема в разделе "WASM.BEGINNERS", создана пользователем Ground, 22 май 2011.

  1. Ground

    Ground New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2010
    Сообщения:
    2
    Доброго времени суток!
    Есть небольшая проблемка: требуется реализовать небольшую программку на TASM. Принцип работы: создается главное окно. При щелчке на нем - создаются новые окна в которых рисуются разные рисунки. Необходимо, чтобы эти рисунки не стирались при перекрытии окон.
    Решение, которое есть сейчас: глобальные переменные (контекст устройства и памяти), одна оконная процедура на все окна. Как результат (что и логично) - при перерисовки окна на всех окнах остается один и тот же рисунок. Нужно это как-то исправить. Сначала хотел использовать static-переменные, но это вряд ли поможет. Вторая идея - ассоциативный массив: HWND - HMEM (хендл - контекст памяти). Может есть какой-то более простой способ через API функции?

    Вот код оконной функции, для наглядности:
    Код (Text):
    1. WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
    2.     cmp [wmsg], WM_DESTROY
    3.     je wmdestroy
    4.     cmp [wmsg], WM_CREATE
    5.     je wmcreate
    6.     cmp [wmsg], WM_PAINT
    7.     je wmpaint
    8.     cmp [wmsg], WM_RBUTTONDOWN
    9.     je wmrbuttondown
    10.     jmp defwndproc
    11.  
    12. wmcreate:
    13.     call GetDC, [hwnd]
    14.     mov [hDC], eax
    15.     call CreateCompatibleDC, [hDC]
    16.     mov [hMem], eax
    17.     call GetSystemMetrics, SM_CXSCREEN
    18.     mov [width], eax
    19.     call GetSystemMetrics, SM_CYSCREEN
    20.     mov [height], eax
    21.     call CreateBitmap, [width], [height], 1, 32, 0
    22.     mov [hBit], eax
    23.     call SelectObject, [hMem], [hBit]
    24.     call CreateSolidBrush, 0ffffffh
    25.     mov [hBrush], eax                  
    26.     call SelectObject, [hMem], [hBrush]
    27.     call PatBlt, [hMem], 0, 0, [width], [height], PATCOPY
    28.     call DeleteObject, [hBrush]    
    29.     cmp [isFirstRun], 1
    30.     jne wmcreatePaint
    31.     dec [isFirstRun]
    32.     jmp finish 
    33. wmcreatePaint: 
    34.     xor esi, esi
    35. wmcreatePaintLoop:
    36.     call WRandom
    37.     call CreatePen, PS_SOLID, 3, eax
    38.     mov [hPen], eax
    39.     call SelectObject, [hMem], [hPen]
    40.     call MoveToEx, [hMem], 0, esi, 0
    41.     call LineTo, [hMem], [windowSize], esi
    42.     call MoveToEx, [hMem], esi, 0, 0
    43.     call LineTo, [hMem], esi, [windowSize]
    44.     add esi, 10
    45.     cmp esi, [windowSize]
    46.     jle wmcreatePaintLoop  
    47.     call InvalidateRect, [hwnd], 0, 0
    48.     jmp finish
    49.    
    50. wmrbuttondown:
    51.     call GetWindowTextA, [hwnd], offset szTitleBuffer, [bufferSize]
    52.     cmp szTitleBuffer, 'M'
    53.     je mainwindow
    54.     cmp szTitleBuffer, 'S'
    55.     je slavewindow
    56.    
    57. mainwindow:
    58.     call CreateWindowExA, 0, offset szClassName, offset szTitleSlaveName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, [windowSize], [windowSize], 0, 0, [hInstance], 0
    59.     call ShowWindow, eax, SW_SHOW
    60.     call UpdateWindow, eax 
    61. slavewindow:
    62.    
    63. wmpaint:
    64.     call BeginPaint, [hwnd], offset paintStructure
    65.     call BitBlt, eax, 0, 0, [width], [height], [hMem], 0, 0, SRCCOPY
    66.     call EndPaint, [hwnd], offset paintStructure        
    67.     jmp finish
    68.  
    69. wmdestroy:
    70.     call PostQuitMessage, 0
    71.     xor eax, eax    
    72.     jmp finish  
    73.  
    74. defwndproc:
    75.         call    DefWindowProcA, [hwnd], [wmsg], [wparam], [lparam]  
    76.         jmp     finish
    77.  
    78. finish:
    79.         ret
    80. WndProc endp
     
  2. freyr

    freyr New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2010
    Сообщения:
    95
    SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)pImage);

    pImage = GetWindowLongPtr(hWnd, GWLP_USERDATA);
     
  3. Ground

    Ground New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2010
    Сообщения:
    2
    freyr, благодарю.
    Вопрос закрыт.