Диалогое окно. Косметика. (masm)

Тема в разделе "WASM.BEGINNERS", создана пользователем Wisder, 7 авг 2007.

Статус темы:
Закрыта.
  1. Wisder

    Wisder New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    30
    Помогите пожалуйста с украшение окна, а точнее каким образом можна поместить картинку на фон окна?
     
  2. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Если тебе надо именно как фон, то можешь попробовать этот код
    При регистрации класса окна указываешь в качестве фона кисть, созданную из загруженной картинки:
    Код (Text):
    1. invoke      BitmapFromResource,hInstance,50 ;Загрузить картинку из ресурсов
    2. invoke     CreatePatternBrush,eax           ;Создать кисть из картинки
    3. mov        wc.hbrBackground,eax     ;Для того чтобы вывести картинку
     
  3. AndNot

    AndNot New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2007
    Сообщения:
    49
    Или перехватывай сообщение WM_ERASEBKGND. Оно специально предназначено для отрисовки фона. Можешь даже как мультики фон заделать ;)
     
  4. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    можно обрабатывать WM_PAINT
    hBitmap - хэндл картинки
    Код (Text):
    1.  .elseif uMsg==WM_PAINT
    2.   invoke GetClientRect,hWnd,addr rect
    3.   invoke BeginPaint,hWnd,addr ps
    4.   mov esi, eax
    5.   invoke CreateCompatibleDC,esi
    6.   mov edi, eax
    7.   invoke SelectObject,edi,hBitmap
    8.   invoke BitBlt,esi,0,0,rect.right,rect.bottom,edi,0,0,SRCCOPY
    9.   invoke DeleteDC,edi
    10.   invoke EndPaint,hWnd,addr ps
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    RamMerLabs
    Если думать об эффективности, то предпочтительнее всё же #2 или #3.
     
  6. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    если используется диалог, то я предпочитаю метод, который я предложил
     
  7. Veter

    Veter New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2006
    Сообщения:
    161
    Немножко не в тему - кроме диалоговых существуют еще другие предопределённые классы окон - внешний вид их вызывате у меня лично нарекания :)......-можно ли сделать скролл-бар например - и чтобы на него повесить картинку ? Возможно ли это? Смотрел скин-компоненты для Си и Дельфи - просто абалдеть дизайн, сам пытаюсь написать контрол такой, но не получается, запутался с нэндлами, сообщениями и т.д
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Гугли Flat scrollbars.
     
  9. Wisder

    Wisder New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    30
    Спасибо ответившим. Сделал по методу пользователя RamMerLabs.

    А каким способом можно убрать (скрыть) заголовок и рамку вокруг окна. Если это возможно, то как после этого перемещать окно?
     
  10. Veter

    Veter New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2006
    Сообщения:
    161
    WS_POPUP+WS_SYSMENU+WS_VISIBLE - просто плоское окно,без рамки и головы...


    Перемещать - известный код Iczelion`a :

    .elseif uMsg==WM_NCHITTEST
    invoke DefWindowProc,hWnd,uMsg,wParam,lParam
    .if eax==HTCLIENT
    mov eax,HTCAPTION
    .endif
    ret
    ___________________________

    Если не лень, можешь посмотреть образцы моего "творчества".
    Наделал их за полгода изучения ассемблера практически с 0.
    Сори, монитор старенький, если разрешение больше 1000х800, можно и не смотреть...
    http://www.eddyeditor.narod.ru
     
  11. AndNot

    AndNot New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2007
    Сообщения:
    49
    В таком случае не забудь при создании окна отключить перерисовку фона (mov wc.hbrBackground, 0), иначе, при перерисовке, сначала твое окно получит WM_ERASEBKGND, при котором DifXXXProc выполнит FillRect, а только затем пойдет WM_PAINT, в котором уже ты перерисовываешь фон. Т.е. двойная работа.
     
  12. Wisder

    Wisder New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    30
    Я не использую wc.hbrBackground т.к. у меня окно берется из ресурсов
     
  13. Wisder

    Wisder New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    30
    Veter, спасибо заголовок и рамку у меня получилось убрать, а вот двигать окно
    не как не получается. Если будет время и желание посмотрите исходник, может там что-нибудь не так.
     
  14. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    У вас - диалог, а не окно, поэтому вместо
    Код (Text):
    1. .elseif uMsg==WM_NCHITTEST
    2.   invoke DefWindowProc,hWin,uMsg,wParam,lParam  
    3.   .if eax==HTCLIENT    
    4.     mov eax,HTCAPTION
    5.   .endif
    6.   ret
    надо
    Код (Text):
    1. .elseif uMsg==WM_NCHITTEST
    2.   invoke DefWindowProc,hWin,uMsg,wParam,lParam
    3.   .if eax==HTCLIENT
    4.     mov eax,HTCAPTION
    5.   .endif
    6.   invoke SetWindowLong,hWin,DWL_MSGRESULT,eax
    7.   xor eax,eax
    8.   inc eax
    9.   ret
    Кроме того, тот же фоновый рисунок можно устроить с bmp меньше 100 b, а не в 175 kb. Угадайте, как.
     
  15. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    можно и так:
    Код (Text):
    1.  .ELSEIF uMsg == WM_LBUTTONDOWN
    2.   call ReleaseCapture
    3.   invoke SendMessage,hWnd,WM_NCLBUTTONDOWN, HTCAPTION,0
     
  16. Veter

    Veter New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2006
    Сообщения:
    161
    На сайте есть интересные исходники - как сделать маааленькую кисть и закрасить ею бооольшое окно, ну и про всё, почти остальное.
    Научиться чему-то проще всего - ломать то, что уже сделано.
     
  17. Wisder

    Wisder New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    30
    Большое спасибо всем.
     
  18. Wisder

    Wisder New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    30
    Привет это опять я =)
    В некоторых программах я замечал не обычные формы окон, в основном это были кеигены и т.п. программы, не редко я видел в ресурсах данное окно в виде картинки, а прозрачные участки были закрашенны в розевый цвет. Можете мне помочь с данным так сказать эффектом или исходником какой нибудь похожей программы.
     
  19. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    нужно назначить окну регион, который будет вычисляться в соответствии с рисунком. домой приеду - выложу пример.
     
  20. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    вот пример, взят из уроков Iczelion'а
    Код (Text):
    1. MakeRegion PROC hDC:HDC,dWidth:DWORD,dHeight:DWORD
    2.  LOCAL X:DWORD,Y:DWORD,dStartX:DWORD,hFRegion:DWORD,hLRegion:DWORD,cTransC:DWORD,hInFirstR:DWORD,hInline:DWORD
    3.  mov hInFirstR,TRUE
    4.  mov hInline,FALSE
    5.  mov X,0
    6.  mov Y,0
    7.  mov dStartX,0
    8.  invoke GetPixel,hDC,0,0
    9.  mov cTransC,eax
    10.  mov ebx, dHeight
    11.  .WHILE Y < ebx
    12.   mov ebx, dWidth
    13.   .WHILE X <= ebx
    14.    invoke GetPixel,hDC,X,Y
    15.    mov ebx, dWidth
    16.    .IF eax == cTransC || X == ebx
    17.     .IF hInline == TRUE
    18.      mov hInline,FALSE
    19.      mov ebx,Y
    20.      inc ebx
    21.      invoke CreateRectRgn,dStartX,Y,X,ebx
    22.      mov hLRegion,eax
    23.      .IF hInFirstR == TRUE
    24.       push hLRegion
    25.       pop hFRegion
    26.       mov hInFirstR,FALSE
    27.      .ELSE
    28.       invoke CombineRgn,hFRegion,hFRegion,hLRegion,RGN_OR
    29.       invoke DeleteObject,hLRegion
    30.      .ENDIF
    31.     .ENDIF
    32.    .ELSE
    33.     .IF hInline == FALSE
    34.      mov hInline,TRUE
    35.      push X
    36.      pop dStartX
    37.     .ENDIF
    38.    .ENDIF
    39.    inc X
    40.    mov ebx, dWidth
    41.   .ENDW
    42.   inc Y
    43.   mov X,0
    44.   mov ebx, dHeight
    45.  .ENDW
    46.  mov eax, hFRegion
    47.  ret
    48. MakeRegion ENDP
     
Статус темы:
Закрыта.