Форум: "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