Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/10: Рейтинг темы: голосов - 10, средняя оценка - 5.00
xcv
0 / 0 / 1
Регистрация: 18.07.2011
Сообщений: 50
#1

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

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

Помогите пожалуйста разобраться с двумя проблемками...
создаю окно следующим образом:
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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2012, 13:47
Ответы с готовыми решениями:

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

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

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

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

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

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

как можно ограничить минимальный размер окна?
WM_SIZING в помощь. А вообще, есть раздел http://www.cyberforum.ru/win-api/
1
xcv
0 / 0 / 1
Регистрация: 18.07.2011
Сообщений: 50
14.08.2012, 14:46  [ТС] #3
со вторым окном разобрался, а вот с минимальным размером пока никак, буду копать читать дальше, а насчет раздела.... стыдно мне пока за пределы раздела для новичков вылазить =)
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25968 / 17412 / 6906
Регистрация: 22.10.2011
Сообщений: 30,656
Записей в блоге: 6
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2012, 15:35

2 программы с окнами
Помогите создать 2 программы. 1) Программа должна выстраивать все открытые...

Проблема с MDI окнами
Есть главная форма с которой запускаются child - окна, на которых есть таблица...

и снова MDI... преключение м/у Child-окнами
Всем привет! Подскажите пожалуйста, как в MDI приложениее сделать так чтобы...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru