Форум: "WinAPI";
Текущий архив: 2002.01.21;
Скачать: [xml.tar.bz2];
ВнизКак в 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.01.21;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.003 c