-
Здравствуйте. Как создать несколько окон(т.е. при необходиости вызывать)?
-
Ну... Если глубоко не вдаваться в подробности, то несколько раз вызвать CreateWindow()
-
А как же TWndClassEx? или только для главного окна? Где вызывать CreateWindowEX? и для чего ShowWindow?
-
В VCL взвать окно просто Form.Show. а winapi....????
-
> [2] Я__ (15.08.14 00:35)
Класс окна регистрируется один раз. CreateWindowEX вызывается столько, сколько нужно экземпляров окон. ShowWindow с флагом SW_SHOW вызывается столько, сколько нужно видимых окон.
-
Приветствую всех. Переписываю с VCL на WinPI проект с 7 или 8 окнами. Основная офрма постоянно использует компоненты двух форм. Есть некие наработки: Function WinProc(Form: hwnd; Msg: Cardinal; wparam: WParam; LParam: Cardinal): lresult; Stdcall; Var
Rect: TRect; Begin
Result := 0; 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); Else Result := DefWindowProc(Form, Msg, WParam, LParam); End; End;
procedure Ocno;
begin
WndClassEx.cbSize := SizeOf(WndClassEx); WndClassEx.lpszClassName := 'FindWindow'; WndClassEx.style := cs_hredraw or cs_vredraw; WndClassEx.hInstance := HInstance; WndClassEx.lpfnWndProc := @childwindowproc; 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'; 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;
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, 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 - грубо говоря по нажатию кнопки. Если не тяжело и не затруднит, приведите рабочий пример с двумя окнами (Лучше больше). И еще, как правильно закрыть вызываемые окна?
-
CreateWindowEx у тебя только один раз вызван, поэтому окно одно. Слушай может ты не много окон хочешь в режиме SDI, а устарелый режим MDI, но не можешь обьяснить толком?
-
как один раз вызван > Form := CreateWindowEx( WS_EX_OVERLAPPEDWINDOW, WndClassEx. > lpszClassName, 'Демонстрация WinAPI',
> HWnd1 := CreateWindowEx(0,'FindWindow', 'Дочернее', WS_OVERLAPPEDWINDOW, > 10 ,70,200,130, Form, 0,HInstance, NIL);
Rouse_ © ----- Спасибо что помогаете, НО ХОТЕЛОСЬ БЫ рабочий пример с двумя окнами (Лучше больше). Не обижайтесь. Спасибо!
-
> а устарелый режим MDI
нет. нормальное окною
-
> Rouse_ © ----- Спасибо что помогаете, НО ХОТЕЛОСЬ БЫ рабочий > пример с двумя окнами (Лучше больше). Не обижайтесь. Спасибо! >
Т.е. приложение на API в виде диалога с кнопкой, при нажатии на которую создаются новые немодальные окна устроит?
-
Да.
-
Мне хочется просто понять принцип создания и вызова немодальных окон из родительского
-
Ок, после выходных накидаю примерчик :)
-
Rouse_ © Спасибо огромное.
-
А кто сожет ответить --- ListView(SysLstView32), содержит строки и если он не в фокусе, то выделение строки пропадает и появляестя когда в фокусе. как исправить? В Delphi (VCL) нужно было сделать --- ListView.HideSelection := False. А в WinAPI как? Спасибо.
-
стиль LVS_SHOWSELALWAYS
-
Как обработать Click и DblClick по ListView как и куда писать и как изенить цвет текста выделенной строки?
-
далее будет вопрос про клавиатуру ...
-
> ухты > далее будет вопрос про клавиатуру ...
Вам делать больше нечего???? не хотите помогать--не лезте
-
> Я__ (15.08.14 19:51) [11] > Мне хочется просто понять принцип создания и вызова немодальных > окон из родительского
На, разбирайся, код наколеночный, но идея думаю понятна: http://rouse.drkb.ru/tmp/amf.zip
-
Rouse_ © Спасипо. посмотрим
|