зрасте, начал сегодня тут 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. то есть является чем-то вроде синонима. как быть в общем.
В wc.hbrBackground нужно записать хендл кисти, которой будет отрисовываться фон окна. Или указать одну из констант COLOR_*, чтобы использовать стандартный системный цвет. Кисть создается функцией CreateBrush.
Раз у меня седня ночь "умных" вопросов, задам еще 1. Сильно не ругайте за 2 вопроса в 1 теме, просто он мелкий, и не стоит целой темы. не до конца понимаю суть данного параметра структуры WNDCLASSEX lрfnWndProc: Адрес процедуры окна, ответственной за окна, создаваемых из класса. я на его месте указываю адрес процедуры, которая обрабатыват сообщения. 1) причем тогда тут(ответственной за окна, создаваемых из класса.) я же не создаю окон. И по какому принципы операционка шлет сообщения моему приложению и другим в часности? код Iczelion'a Код (Text): WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInst 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 invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\ WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\ CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\ hInst,NULL mov hwnd,eax invoke ShowWindow, hwnd,SW_SHOWNORMAL invoke UpdateWindow, hwnd .WHILE TRUE invoke GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL hdc:HDC LOCAL ps:PAINTSTRUCT LOCAL rect:RECT .IF uMsg==WM_DESTROY invoke PostQuitMessage,NULL .ELSEIF uMsg==WM_PAINT invoke BeginPaint,hWnd, ADDR ps mov hdc,eax invoke GetClientRect,hWnd, ADDR rect invoke DrawText, hdc,ADDR OurText,-1, ADDR rect, \ DT_SINGLELINE or DT_CENTER or DT_VCENTER invoke EndPaint,hWnd, ADDR ps .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax, eax ret WndProc endp end start предполагаю следующее, что когда опер-ка шлет сообщение, вызывается процедура из этого пар-ра приложения, и если обработчик есть, то обрабатывается. Если нет, то спускается на тормозах фун-ей DefWindowProc. Вопрос еще раз по какому принципы операционка шлет сообщения моему приложению и другим в часности? сори за орфографию, не сплю 2 сутки.
Класс регистрируется для того, чтобы потом создавать окна (одно или несколько) с требуемыми параметрами (например курсор, иконка, способность принимать double click). Член wc.lpfnWndProc должен содержать адрес процедуры обработки сообщений для каждого окна этого класса. Когда что-то происходит (например, нажали клавишу сворачивания окна), в эту процедуру передается соответствующее сообщение (например, WM_SIZE) с некоторыми параметрами (wParam, lParam), которое она должна обработать. Если обрабатывать сообщение необходимости нет, нужно передать хэндл окна, сообщение и параметры в процедуру окна по-умолчанию. Это делается с помощью вызова DefWindowProc.
Поспи и потом поучи матчать да ну: в порядке очереди поправка: если есть твой обработчик У каждого окна есть свой обработчик. При регистрации своего класса ты его назначаеш через lрfnWndProc. Функцией DefWindowProc ты передаёш управление стандартному обработчику сообщений, она обрабатывает а не спускает на тормоза. Вроде так
выспался..)) язык больно понравился, на сон время много уходит)) ну я это имел ввиду) про очередь по подробнее, список , порядок и так далее если можно.
покапал, ответа на мой вопрос там нет( или я не нашел. нашел только как измменить количество принимаемых приложением сообщений и фун-ю PostMessage, которая позволяет, как я понял, отправить сообщение конкретному приложению. А какие сообщения посылает винда, при загрузке моего приложения, как она узнает что мне нужно прорисовать текст например? ведь я не вызываю процедуру прорисовки явно, лишь указываю обработчик. Как винда узнает, что мне нужно послать сообщение WM_PAINT. значит у нее должен быть стандартный набор сообщений, который посылается при создании приложения, или как-то иначе. Мож я конечно тупые вопросы задаю. но не хотелось бы иметь пробелы на самом старте(.