Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.18;
Скачать: [xml.tar.bz2];




Вниз

Создание окна и кнопки на нем 


unKNOWN uSER   (2002-01-18 00:19) [0]

Можно ли с помощью WinAPI создать окно, а на нем кнопку, при нажатии на которую окно закрывается ?

Ели кто знает как это сделать, то приведите пожалуйста кусок кода.



Adder   (2002-01-18 04:23) [1]

http://www.ict.nsc.ru/~cancel/delphi/index.html



solo   (2002-01-18 14:14) [2]

program Alphabet;
uses
Windows,
Messages;

const
cClassName = "Alphabet"; // Имя класса окна

var
MainHandle : THandle; //индентификатор окна
btnHandle : THandle; //идентификатор кнопки
WndClass: TWndClass; //структура WndClass
Msg: TMsg; //структура для принятия сообщений


procedure CloseWND;
//Закрываем программу
begin
SendMessage(MainHandle, WM_CLOSE, 0, 0);
end;


function WindowProc(hWnd: THandle; uMsg, wParam, lParam: Integer): Integer; {функция окна}
stdcall; export;
//Оконная функция
begin
Result := 0;
case uMsg of
WM_DESTROY: //если uMsg равна WM_DESTROY(код закрытия окна) то закрываемся
begin
postquitmessage(0);
exit;
end;
WM_COMMAND:
if LParam = btnHandle then CloseWND;
end;
Result := DefWindowProc(hWnd, uMsg, wParam, lParam); //удалить остальные сообщения
end;


procedure CreateButton;
// Создание кнопки
begin
btnHandle:=CreateWindow("Button", "Закрыть",
BS_CENTER or BS_VCENTER or WS_CHILD or WS_VISIBLE,
110, 150, 80, 25,
mainHandle, 0, hInstance, nil);
end;


procedure CreateMainForm;
{Создание главного окна программы}
begin
FillChar(WndClass, SizeOf(WndClass), 0); //заполняем структуру нулями
with WndClass do begin
hInstance := SysInit.hInstance; //Обязательный параметр, индентификатор вашего приложения
lpszClassName := cClassName; //имя класса
lpfnWndProc := @WindowProc; //имя функции окна
hbrBackground := COLOR_WINDOW;// //способ заливки клиентской области
hCursor := LoadCursor(0,idc_arrow);//Задаем стандартный курсор
end;
RegisterClass(WndClass); //регистрируем класс
MainHandle := CreateWindow(cClassName,
"",
WS_THICKFRAME or WS_SYSMENU or WS_MAXIMIZEBOX or WS_MINIMIZEBOX or WS_VISIBLE,
0, 0,
300, 250,
0, 0, hInstance, NIL); //создаем окно
if MainHandle = 0 then begin //если произошла ошибка, то выходим
MessageBox(0, "Initialisation failed", NIL, ID_OK);
Exit;
end;
end;

begin
CreateMainForm;// Создание главного окна программы
CreateButton;//Создаем кнопку

while GetMessage(Msg, 0, 0, 0) do
begin //получаем сообщение
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
Halt(Msg.wParam);
end.



Dimaond Cat   (2002-01-19 00:47) [3]

немного корявый пример
1)
procedure CloseWND;
//Закрываем программу
begin
SendMessage(MainHandle, WM_CLOSE, 0, 0);
end;
Зачем самому себе отсылать сообщение о закрытии
2)
Зачем в WindowProc результу присваивать 0 когда он по любому потом получит другое значение от DefWindowProc
3)
Ты зарегистрировал класс, а при закрытии программы регистрацию не снял, есть идея что твоя процедура CloseWND смотрелась бы лучше так
procedure CloseWND;
begin
UnRegisterClass(////);
ExitProcess(///);
end;
4)
А зачем Halt(Msg.wParam); (это реально интересно, чего ты хотел добиться?)








Ghost.   (2002-01-19 12:36) [4]

если надо сразу закртывать и обработать закрытиеююможет лучше так

program Project1;

uses
WinTypes, WinProcs;

begin
MessageBox(GetActiveWindow, "сообщение", "подпись",
MB_ICONINFORMATION OR MB_OK)
end.




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.18;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.04 c
6-57484           Tatosha               2001-12-27 19:21  2002.03.18  
Help with SMTP (NMSMTP)


1-57446           softland              2002-03-02 12:38  2002.03.18  
Работа с TShellListView


3-57301           Labert                2002-02-19 10:23  2002.03.18  
ExecProc подвешивает программу


1-57360           valery_f              2002-03-04 13:27  2002.03.18  
Shell controls (D6)


1-57383           mavandrew             2002-03-01 16:52  2002.03.18  
Копирование файлов.