Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
anod   (2003-05-31 04:28) [0]

Вообщем требуется для начала создать дочернее окно, причем окно своего класса. Это окно должно лежать на родительском (как кнопка).
Создаю главное окно, потом

function InitMyTB: Boolean;
var WNDClass: TWndClass;
begin
WNDClass.Style:=CS_HREDRAW or CS_VREDRAW{ or CS_OWNDC};
WNDClass.lpfnWndProc:=@MyTBWndProc;
WNDClass.cbClsExtra:=0;
WNDClass.cbWndExtra:=DLGWINDOWEXTRA;
WNDClass.hInstance:=hInstance;
WNDClass.hIcon:=0;
WNDClass.hCursor:=LoadCursor(0, IDC_ARROW);
WNDClass.hbrBackground:=COLOR_ACTIVEBORDER;
WNDClass.lpszMenuName:=nil;
WNDClass.lpszClassName:=PChar(TBClassName);
Result:=Windows.RegisterClass(WNDClass) <> 0;
end;


В WM_Create главного окна

WM_CREATE: begin
if (not InitMyTB) then MessageBox(0, "Ошибка регистрации окна", nil, MB_OK)
else begin
TBWnd:=CreateWindowEx(WS_EX_CLIENTEDGE,PChar(TBClassName),"MyTB",WS_CHILD or WS_CLIPCHILDREN or WS_VISIBLE,5,5,120,20,MainWnd,0, hInstance, nil);
if (TBWnd = 0) then begin MessageBox(0, "Ошибка создания окна: TBWND", nil, MB_OK); end; //Вот здесь вылетает с мессаджем
end;
end;


В указанном выше месте программа выжает сообщение и ничего не создает, но если убрать стиль WS_CHILD - все работает.


 
anod   (2003-05-31 06:36) [1]

То все работает, но создается отдельное окно


 
Suntechnic   (2003-05-31 07:45) [2]

Всё по идеи должно работать. По крайней мере в приведенном фрагменте проблем не видно. Дальше надо смотреть весь код. Что такое, например, MainWnd?


 
anod   (2003-05-31 09:12) [3]

2Suntechnic
Ну так это почти весь код.
До оконной процедуры дей1ствие не доходит, значит остается только главное окно:

function InitApp: Boolean;
var WNDClass: TWndClass;
begin
WNDClass.Style:=CS_HREDRAW or CS_VREDRAW;
WNDClass.lpfnWndProc:=@MainWndProc;
WNDClass.cbClsExtra:=0;
WNDClass.cbWndExtra:=DLGWINDOWEXTRA;
WNDClass.hInstance:=hInstance;
WNDClass.hIcon:=LoadIcon(0, IDI_APPLICATION);
WNDClass.hCursor:=LoadCursor(0, IDC_ARROW);
WNDClass.hbrBackground:=COLOR_BTNSHADOW;
WNDClass.lpszMenuName:=nil;
WNDClass.lpszClassName:=PChar(WinName);
Result:=Windows.RegisterClass(WNDClass) <> 0;
end;

function InitInstance: HWND;
begin
// Создаем главное окно.
Result:=CreateWindowEx(WS_EX_TOOLWINDOW,PChar(WinName)," window1",
WS_SYSMENU or WS_CLIPCHILDREN or WS_VISIBLE,
240,280,
300,80,
HWND_DESKTOP,0, hInstance, nil);
end;

begin
if (not InitApp) then
begin
MessageBox(0, "Ошибка регистрации окна", nil, MB_OK);
Exit;
end
else
begin
MainWnd:=InitInstance; if (MainWnd = 0) then begin MessageBox(0, "Ошибка создания окна", nil, MB_OK); exit; end;
//------------------------------------------------------------------------------
// InitCommonControls();
//------------------------------------------------------------------------------
ShowWindow(MainWnd, SW_SHOWNORMAL);
UpdateWindow(MainWnd);

While GetMessage(Message, 0, 0, 0) do
begin
TranslateMessage(Message);
DispatchMessage(Message);
end;
end;


 
Suntechnic   (2003-05-31 09:25) [4]

>anod ©
Так ты его на DeskTop что ли прилепить хочешь?


 
anod   (2003-05-31 09:36) [5]

Всмысле? Это создание главного окна - оно-то на десктопе.
У меня что-то даже кнопка не создаетя. Я выдрал этот код из другого своео приложения, там он работал. мож все занова переписать?


 
anod   (2003-05-31 09:50) [6]

Переписал - таже фигня.
А, почему если убрат WS_CHILD - работает? Мож где флага не хватает.


 
Suntechnic   (2003-05-31 10:02) [7]

Теперь уже я ничего не понял :(. Что означает фраза в исходном вопросе "Это окно должно лежать на родительском (как кнопка).
"? Кто на ком лежать должен? О каком дочернем окне идёт речь в первом посте или это дечернее окно и должно быть главным? Где код, который подразумевает класть одно окно на другое окно, если здесь виден только код который создаёт только одно окно?

Короче, давай сначала и по порядку...


 
anod   (2003-05-31 18:36) [8]

TBWnd:=CreateWindowEx(WS_EX_CLIENTEDGE,PChar(TBClassName),"MyTB",WS_CHILD or WS_CLIPCHILDREN or WS_VISIBLE,5,5,120,20,MainWnd,0, hInstance, nil);

Вот это окно должно лежать на вот этом

function InitInstance: HWND;
begin
// Создаем главное окно.
Result:=CreateWindowEx(WS_EX_TOOLWINDOW,PChar(WinName)," window1",
WS_SYSMENU or WS_CLIPCHILDREN or WS_VISIBLE,
240,280,
300,80,
HWND_DESKTOP,0, hInstance, nil);
end;

и то, что я ставлю WS_CHILd, должно подразумевать, что одно окно будет лежать на другом


 
Suntechnic   (2003-05-31 21:08) [9]

На момент посыкли сообщения WM_CREATE MainWnd у тебя ещё 0. Поэтому окно у тебя и болтается. Вот код основанный на твоём, ккоторый прекрасно "кладёт" одно окно на другое.

program HelloMyEmbeddedWindow;
uses
Messages, Windows;

const
WinName = "HelloWinApp"; TBClassName = "MyClassName";
var MainWnd, TBWnd : HWND;
var Message : MSG;


function MyTBWndProc(HWnd: HWND; Msg: UINT;
wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
case Msg of
WM_DESTROY:
begin
Result := 0;
end
else
Result := DefWindowProc(HWnd,Msg,WParam,LParam);
end;
end;



function InitInstance: HWND;
begin
Result:=CreateWindowEx(WS_EX_TOOLWINDOW,PChar(WinName)," window1",
WS_SYSMENU or WS_CLIPCHILDREN or WS_VISIBLE,240,280,300,80,
HWND_DESKTOP,0, hInstance, nil);
end;

function InitMyTB: Boolean;
var WNDClass: TWndClass;
begin
WNDClass.Style:=CS_HREDRAW or CS_VREDRAW;
WNDClass.lpfnWndProc:=@MyTBWndProc;
WNDClass.cbClsExtra:=0;
WNDClass.cbWndExtra:=DLGWINDOWEXTRA;
WNDClass.hInstance:=hInstance;
WNDClass.hIcon:=0;
WNDClass.hCursor:=LoadCursor(0, IDC_ARROW);
WNDClass.hbrBackground:=COLOR_ACTIVEBORDER;
WNDClass.lpszMenuName:=nil;
WNDClass.lpszClassName:=PChar(TBClassName);
Result:=Windows.RegisterClass(WNDClass) <> 0;
end;


function MainWndProc(HWnd: HWND; Msg: UINT;
wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
case Msg of
WM_DESTROY:
begin
PostQuitMessage(0);
Result := 0;
end;
WM_CREATE:
begin
if (not InitMyTB) then
MessageBox(0, "


 
anod   (2003-05-31 21:27) [10]

Спасибо, все работает, толльео я не понял что поменялось.
И почему
>MainWnd у тебя ещё 0
Я же сначала создаю MainWnd, а потом только цикл обработки сообщений???


 
Suntechnic   (2003-05-31 21:37) [11]

Вот что поменялось.

Было
TBWnd:=CreateWindowEx(WS_EX_CLIENTEDGE,PChar(TBClassName),"MyTB",
WS_CHILD or WS_CLIPCHILDREN or WS_VISIBLE,5,5,120,20, MainWnd,0, hInstance, nil);

Стало
TBWnd:=CreateWindowEx(WS_EX_CLIENTEDGE,PChar(TBClassName),"MyTB",
WS_CHILD or WS_CLIPCHILDREN or WS_VISIBLE,5,5,120,20, HWnd,0, hInstance, nil);


Я же сначала создаю MainWnd, а потом только цикл обработки сообщений???

Не все сообщения попадают в оконную процедуру через очередь сообщений. Многие отсылается напрямую (например WM_CREATE) + все те которые посланы через SendMessage.


 
anod   (2003-05-31 21:52) [12]

Понял.
Спасибо.



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

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

Наверх





Память: 0.48 MB
Время: 0.008 c
6-10317
som
2003-05-27 12:20
2003.08.04
FTP


14-10389
Danilcha
2003-07-17 02:35
2003.08.04
Российский студент обошел программистов NASA


14-10434
BnT
2003-07-16 19:49
2003.08.04
База данных ЕГТС-2002


3-10130
Space
2003-07-15 11:29
2003.08.04
Округление значения переменной


1-10192
Альф
2003-07-17 16:11
2003.08.04
Можно ли из множества целых составить строку ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский