Цвет окна приложения

Тема в разделе "WASM.BEGINNERS", создана пользователем rubic_, 11 окт 2007.

  1. rubic_

    rubic_ Женя

    Публикаций:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    121
    Адрес:
    Омск
    зрасте, начал сегодня тут Iczelion'a читать и возник вопрос

    LOCAL wc:WNDCLASSEX ; создание локальных переменных в стеке
    LOCAL msg:MSG
    LOCAL hwnd:HWND


    mov wc.cbSize,SIZEOF WNDCLASSEX ; заполнение структуры wc
    mov wc.style, CS_HREDRAW or CS_VREDRAW
    mov wc.lpfnWndProc, OFFSET WndProc
    mov wc.cbClsExtra,NULL

    mov wc.cbWndExtra,NULL
    push hInstance
    pop wc.hInstance
    mov wc.hbrBackground,COLOR_WINDOW+1

    mov wc.lpszMenuName,NULL
    mov wc.lpszClassName,OFFSET ClassName
    invoke LoadIcon,NULL,IDI_APPLICATION
    mov wc.hIcon,eax

    mov wc.hIconSm,eax
    задаются параметры структуры класса, как поменять цвет приложения?
    что сдесь COLOR_WINDOW, константа, которая содержит в себе цвет или бин число.
    глянул в windows.inc, там написано COLOR_WINDOW typedef 7. то есть является чем-то вроде синонима. как быть в общем.
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    В wc.hbrBackground нужно записать хендл кисти, которой будет отрисовываться фон окна. Или указать одну из констант COLOR_*, чтобы использовать стандартный системный цвет.

    Кисть создается функцией CreateBrush.
     
  3. rubic_

    rubic_ Женя

    Публикаций:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    121
    Адрес:
    Омск
    ладно бог с ней с кистью, я до нее пока не дошел. где взять список констант?
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    там же, где нашел COLOR_WINDOW
     
  5. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    в файле windows.inc
     
  6. rubic_

    rubic_ Женя

    Публикаций:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    121
    Адрес:
    Омск
    да, нашел..сори за последний вопрос. Сначала спросил потом подумал)
     
  7. rubic_

    rubic_ Женя

    Публикаций:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    121
    Адрес:
    Омск
    Раз у меня седня ночь "умных" вопросов, задам еще 1. Сильно не ругайте за 2 вопроса в 1 теме, просто он мелкий, и не стоит целой темы.
    не до конца понимаю суть данного параметра структуры WNDCLASSEX
    lрfnWndProc: Адрес процедуры окна, ответственной за окна, создаваемых из класса.
    я на его месте указываю адрес процедуры, которая обрабатыват сообщения.
    1) причем тогда тут(ответственной за окна, создаваемых из класса.) я же не создаю окон. И по какому принципы операционка шлет сообщения моему приложению и другим в часности?

    код Iczelion'a
    Код (Text):
    1. WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR,
    2. CmdShow:DWORD
    3.  
    4.     LOCAL wc:WNDCLASSEX
    5.     LOCAL msg:MSG
    6.     LOCAL hwnd:HWND
    7.  
    8.     mov   wc.cbSize,SIZEOF WNDCLASSEX
    9.     mov   wc.style, CS_HREDRAW or CS_VREDRAW
    10.     mov   wc.lpfnWndProc, OFFSET WndProc
    11.     mov   wc.cbClsExtra,NULL
    12.     mov   wc.cbWndExtra,NULL
    13.     push  hInst
    14.     pop   wc.hInstance
    15.     mov   wc.hbrBackground,COLOR_WINDOW+1
    16.     mov   wc.lpszMenuName,NULL
    17.     mov   wc.lpszClassName,OFFSET ClassName
    18.     invoke LoadIcon,NULL,IDI_APPLICATION
    19.     mov   wc.hIcon,eax
    20.     mov   wc.hIconSm,eax
    21.     invoke LoadCursor,NULL,IDC_ARROW
    22.     mov   wc.hCursor,eax
    23.     invoke RegisterClassEx, addr wc
    24.  
    25.     invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
    26.            WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
    27.  
    28.            CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
    29.            hInst,NULL
    30.  
    31.     mov   hwnd,eax
    32.     invoke ShowWindow, hwnd,SW_SHOWNORMAL
    33.     invoke UpdateWindow, hwnd
    34.         .WHILE TRUE
    35.  
    36.                invoke GetMessage, ADDR msg,NULL,0,0
    37.                .BREAK .IF (!eax)
    38.                invoke TranslateMessage, ADDR msg
    39.                invoke DispatchMessage, ADDR msg
    40.  
    41.         .ENDW
    42.         mov     eax,msg.wParam
    43.         ret
    44. WinMain endp
    45.  
    46.  
    47. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    48.     LOCAL hdc:HDC
    49.  
    50.     LOCAL ps:PAINTSTRUCT
    51.     LOCAL rect:RECT
    52.     .IF uMsg==WM_DESTROY
    53.         invoke PostQuitMessage,NULL
    54.  
    55.     .ELSEIF uMsg==WM_PAINT
    56.         invoke BeginPaint,hWnd, ADDR ps
    57.         mov    hdc,eax
    58.         invoke GetClientRect,hWnd, ADDR rect
    59.  
    60.         invoke DrawText, hdc,ADDR OurText,-1, ADDR rect, \
    61.                 DT_SINGLELINE or DT_CENTER or DT_VCENTER
    62.         invoke EndPaint,hWnd, ADDR ps
    63.     .ELSE
    64.  
    65.         invoke DefWindowProc,hWnd,uMsg,wParam,lParam
    66.         ret
    67.     .ENDIF
    68.     xor   eax, eax
    69.  
    70.     ret
    71. WndProc endp
    72. end start
    предполагаю следующее, что когда опер-ка шлет сообщение, вызывается процедура из этого пар-ра приложения, и если обработчик есть, то обрабатывается. Если нет, то спускается на тормозах фун-ей DefWindowProc. Вопрос еще раз по какому принципы операционка шлет сообщения моему приложению и другим в часности?

    сори за орфографию, не сплю 2 сутки.
     
  8. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Класс регистрируется для того, чтобы потом создавать окна (одно или несколько) с требуемыми параметрами (например курсор, иконка, способность принимать double click). Член wc.lpfnWndProc должен содержать адрес процедуры обработки сообщений для каждого окна этого класса. Когда что-то происходит (например, нажали клавишу сворачивания окна), в эту процедуру передается соответствующее сообщение (например, WM_SIZE) с некоторыми параметрами (wParam, lParam), которое она должна обработать. Если обрабатывать сообщение необходимости нет, нужно передать хэндл окна, сообщение и параметры в процедуру окна по-умолчанию. Это делается с помощью вызова DefWindowProc.
     
  9. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Поспи и потом поучи матчать ;)
    да ну:
    в порядке очереди

    поправка: если есть твой обработчик

    У каждого окна есть свой обработчик. При регистрации своего класса ты его назначаеш через lрfnWndProc.
    Функцией DefWindowProc ты передаёш управление стандартному обработчику сообщений, она обрабатывает а не спускает на тормоза.

    Вроде так :)
     
  10. rubic_

    rubic_ Женя

    Публикаций:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    121
    Адрес:
    Омск
    выспался..)) язык больно понравился, на сон время много уходит))
    ну я это имел ввиду)

    про очередь по подробнее, список , порядок и так далее если можно.
     
  11. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Копай! ;)
    http://www.wasm.ru/forum/viewtopic.php?id=23022
     
  12. rubic_

    rubic_ Женя

    Публикаций:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    121
    Адрес:
    Омск
    покапал, ответа на мой вопрос там нет( или я не нашел.
    нашел только как измменить количество принимаемых приложением сообщений и
    фун-ю PostMessage, которая позволяет, как я понял, отправить сообщение конкретному приложению. А какие сообщения посылает винда, при загрузке моего приложения, как она узнает что мне нужно прорисовать текст например? ведь я не вызываю процедуру прорисовки явно, лишь указываю обработчик. Как винда узнает, что мне нужно послать сообщение WM_PAINT. значит у нее должен быть стандартный набор сообщений, который посылается при создании приложения, или как-то иначе. Мож я конечно тупые вопросы задаю. но не хотелось бы иметь пробелы на самом старте(.
     
  13. rubic_

    rubic_ Женя

    Публикаций:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    121
    Адрес:
    Омск
    вопрос актуален
     
  14. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    rubic_
    Возьми прогу Spy++ из VS
    и смотри в ней это;)
     
  15. rubic_

    rubic_ Женя

    Публикаций:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    121
    Адрес:
    Омск
    ок, ничего пока не понял, но разберусь)
     
  16. rubic_

    rubic_ Женя

    Публикаций:
    0
    Регистрация:
    9 июл 2007
    Сообщения:
    121
    Адрес:
    Омск
    все проблема решена, правда с помощью Winspector. спс wsd, twgt