0 / 0 / 1
Регистрация: 18.07.2011
Сообщений: 51
1

WINAPI работа с окнами

14.08.2012, 13:47. Показов 2796. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста разобраться с двумя проблемками...
создаю окно следующим образом:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
procedure runproject; // действие по нажатию кнопки
begin
Wnd1 := CreateWindowEx ( 0, WndClass, 'Добавление', WS_SYSMENU or WS_MINIMIZEBOX or WS_SIZEBOX or WS_MAXIMIZEBOX, (GetSystemMetrics(0) - (GetSystemMetrics(0) Div 2)) div 2, (GetSystemMetrics(1) - (GetSystemMetrics(1) Div 2)) div 2, GetSystemMetrics(0) Div 2, GetSystemMetrics(1) Div 2, 0, 0, hInstance, nil);
SendMessage(Wnd1, WM_SETICON, 1, LoadIcon(HInstance, 'MAINICON')); //иконка второй формы
ShowWindow( Wnd1, SW_SHOWNORMAL );
end;
 
//Функция обрабатывающая сообщения
function WindowProc( Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin     //Msg - полученное сообщение
   case Msg of      //Если програма хочет закрыться
      WM_DESTROY: begin
                  PostQuitMessage( 0 );  //Закрываем её
                  Result := 0;
                  Exit;  //дальнеёшие сообщения обрабатывать нету смысла - мы закрываемся
                  end;
      WM_COMMAND: // WM_COMMAND посылается при нажатии кнопок
         case LoWord( wParam ) of
         //Обрабатываем нажатия кнопок
         101:  runproject; // действие по кнопке
         end;
       WM_SIZE:
    begin
       GetWindowREct(Wnd,R);
       SetWindowPos(Buttons, HWND_BOTTOM, R.Right-R.Left-45, R.Bottom-R.Top-60, 25, 25, SWP_NOACTIVATE);
    end;
   else
       Result := DefWindowProc( Wnd, Msg, wParam, lParam ); // DefWindowProc обеспечивает обработку тех сообщений окна, которые не обрабатывает прикладная программа.
   end;
end;
 
BEGIN
// Заполняем структуру TWndClassEx
   with Wc do
   begin
   cbSize := SizeOf( Wc );
   lpfnWndProc := @WindowProc; //указатель на оконную процедуру
   cbClsExtra := 0; //Выделенная память, используемая программой по своему усмотрению.
   cbWndExtra := 0; //Выделенная память, используемая программой по своему усмотрению.
   hInstance := hInstance; //описатель экземпляра приложения
   hbrBackground := COLOR_BTNFACE+1; //цвет фона формы. 
   lpszClassName := WndClass; //имя класса создаваемого объекта
   end;
// Регистрируем класс в системе
   RegisterClassEx( Wc );
//Создаём окно
  Wnd := CreateWindowEx ( 0, WndClass, WndCaption, WS_SYSMENU or WS_MINIMIZEBOX or WS_SIZEBOX or WS_MAXIMIZEBOX, (GetSystemMetrics(0) - (GetSystemMetrics(0) Div 2)) div 2, (GetSystemMetrics(1) - (GetSystemMetrics(1) Div 2)) div 2, GetSystemMetrics(0) Div 2, GetSystemMetrics(1) Div 2, 0, 0, hInstance, nil);
  SendMessage(Wnd, WM_SETICON, 1, LoadIcon(HInstance, 'MAINICON')); //иконка приложения
  // Показываем окно программы
  ShowWindow( Wnd, SW_SHOWNORMAL );
// Создаём элементы окна
   GetWindowREct(Wnd,R);
   Buttons := CreateWindowEx( WS_EX_STATICEDGE, 'Button', PAnsiChar(' + '), BS_DEFPUSHBUTTON or WS_VISIBLE or WS_CHILD, R.Right-R.Left-45, R.Bottom-R.Top-60, 25, 25, Wnd, 101, hInstance, nil );
  
// Цикл обработки сообщений
 while GetMessage (Msg,0,0,0) do
  begin
   TranslateMessage(Msg);
   DispatchMessage(Msg);
   if Msg.message = WM_KEYDOWN then// приложение получает сообщение что клавиша нажата
    begin
     if Msg.wParam in [VK_ESCAPE] then// если это кнопка esc
     Exit;  // закрываем приложение
    end;
  end;
 Halt( Msg.wParam );
 FreeLibrary(hRichDll);
END.
а теперь собственно проблемки:
1. прога запускается все работает, если нажать на кнопку созданную на основной форме то создается вторая форма (так в принципе и было задумано), но если попытаться закрыть эту вторую форму - то закрывается вся программа, а надо чтобы только вторая форма закрывалась (аналогично действие по клавише "esc")
2. пользователь может менять размер окна программы (так и должно быть), как можно ограничить минимальный размер окна?
Заранее спасибо за помощь.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.08.2012, 13:47
Ответы с готовыми решениями:

Работа с окнами
Как выстроить окна в алфавитном порядке?

Работа с всплывающими окнами
Как сделать, что бы при нажатии кнопки на экране появлялось N-ное количество окон с определённой...

Работа с дочерними окнами
Есть TWebBrowser. После загрузки страницы, на ней заполняется поле отправки письма . Проблема в том...

Работа с WinAPI (PostMessage)
проблема с окном нарисованным в дериктХ,надло послать строку чату,например, фокус получают чат если...

3
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
14.08.2012, 14:20 2
Цитата Сообщение от xcv Посмотреть сообщение
если попытаться закрыть эту вторую форму - то закрывается вся программа, а надо чтобы только вторая форма закрывалась
Ты создал два окна с одинаковыми оконными функциями, они и ведут себя одинаково. Главное окно - это главное окно, оно должно высылать PostQuitMessage при получении WM_DESTROY. А в другом окне достаточно обработать WM_CLOSE, и разрушить само себя через DestroyWindow. Но для этого надо зарегистрировать два разных класса с разными оконными функциями.

как можно ограничить минимальный размер окна?
WM_SIZING в помощь. А вообще, есть раздел https://www.cyberforum.ru/win-api/
1
0 / 0 / 1
Регистрация: 18.07.2011
Сообщений: 51
14.08.2012, 14:46  [ТС] 3
со вторым окном разобрался, а вот с минимальным размером пока никак, буду копать читать дальше, а насчет раздела.... стыдно мне пока за пределы раздела для новичков вылазить =)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
14.08.2012, 15:35 4
Лучший ответ Сообщение было отмечено volvo как решение

Решение

Проще (с минимальным размером) будет вот так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
function WindowProc( Wnd: HWND; Msg: UINT; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
begin
   Result := 0;
   case Msg of
      WM_GETMINMAXINFO:
      begin
         PMinMaxInfo(LParam)^.ptMinTrackSize.X := 200; // 200 - Минимально допустимая ширина
         PMinMaxInfo(LParam)^.ptMinTrackSize.Y := 120; // 120 - Минимально допустимая высота
      end;
      // ... остальные сообщения
 
   end; // case
end;
1
14.08.2012, 15:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.08.2012, 15:35
Помогаю со студенческими работами здесь

Работа с COM портами WinAPI, конкретно функция ClearCommError
Всем доброго времени суток, я вообще не программист, программирую от случая к случаю, пишу...

Работа с окнами
Пожалуйста помогите мене решить задачи!! очень прошу!! Создать многодокументное приложение, ...

работа с окнами
помогите не представляю как это можно сделать ... в интернете мало информации об этом... Создать...

Работа с окнами
фишка в том что я делаю простенькую програмульку которая делает опрос пользователя .. Тоесть в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru