![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Несколько окон WinAPI
Я__ © (2014-08-14 23:28:00)Здравствуйте.
Как создать несколько окон(т.е. при необходиости вызывать)?
Я__ (2014-08-18 23:27:00) [1]Rouse_ © Спасипо. посмотрим
Rouse_ (2014-08-18 13:52:00) [2]
> Я__ (15.08.14 19:51) [11]
> Мне хочется просто понять принцип создания и вызова немодальных
> окон из родительского
На, разбирайся, код наколеночный, но идея думаю понятна: http://rouse.drkb.ru/tmp/amf.zip
Я__ (2014-08-17 01:13:00) [3]
> ухты
> далее будет вопрос про клавиатуру ...
Вам делать больше нечего???? не хотите помогать--не лезте
ухты (2014-08-17 01:08:00) [4]далее будет вопрос про клавиатуру ...
Я__ (2014-08-16 22:51:00) [5]Как обработать Click и DblClick по ListView как и куда писать и как изенить цвет текста выделенной строки?
junglecat (2014-08-16 21:11:00) [6]стиль LVS_SHOWSELALWAYS
Я__ (2014-08-16 16:58:00) [7]А кто сожет ответить --- ListView(SysLstView32), содержит строки и если он не в фокусе, то выделение строки пропадает и появляестя когда в фокусе. как исправить?
В Delphi (VCL) нужно было сделать --- ListView.HideSelection := False.
А в WinAPI как? Спасибо.
Я__ (2014-08-15 19:53:00) [8]Rouse_ © Спасибо огромное.
Rouse_ (2014-08-15 19:52:00) [9]Ок, после выходных накидаю примерчик :)
Я__ (2014-08-15 19:51:00) [10]Мне хочется просто понять принцип создания и вызова немодальных окон из родительского
Я__ (2014-08-15 19:49:00) [11]Да.
Rouse_ (2014-08-15 19:44:00) [12]
> Rouse_ © ----- Спасибо что помогаете, НО ХОТЕЛОСЬ БЫ рабочий
> пример с двумя окнами (Лучше больше). Не обижайтесь. Спасибо!
>
Т.е. приложение на API в виде диалога с кнопкой, при нажатии на которую создаются новые немодальные окна устроит?
Я__ (2014-08-15 19:16:00) [13]
> а устарелый режим MDI
нет.
нормальное окною
Я__ (2014-08-15 19:13:00) [14]как один раз вызван
> Form := CreateWindowEx( WS_EX_OVERLAPPEDWINDOW, WndClassEx.
> lpszClassName, 'Демонстрация WinAPI',
> HWnd1 := CreateWindowEx(0,'FindWindow', 'Дочернее', WS_OVERLAPPEDWINDOW,
> 10 ,70,200,130, Form, 0,HInstance, NIL);
Rouse_ © ----- Спасибо что помогаете, НО ХОТЕЛОСЬ БЫ рабочий пример с двумя окнами (Лучше больше). Не обижайтесь. Спасибо!
Rouse_ (2014-08-15 18:53:00) [15]CreateWindowEx у тебя только один раз вызван, поэтому окно одно.
Слушай может ты не много окон хочешь в режиме SDI, а устарелый режим MDI, но не можешь обьяснить толком?
Я__ (2014-08-15 18:41:00) [16]Приветствую всех. Переписываю с VCL на WinPI проект с 7 или 8 окнами. Основная офрма постоянно использует компоненты двух форм.
Есть некие наработки:
Function WinProc(Form: hwnd; // Окно-получатель каждого входящего сообщения
Msg: Cardinal; // Само сообщение
wparam: WParam; // Первый и второй уточняющие параметры сообщения
LParam: Cardinal): lresult; Stdcall; // Оконная процедура, здесь мы задаем реакцию программы на все нужные нам сообщения
Var
Rect: TRect; // Для записи размеров клиентской области нашего окна
Begin
Result := 0; // Чтобы в случае сбоя программы до последней строки функции Windows правильно определила ошибку
Case Msg Of
WM_CREATE: // При создании окна:
Begin
//Создаём кнопку
listbox := CreateWindowEx(0, 'listbox','',WS_CHILD Or WS_VISIBLE, 250, 0, Form, Form, Form, listboxid, HInstance,nil);
label1 := CreateWindowEx(0, 'Static', '123',WS_CHILD Or WS_VISIBLE, 10 ,10, 100, 15, Form, label1ID, HInstance,nil);
button := CreateWindowEx (0, 'BUTTON', 'Кнопка', WS_CHILD Or WS_VISIBLE Or BS_PUSHBUTTON, 0, 0, 100, 20, Form, ButtonID, HInstance, NIL);
SendMessage(GetDlgItem(Form, ButtonID), WM_SETFONT, 0, -1); // Меняем шрифт
End;
WM_COMMAND: // Через это сообщение определяем нажатие на кнопку
//Если мессага пришла от кнопки
If LoWord (WParam) = ButtonID Then
//И если это было нажатие
If HiWord (WParam) = BN_CLICKED then
begin
If RegisterClassEx(WndClassEx) = 0 Then
MessageBox(0, 'Невозможно зарегистрировать класс окна', 'Ошибка', MB_OK Or MB_ICONHAND)
Else
Begin
HWnd1 := CreateWindowEx(0,'FindWindow', 'Дочернее', WS_OVERLAPPEDWINDOW, 10 ,70,200,130, Form, 0,HInstance, NIL);
SetParent(HWnd1, 0);
ShowWindow(HWnd1, SW_SHOW);
If HWnd1 = 0 Then // Если окно не создалось:
MessageBox (0, 'Окно не создалось!',
'Ошибка', MB_OK Or MB_ICONHAND)
Else
Begin
ShowWindow (HWnd1, SW_SHOWNORMAL); // Показывем окно
UpdateWindow(HWnd1); // Перерисовываем окно
End;
While GetMessage(Msg1, 0, 0, 0) Do
Begin
TranslateMessage(Msg1);
DispatchMessage(Msg1);
End;
end;
WM_DESTROY: // При уничтожении окна (можно и не задавать реакцию - прога автоматически выгрузится, однако оставив след в памяти)
PostQuitMessage(0); // Помещает в очередь сообщений сообщение завершения работы программы (WM_QUIT)
Else // Если пришедщее сообщение мы не определили:
Result := DefWindowProc(Form, Msg, WParam, LParam); // Эта функция обрабатывает ВСЕ ОСТАЛЬНЫЕ сообщения по умолчанию
End; // Конец блока Case
End;
procedure Ocno;
//var
// WndClassEx1: TWndClassEx; // Класс окна - несёт инфу об окне (запись)
begin
WndClassEx.cbSize := SizeOf(WndClassEx); // Размер структуры
WndClassEx.lpszClassName := 'FindWindow'; // Имя класса окна (для примера - второй параметр функции FindWindow)
WndClassEx.style := cs_hredraw or cs_vredraw; // Стили окна - в данном случае окно будет перерисовываться при изменении как горизонтальных, так и вертикальных размеров
WndClassEx.hInstance := HInstance; // Ищи описание выше
WndClassEx.lpfnWndProc := @childwindowproc;//@WinProc; // адрес окнной процедуры
WndClassEx.cbClsExtra := 0;
WndClassEx.cbWndExtra := 0;
WndClassEx.hIcon := LoadIcon(HInstance, MakeIntResource('MAINICON')); // Икнока окна
WndClassEx.hIconSm := LoadIcon(HInstance, MakeIntResource('MAINICON')); // Тоже иконка (но маленькая :)
WndClassEx.hCursor := LoadCursor(0, IDC_ARROW); // Курсор мыши для окна (у нас - стрелка)
WndClassEx.hbrBackground := COLOR_BTNFACE + 1; // Фон окна
WndClassEx.lpszMenuName := NIL; // Указатель на меню (у нас ме
registerclassex(WndClassEx);// регистрируем в системе новый класс окна
end;
Procedure WinMain; // Эта процедура сформирует окно и отобразит его, запустив цикл обработки сообщений
Begin
WndClassEx.cbSize := SizeOf(TWndClassEx);
WndClassEx.lpszClassName := 'APIWindow'; // Имя класса окна (для примера - второй параметр функции FindWindow)
WndClassEx.style := CS_VREDRAW Or CS_HREDRAW; // Стили окна - в данном случае окно будет перерисовываться при изменении как горизонтальных, так и вертикальных размеров
WndClassEx.hInstance := HInstance; // Ищи описание выше
WndClassEx.lpfnWndProc := @WinProc; // адрес окнной процедуры
WndClassEx.cbClsExtra := 0;
WndClassEx.cbWndExtra := 0;
WndClassEx.hIcon := LoadIcon(HInstance, MakeIntResource('MAINICON')); // Икнока окна
WndClassEx.hIconSm := LoadIcon(HInstance, MakeIntResource('MAINICON')); // Тоже иконка (но маленькая :)
WndClassEx.hCursor := LoadCursor(0, IDC_ARROW); // Курсор мыши для окна (у нас - стрелка)
WndClassEx.hbrBackground := COLOR_BTNFACE + 1; // Фон окна
WndClassEx.lpszMenuName := NIL; // Указатель на меню (у нас меню нет)
//registerclassex(WndClassEx);// регистрируем в системе новый класс окна
// Теперь регистрируем класс окна в системе
If RegisterClassEx(WndClassEx) = 0 Then
MessageBox(0, 'Невозможно зарегистрировать класс окна', 'Ошибка', MB_OK Or MB_ICONHAND)
Else
Begin
// Создаём окно
Form := CreateWindowEx( WS_EX_OVERLAPPEDWINDOW, WndClassEx.lpszClassName, 'Демонстрация WinAPI',
WS_OVERLAPPEDWINDOW,
1000,100, //CW_USEDEFAULT, 0,
500, 500,
0, 0,
HInstance,
NIL);
SendMessage(GetDlgItem(Form, ButtonID), WM_SETFONT, 0, -1);
If Form = 0 Then
MessageBox (0, 'Окно не создалось!',
'Ошибка', MB_OK Or MB_ICONHAND)
Else
Begin
ShowWindow (Form, SW_SHOWNORMAL);
UpdateWindow(Form);
While GetMessage(MMsg, 0, 0, 0) Do
Begin
TranslateMessage(MMsg);
DispatchMessage(MMsg);
End;
Halt(MMsg.WParam);
End;
End;
End;
Begin
Ocno; WinMain;
End.
Допустим зарегистрировал класс для каждого окна. тогда где надо прописать создание (createWindow) окна? А showWindow - грубо говоря по нажатию кнопки.
Если не тяжело и не затруднит, приведите рабочий пример с двумя окнами (Лучше больше).
И еще, как правильно закрыть вызываемые окна?
junglecat (2014-08-15 09:32:00) [17]> [2] Я__ (15.08.14 00:35)
Класс окна регистрируется один раз.
CreateWindowEX вызывается столько, сколько нужно экземпляров окон.
ShowWindow с флагом SW_SHOW вызывается столько, сколько нужно видимых окон.
Я__ (2014-08-15 00:40:00) [18]В VCL взвать окно просто Form.Show. а winapi....????
Я__ (2014-08-15 00:35:00) [19]А как же TWndClassEx? или только для главного окна? Где вызывать CreateWindowEX? и для чего ShowWindow?
Rouse__ (2014-08-15 00:00:00) [20]Ну... Если глубоко не вдаваться в подробности, то несколько раз вызвать CreateWindow()