Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> MDI приложение с дочерними окнами в DLL, окно есть, но его не видно 
V
    Опции темы
dvamaster
  Дата 2.4.2009, 07:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 559
Регистрация: 30.6.2004
Где: Россия : Курган

Репутация: 2
Всего: 10



в 100-й раз о плагинах и окнах

MDI приложение, дочерние окна в DLL
Окно создается (дескриптор окна получен), но его не видно

код EXE

Код

program prog;

uses
  Windows, Messages;

{$R WindowsXP.res}

const
  szWndClass: array [0..12] of Char = 'MainDlgClass';

var
  wc: WNDCLASS;
  hw, hmc, hm: HWND;
  m: MSG;

function GetMDIWnd(AParent: HWND; AInst: HMODULE): HWND; stdcall; external 'plg.dll';

function MainProc(Wnd: HWND; uMsg: UINT; lP: LPARAM; wP: WPARAM): LRESULT; stdcall;
var
  ccs: CLIENTCREATESTRUCT;
begin
  Result := 0;
  case uMsg of
    WM_CREATE:
      begin
        ccs.hWindowMenu := 0;
        ccs.idFirstChild := 0;
        hmc := CreateWindow('MDICLIENT', nil, WS_CHILD or WS_CLIPCHILDREN or
          WS_VSCROLL or WS_HSCROLL, 0, 0, 0, 0, Wnd, $CAC, HInstance, @ccs);
        ShowWindow(hmc, SW_SHOW);
      end;
    WM_CLOSE:
      begin
        SendMessage(hmc, WM_MDIDESTROY, hm, 0);
        DestroyWindow(Wnd);
      end;
    WM_DESTROY: PostQuitMessage(0)
  else
    Result := DefFrameProc(Wnd, hm, uMsg, lP, wP)
  end;
end;

begin
  wc.style := CS_VREDRAW or CS_HREDRAW;
  wc.lpfnWndProc := @MainProc;
  wc.cbClsExtra := 0;
  wc.cbWndExtra := 0;
  wc.hInstance := HInstance;
  wc.hIcon := LoadIcon(0, IDI_WINLOGO);
  wc.hCursor := LoadCursor(0, IDC_ARROW);
  wc.hbrBackground := COLOR_APPWORKSPACE;
  wc.lpszMenuName := nil;
  wc.lpszClassName := @szWndClass;
  if RegisterClass(wc) = 0 then
    Exit;
  hw := CreateWindow(@szWndClass, 'MDIFrame', WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, GetDesktopWindow, 0, HInstance, nil);
  ShowWindow(hw, SW_SHOWNORMAL);
  UpdateWindow(hw);
{создание MDI окна}
  hm := GetMDIWnd(hmc, HInstance);
  while GetMessage(m, 0, 0, 0) do
    begin
      if TranslateMDISysAccel(hmс, m)then
        Continue;
      TranslateMessage(m);
      DispatchMessage(m)
    end;
end.


код DLL

Код

library plg;

uses
  Windows,
  Messages;

{$R WindowsXP.res}

const
  szMDIClass: array [0..11] of Char = 'MDIDlgClass';

function MDIWndProc(Wnd: HWND; uMsg: UINT; lP: LPARAM; wP: WPARAM): LRESULT; stdcall;
begin
  Result := 0;
  case uMsg of
    WM_CREATE: ;
  else
    Result := DefMDIChildProc(Wnd, uMsg, lP, wP)
  end;
end;

function GetMDIWnd(AParent: HWND; AInst: HMODULE): HWND; stdcall;
var
  wc: WNDCLASS;
begin
  Result := 0;
  wc.style := CS_VREDRAW or CS_HREDRAW;
  wc.lpfnWndProc := @MDIWndProc;
  wc.cbClsExtra := 0;
  wc.cbWndExtra := 0;
  wc.hInstance := HInstance;
  wc.hIcon := LoadIcon(0, IDI_APPLICATION);
  wc.hCursor := LoadCursor(0, IDC_ARROW);
  wc.hbrBackground := COLOR_WINDOW;
  wc.lpszMenuName := nil;
  wc.lpszClassName := @szMDIClass;
  if RegisterClass(wc) = 0 then
    Exit;
  Result := CreateMDIWindow(@szMDIClass, 'MDI Child', WS_VSCROLL or WS_HSCROLL,
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, AParent,
    HInstance, 0);
  ShowWindow(Result, SW_SHOW);
end;

exports
  GetMDIWnd;

begin
end.


Если в plg.GetMDIWnd использовать не HInstance а AInst, всеравно не помогает.

Просто у мелкомягких фсе работает, я тоже так хочу


--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
dvamaster
  Дата 2.4.2009, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 559
Регистрация: 30.6.2004
Где: Россия : Курган

Репутация: 2
Всего: 10



Кто писал MSDN?  smile прочти и исправь

проблема в строках:
Код

        hmc := CreateWindow('MDICLIENT', nil, WS_CHILD or WS_CLIPCHILDREN or
          WS_VSCROLL or WS_HSCROLL, 0, 0, 0, 0, Wnd, $CAC, HInstance, @ccs);


сдесь указывается размер окна 0 по горизонтали, 0 по вертикали...

Так как MDICLIENT является контейнером для MDIChild окон, то его надо на весь MDIFrame растягивать...

Сейчас код подправлю и выложу для любителей плагиностоения на WinAPI

Добавлено @ 12:27
Программа

Код

program prog;

uses
  Windows, Messages;

{$R WindowsXP.res}

const
  szWndClass: array [0..12] of Char = 'MainWndClass';

var
  wc: WNDCLASS;
  hw, hmc, hm: HWND;
  m: MSG;

function GetMDIWnd(AParent: HWND): HWND; stdcall; external 'plg.dll';

function MainProc(Wnd: HWND; uMsg: UINT; lP: LPARAM; wP: WPARAM): LRESULT; stdcall;
var
  ccs: CLIENTCREATESTRUCT;
  r: TRect;
begin
  Result := 0;
  case uMsg of
    WM_SIZE:
      begin
        GetClientRect(Wnd, r);
        SetWindowPos(hmc, 0, r.Left, r.Top, r.Right - r.Left + 1,
          r.Bottom - r.Top + 1, SWP_NOZORDER or SWP_NOREDRAW or SWP_NOACTIVATE);
      end;
    WM_CREATE:
      begin
        ccs.hWindowMenu := 0;
        ccs.idFirstChild := 0;
        GetClientRect(Wnd, r);
        hmc := CreateWindow('MDICLIENT', nil, WS_CHILD or WS_CLIPCHILDREN or
          WS_VSCROLL or WS_HSCROLL, r.Left, r.Top, r.Right - r.Left + 1,
          r.Bottom - r.Top + 1, Wnd, $CAC, HInstance, @ccs);
        ShowWindow(hmc, SW_SHOW);
        hm := GetMDIWnd(hmc);
      end;
    WM_CLOSE:
      begin
        SendMessage(hmc, WM_MDIDESTROY, hm, 0);
        DestroyWindow(Wnd);
      end;
    WM_DESTROY: PostQuitMessage(0)
  else
    Result := DefFrameProc(Wnd, hm, uMsg, lP, wP)
  end;
end;

begin
  wc.style := CS_VREDRAW or CS_HREDRAW;
  wc.lpfnWndProc := @MainProc;
  wc.cbClsExtra := 0;
  wc.cbWndExtra := 0;
  wc.hInstance := HInstance;
  wc.hIcon := LoadIcon(0, IDI_WINLOGO);
  wc.hCursor := LoadCursor(0, IDC_ARROW);
  wc.hbrBackground := COLOR_APPWORKSPACE;
  wc.lpszMenuName := nil;
  wc.lpszClassName := @szWndClass;
  if RegisterClass(wc) = 0 then
    Exit;
  hw := CreateWindow(@szWndClass, 'MDIFrame', WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, GetDesktopWindow, 0, HInstance, nil);
  ShowWindow(hw, SW_SHOWNORMAL);
  UpdateWindow(hw);
  while GetMessage(m, 0, 0, 0) do
    begin
      if TranslateMDISysAccel(hmc, m)then
        Continue;
      TranslateMessage(m);
      DispatchMessage(m)
    end;
end.


Плагин

Код

library plg;

uses
  Windows,
  Messages;

{$R WindowsXP.res}

const
  szMDIClass: array [0..11] of Char = 'MDIDlgClass';

function MDIWndProc(Wnd: HWND; uMsg: UINT; lP: LPARAM; wP: WPARAM): LRESULT; stdcall;
begin
  Result := 0;
  case uMsg of
    WM_CREATE: ;
  else
    Result := DefMDIChildProc(Wnd, uMsg, lP, wP)
  end;
end;

function GetMDIWnd(AParent: HWND): HWND; stdcall;
var
  wc: WNDCLASS;
  mcs: MDICREATESTRUCT;
begin
  Result := 0;
  wc.style := CS_VREDRAW or CS_HREDRAW;
  wc.lpfnWndProc := @MDIWndProc;
  wc.cbClsExtra := 0;
  wc.cbWndExtra := 0;
  wc.hInstance := HInstance;
  wc.hIcon := LoadIcon(0, IDI_APPLICATION);
  wc.hCursor := LoadCursor(0, IDC_ARROW);
  wc.hbrBackground := COLOR_WINDOW;
  wc.lpszMenuName := nil;
  wc.lpszClassName := @szMDIClass;
  if RegisterClass(wc) = 0 then
    Exit;
  Result := CreateMDIWindow(@szMDIClass, 'MDI Child', 0,
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, AParent,
    HInstance, 0);
  ShowWindow(Result, SW_SHOW);
end;

exports
  GetMDIWnd;

begin
end.


Это сообщение отредактировал(а) dvamaster - 6.4.2009, 06:34


--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
Galaxy
Дата 30.9.2009, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 13.9.2009

Репутация: нет
Всего: нет



будьте добры покажите исходник с данной или подобной реализацией
PM MAIL   Вверх
bems
Дата 30.9.2009, 06:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



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

Это сообщение отредактировал(а) bems - 30.9.2009, 06:26


--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0449 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.