![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создать окно [D5, WinME, WinXP]
Керик © (2002-12-31 07:57:00)Помогите! Как создать невидимое окно, не используя VCL, и принимать на него нужные мне сообщения?
Керик (2003-01-01 23:07:00) [1]Alex Konshin! Для того, чтобы только принимать сообщения! Я об этом писал в вопросе!
Alex Konshin (2003-01-01 18:39:00) [2]Кстати, а для чего тебе нужно невидимое окно? Спрашиваю потому, что обычно такая надобность возникает при использовании Winsock.
Если это твой случай, то знай, что в Winsock2 можно обойтись без такого окна - там можно использовать events.
Юрий Зотов (2003-01-01 12:31:00) [3]
program HelloWorld;
uses
Windows, Messages;
// Оконная функция - обрабатывает все поступающие окну сообщения.
function WndFunc(Wnd, Msg: DWord; wParam, lParam: integer): integer; stdcall;
var
DC: HDC;
PaintStruct: TPaintStruct;
Rect: TRect;
begin
case Msg of
WM_Paint:
begin // Если поступило сообщение WM_Paint,
DC := BeginPaint(Wnd, PaintStruct); // то подготовить отрисовку,
GetClientRect(Wnd, Rect); // получить клиентскую область и в ее центре отрисовать текст,
DrawText(DC, "Hello, World!", -1, Rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER);
EndPaint(Wnd, PaintStruct); // затем сообщить системе, что рисование завершено
Result := 0 // и что сообщение WM_Paint обработано.
end;
WM_Destroy:
begin // Если поступило сообщение WM_Destroy,
PostQuitMessage(0); // то послать в очередь потока сообщение WM_Quit
Result := 0 // и сообщить системе, что WM_Destroy обработано.
end
else Result := DefWindowProc(Wnd, Msg, wParam, lParam) // Для других сообщений вызвать стандартную оконную функцию.
end
end { of WndFunc };
const
AppName = "Project1";
var
Msg: TMsg;
WndClass: TWndClassEx;
begin { main }
// Заполняем запись WndClass и регистрируем в системе класс окна
with WndClass do
begin
cbSize := SizeOf(WndClass);
Style := CS_HRedraw or CS_VRedraw;
lpfnWndProc := @WndFunc;
hIcon := LoadIcon(0, IDI_Application);
hCursor := LoadCursor(0, IDC_Arrow);
hbrBackground := hBrush(Color_Window);
lpszMenuName := Nil;
lpszClassName := AppName;
hIconSm := hIcon
end;
WndClass.hInstance := hInstance;
RegisterClassEx(WndClass);
// Создаем и показываем окно заданного класса
CreateWindowEx(0, AppName, AppName, WS_OverlappedWindow or WS_Visible, // Если убрать WS_Visible, окно будет невидимым
CW_UseDefault, CW_UseDefault, CW_UseDefault, CW_UseDefault, 0, 0, hInstance, Nil);
// Цикл обработки сообщений (работает, пока не поступит сообщение WM_Quit).
while GetMessage(Msg, 0, 0, 0) do // Выбрать сообщение из очереди потока
begin // и, если это сообщение не WM_Quit, то
TranslateMessage(Msg); // преобразовать сообщение клавиатуры
DispatchMessage(Msg) // и вызвать функцию окна Msg.hWnd
end;
// Передаем системе код завершения программы
Halt(Msg.wParam)
end.
Керик (2003-01-01 07:13:00) [4]Дайте мне пример с CreateWindow, плиз!
Alex Konshin (2002-12-31 09:53:00) [5]Пару AllocateHWnd/DeallocateHWnd использует класс TThread.
Чем не пример?
Evgeny (2002-12-31 09:31:00) [6]Берешь готовый пример по минимальному окну (таких примеров масса) и убираешь одну команду ShowWindow. Но только как ты это окно потом закрывать собираешься?
Alex Konshin (2002-12-31 08:56:00) [7]AllocateHWnd, Classes
Наезжалкин (2002-12-31 08:39:00) [8]CreateWindow() WinAPI