Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.01.21;
Скачать: CL | DM;

Вниз

Как в DLL создать окно?   Найти похожие ветки 

 
Floyn ©   (2001-11-20 10:00) [0]

Привет, Народ!
1. Подскажите, как в DLL создать окно и экспортировать функцию, возвращающую его HWND. С помощью WinAPI окно создавал. А куда в DLL запихнуть цикл обработки сообщений, регистрацию класса не пойму. (Создание окна - непосредственно в экспортируемой функции, наверное).
2. Объясите еще, почему, если я пробую выносить регистрацию класса окна в отдельную процедуру, RegisterClass возвращает 0 (это уже не в DLL)?


 
Иван Шихалев ©   (2001-11-20 17:04) [1]

1. Можно в библиотеке отдельной нитью запускать обработку сообщений. Но если окно создается дочерним (не обязательно WS_CHILD или WS_POPUP) от окна в приложении, то сообщения должны обработаться основным циклом.
2. Код приведи. Всегда работало нормально.


 
Floyn ©   (2001-11-20 17:44) [2]

To Иван Шихалев:

Вариант 1 (работает):

program testwindow;

uses
Windows,
Messages;

{оконная процедура}
function WindowProc(hWnd, uMsg, wParam, lParam: Integer): Integer; stdcall;
begin
Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
if uMsg = WM_DESTROY then
Halt;
end;

{создает окно}
function CreateMyWindow(Inst:integer):integer;
var
handle:integer;
Button1, Label1, Edit1: Integer;
hFont: Integer;
begin
handle:=CreateWindowEx(WS_EX_WINDOWEDGE, "MY_WINDOW_CLASS", "TestWindowCaption",
WS_VISIBLE or WS_SIZEBOX or WS_CAPTION or WS_SYSMENU,
363, 278, 305, 65, 0, 0, Inst, nil);
CreateMyWindow:=handle;
end;

var
Inst, Handle:integer;
Msg: TMsg;
WinClass: TWndClassA;
begin
Inst := hInstance;
{эта регистрация работает}
with WinClass do
begin
style := CS_CLASSDC or CS_PARENTDC;
lpfnWndProc := @WindowProc;
hInstance := Inst;
hbrBackground := color_btnface + 1;
lpszClassname := "MY_WINDOW_CLASS";
hCursor := LoadCursor(0, IDC_ARROW);
end;
if (RegisterClass(WinClass)<>0)
then
begin
Handle := createmywindow(Inst);
UpdateWindow(Handle);
while(GetMessage(Msg, Handle, 0, 0)) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end;
end.

Вариант 2 (не работает):

...

{не работающая функция регистрации}
function RegisterMyClass(hInst:integer; wndproc:pointer):integer;
var
WinClass: TWndClassA;
begin
with WinClass do
begin
style := CS_CLASSDC or CS_PARENTDC;
lpfnWndProc := wndproc;
hInstance := hInst;
hbrBackground := color_btnface + 1;
lpszClassname := "MY_WINDOW_CLASS";
hCursor := LoadCursor(0, IDC_ARROW);
end;
RegisterMyClass:=RegisterClass(WinClass);
end;

var
Inst, Handle:integer;
Msg: TMsg;
begin
Inst := hInstance;
if (RegisterMyClass(Inst,@WindowProc)<>0)
then
begin
Handle := createmywindow(Inst);
UpdateWindow(Handle);
while(GetMessage(Msg, Handle, 0, 0)) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end;
end.

С моей точки зрения они идентичны...



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

Текущий архив: 2002.01.21;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.006 c
14-66345
fliz
2001-11-19 18:20
2002.01.21
Намыльте мне книгу


1-66241
Raven
2001-12-28 17:15
2002.01.21
Потоки


14-66351
Mihan
2001-11-26 18:48
2002.01.21
Где достать?.......


3-66219
-=CrazyFish=-
2001-12-17 23:26
2002.01.21
Восстановление БД Access


14-66352
wipr
2001-11-26 18:05
2002.01.21
Компиляция в Delphi5