Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2016.02.28;
Скачать: [xml.tar.bz2];

Вниз

Несколько окон WinAPI   Найти похожие ветки 

 
Я__   (2014-08-14 23:28) [0]

Здравствуйте.
Как создать несколько окон(т.е. при необходиости вызывать)?


 
Rouse__   (2014-08-15 00:00) [1]

Ну... Если глубоко не вдаваться в подробности, то несколько раз вызвать CreateWindow()


 
Я__   (2014-08-15 00:35) [2]

А как же TWndClassEx? или только для главного окна? Где вызывать CreateWindowEX? и для чего ShowWindow?


 
Я__   (2014-08-15 00:40) [3]

В VCL взвать окно просто Form.Show. а winapi....????


 
junglecat   (2014-08-15 09:32) [4]

> [2] Я__   (15.08.14 00:35)

Класс окна регистрируется один раз.
CreateWindowEX вызывается столько, сколько нужно экземпляров окон.
ShowWindow с флагом SW_SHOW вызывается столько, сколько нужно видимых окон.


 
Я__   (2014-08-15 18:41) [5]

Приветствую всех. Переписываю с 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 - грубо говоря по нажатию кнопки.

Если не тяжело и не затруднит, приведите рабочий пример с двумя окнами (Лучше больше).
И еще, как правильно закрыть вызываемые окна?


 
Rouse_ ©   (2014-08-15 18:53) [6]

CreateWindowEx у тебя только один раз вызван, поэтому окно одно.
Слушай может ты не много окон хочешь в режиме SDI, а устарелый режим MDI, но не можешь обьяснить толком?


 
Я__   (2014-08-15 19:13) [7]

как один раз вызван
> Form := CreateWindowEx( WS_EX_OVERLAPPEDWINDOW,  WndClassEx.
> lpszClassName, "Демонстрация WinAPI",


> HWnd1 :=   CreateWindowEx(0,"FindWindow", "Дочернее", WS_OVERLAPPEDWINDOW,
>  10 ,70,200,130, Form, 0,HInstance, NIL);


Rouse_ © ----- Спасибо что помогаете, НО ХОТЕЛОСЬ БЫ  рабочий пример с двумя окнами (Лучше больше). Не обижайтесь. Спасибо!


 
Я__   (2014-08-15 19:16) [8]


> а устарелый режим MDI

нет.
нормальное окною


 
Rouse_ ©   (2014-08-15 19:44) [9]


> Rouse_ © ----- Спасибо что помогаете, НО ХОТЕЛОСЬ БЫ  рабочий
> пример с двумя окнами (Лучше больше). Не обижайтесь. Спасибо!
>

Т.е. приложение на API в виде диалога с кнопкой, при нажатии на которую создаются новые немодальные окна устроит?


 
Я__   (2014-08-15 19:49) [10]

Да.


 
Я__   (2014-08-15 19:51) [11]

Мне хочется просто понять принцип создания и вызова немодальных окон из родительского


 
Rouse_ ©   (2014-08-15 19:52) [12]

Ок, после выходных накидаю примерчик :)


 
Я__   (2014-08-15 19:53) [13]

Rouse_ © Спасибо огромное.


 
Я__   (2014-08-16 16:58) [14]

А кто сожет ответить --- ListView(SysLstView32), содержит строки и если он не в фокусе, то выделение строки пропадает и появляестя когда в фокусе. как исправить?
В Delphi (VCL) нужно было сделать --- ListView.HideSelection := False.
А в WinAPI как? Спасибо.


 
junglecat   (2014-08-16 21:11) [15]

стиль LVS_SHOWSELALWAYS


 
Я__   (2014-08-16 22:51) [16]

Как обработать Click и DblClick по ListView как и куда писать и как изенить цвет текста выделенной строки?


 
ухты   (2014-08-17 01:08) [17]

далее будет вопрос про клавиатуру ...


 
Я__   (2014-08-17 01:13) [18]


> ухты  
> далее будет вопрос про клавиатуру ...

Вам делать больше нечего???? не хотите помогать--не лезте


 
Rouse_ ©   (2014-08-18 13:52) [19]


> Я__   (15.08.14 19:51) [11]
> Мне хочется просто понять принцип создания и вызова немодальных
> окон из родительского

На, разбирайся, код наколеночный, но идея думаю понятна: http://rouse.drkb.ru/tmp/amf.zip


 
Я__   (2014-08-18 23:27) [20]

Rouse_ © Спасипо. посмотрим



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2016.02.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.002 c
2-1407940463
SKIPtr
2014-08-13 18:34
2016.02.28
событие программы при завершении винда


15-1433936637
brother
2015-06-10 14:43
2016.02.28
Помогите просчитать значение формулы


15-1433224643
Pavelnk
2015-06-02 08:57
2016.02.28
Нарисовать трапецию


2-1408206610
nokia4ever
2014-08-16 20:30
2016.02.28
text


15-1433937698
Kerk
2015-06-10 15:01
2016.02.28
Чтение RFID-карт





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский