![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание кнопки [D7, XP]
Creative © (2006-12-05 18:02:00)Хочу создать кнопку. Не компоненту TMyButton, а примитивную кнопку, аналог виндовской кнопки, создающейся вот этой функцией:
hwnd_btn := CreateWindow('BUTTON', 'Button', WS_VISIBLE or WS_CHILD, 0, 0, 0, 0, hwnd_main, 0, 0, nil);
Вопрос такой - какой именно параметр CreateWindow отвечает за то, что созданный объект отрисуется не на экране непосредственно (как собственно окно), а на поверхности окна? Ведь и окно, и кнопка создаются одной и той же функцией. В чем различие? Не могу найти его в модуле Windows, может это где-то в другом месте лежит?
Игорь Шевченко (2006-12-06 22:38:00) [1]
> Но объясните тогда, почему все примеры инициализации OpenGL
> и последующей с ним работы начинаются с создания самого
> обычного окна
Потому что контекст OpenGL относится к окну.
Anatoly Podgoretsky (2006-12-06 16:42:00) [2]> Creative (06.12.2006 16:33:23) [23]
Ну я еще меньше
Creative (2006-12-06 16:33:00) [3]
> Потому что там свои объекты
Странно, я наверное слишком мало об Огл знаю еще. Пошла читать....
[вернулась] Но объясните тогда, почему все примеры инициализации OpenGL и последующей с ним работы начинаются с создания самого обычного окна??? Объясните, пожалуйста, чувствую себя очень тупой.
Anatoly Podgoretsky (2006-12-06 16:27:00) [4]> Creative (06.12.2006 15:59:21) [21]
Потому что там свои объекты
Creative (2006-12-06 15:59:00) [5]
> Раз речь про OpenGL, то забыть про окна и формы.
Постойте, постойте. Про формы - согласна. А про окна почему? Объясните.
Anatoly Podgoretsky (2006-12-06 15:52:00) [6]> Creative (06.12.2006 15:40:19) [19]
Раз речь про OpenGL, то забыть про окна и формы.
Creative (2006-12-06 15:40:00) [7]
> Не проще
> ли создать обычную форму стандартными средствами Delphi,
> а окно с графикой встроить внутрь ? Примеров есть
Случайно не такой пример описывается здесь? (естественно его аналог на Дельфи)
http://pmg.org.ru/nehe/nehe01.htm
Хотя если вы говорите "форму", вы наверное имеете в виду VCL, так?
Нет, форму я не хочу создавать, я буду создавать только окно.
Я не совсем понимаю, где ты хочешь кнопку разместить - на окне с графическим контекстом OpenGL ? А зачем ?
Затем, что я хочу рисовать свои собственные кнопки, а не пользоваться серыми виндовскими, а если честно другого способа я не придумала.
Игорь Шевченко (2006-12-06 15:20:00) [8]Я не совсем понимаю, где ты хочешь кнопку разместить - на окне с графическим контекстом OpenGL ? А зачем ?
Не проще ли создать обычную форму стандартными средствами Delphi, а окно с графикой встроить внутрь ? Примеров есть
Creative (2006-12-06 15:13:00) [9]Я подумала, может мне просто нужно написать своей кнопке процедуру перехвата WM_LBUTTONDOWN ?
Creative (2006-12-06 15:00:00) [10]Да меня не столько дочерние окна интересуют. сколько собственно кнопка. Я свои кнопки сама создавала (по крайней мере пыталась) - просто объекты со своим размером и методом отрисовки. Но но это были фиктивные кнопки, потому что собственного события onClick у них не было, я просто в WM_RBUTTONDOWN окна расписывала попадание в область кнопки. А сейчас мне захотелось описать событие onClick самой этой самодельной кнопки.
Непонятно наверное получилось...:-(
Creative (2006-12-06 15:00:00) [11]Да меня не столько дочерние окна интересуют. сколько собственно кнопка. Я свои кнопки сама создавала (по крайней мере пыталась) - просто объекты со своим размером и методом отрисовки. Но но это были фиктивные кнопки, потому что собственного события onClick у них не было, я просто в WM_RBUTTONDOWN окна расписывала попадание в область кнопки. А сейчас мне захотелось описать событие onClick самой этой самодельной кнопки.
Непонятно наверное получилось...:-(
Игорь Шевченко (2006-12-06 14:54:00) [12]Не создать тебе этим методом дочернего окна...Да и к чему в OpenGL дочерние окна ?
Creative (2006-12-06 14:08:00) [13]продолжение:
if FullScreen then ChangeDisplayMode(FWidth, FHeight, FBPP, FFreq);
if FullScreen then begin
dwstyle := WS_POPUP or WS_CLIPCHILDREN or WS_CLIPSIBLINGS;
dwexstyle := WS_EX_APPWINDOW or WS_EX_WINDOWEDGE;
ShowCursor(false);
end else begin
dwstyle := WS_OVERLAPPEDWINDOW or WS_CLIPCHILDREN or WS_CLIPSIBLINGS;
dwexstyle := WS_EX_APPWINDOW or WS_EX_WINDOWEDGE;
ShowCursor(true);
end;
FFullscreen := FullScreen;
FHandle := CreateWindowEx(dwexstyle, ApplicationName, ApplicationName, dwstyle, 0, 0, Width, Height, 0, 0, h_Inst, self);
if FHandle = 0 then begin
MessageBox(FHandle, 'Failed to get a FB render port context.', 'Fatal error', MB_OK or MB_ICONERROR);
Destroy();
exit;
end;
FHDC := GetDC(FHandle);
if FHDC = 0 then begin
MessageBox(FHDC, 'Failed to get device context.', 'Fatal error', MB_OK or MB_ICONERROR);
Destroy();
exit;
end;
PreparePort(FullScreen, ColorDepth);
FGLRC := wglCreateContext(FHDC);
if (FGLRC = 0) then
begin
MessageBox(0, 'Failed to create an OpenGL rendering context.', 'Fatal error', MB_OK or MB_ICONERROR);
Destroy();
Exit;
end;
if (not wglMakeCurrent(FHDC, FGLRC)) then
begin
MessageBox(0, 'Failed to activate OpenGL rendering context.', 'Fatal error', MB_OK or MB_ICONERROR);
Destroy();
Exit;
end;
ShowWindow(FHandle, SW_SHOW);
SetForegroundWindow(FHandle);
SetFocus(FHandle);
GraphicInit();
ResizePort(Width, Height);
end;
Creative (2006-12-06 14:07:00) [14]
constructor TWndCore.CreateWnd(Width, Height: integer; FullScreen, VSync: boolean; ColorDepth, Freq: integer);
var dwstyle : DWORD;
dwexstyle : DWORD;
h_Inst : HINST;
function MainAction(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
//обработка сообщений
end;
begin
FWidth := Width;
FHeight := Height;
FBPP := ColorDepth;
FFreq := Freq;
FVertSync := VSync;
FMainAction := @MainAction;
h_Inst := GetModuleHandle(nil);
ZeroMemory(@FRenderPort, SizeOf(FRenderPort));
with FRenderPort do begin
Style := CS_HREDRAW or CS_VREDRAW or CS_OWNDC;
lpfnWndProc := FMainAction;
hInstance := h_Inst;
hCursor := LoadCursor(0, IDC_ARROW);
lpszClassName := ApplicationName;
end;
RegisterClass(FRenderPort);
Игорь Шевченко (2006-12-06 13:59:00) [15]
> constructor CreateWnd(Width, Height : integer; FullScreen,
> VSync : boolean; ColorDepth, Freq : integer); virtual;
>
А тело этого метода ?
Creative (2006-12-06 12:52:00) [16]Приношу свои извинения, и выношу тело.
По крайней мере описание типа:
type TWndCore = class
private
FHandle : HWND;
FHDC : HDC;
FGLRC : HGLRC;
FWidth : integer;
FHeight : integer;
FRenderPort : TWndClass;
FoldScreenWidth : integer;
FoldScreenHeight : integer;
FScrMode : TDeviceMode;
FMainAction : Pointer;
FFullScreen : boolean;
FBPP : integer;
FFreq : integer;
FVertSync : boolean;
WGL_EXT_swap_control : boolean;
FActive : boolean;
protected
procedure GraphicInit;
procedure GraphicFree;
procedure RefreshRenderPort;
function ChangeDisplayMode(Width, Height, BPP, Freq : integer) : boolean;
public
OnBeforeRender : procedure;
OnRender : procedure;
OnAfterRender : procedure;
OnKeyPress : procedure;
OnKeyDown : procedure;
OnMouseMove : procedure;
OnLeftMouse : procedure;
OnRightMouse : procedure;
constructor CreateWnd(Width, Height : integer; FullScreen, VSync : boolean; ColorDepth, Freq : integer); virtual;
destructor Destroy(); override;
procedure PreparePort(FullScreen : boolean; ColorDepth : integer);
procedure SwapBuffers;
procedure ResizePort(Width, Height : integer);
function MessageOperations(hInstance : HINST; hPrevInstance : HINST; lpCmdLine : PChar; nCmdShow : Integer) : Integer; stdcall;
end;
Большая просьба - если вы считаете, что это бред, и пользоваться этим - идиотизм, скажите мне об этом, пожалуйста.
Игорь Шевченко (2006-12-06 12:08:00) [17]Creative (06.12.06 11:28) [8]
Там только прототип, без тела. Телепатор сломался от непомерной нагрузки
Creative (2006-12-06 11:28:00) [18]
> Не помним - прогрессирующий склероз. Надо показать еще раз.
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1164636377&n=5
Котик Б (2006-12-06 10:34:00) [19]>самодельную процедуру, аналогичную CreateWindow
LOL :) а это как ? и мы хотим увидеть ...
Игорь Шевченко (2006-12-06 10:29:00) [20]
> Помните я показывала самодельную процедуру, аналогичную
> CreateWindow. Там автор не собирался видимо детей заводить,
> и там просто нет параметра "родительский хендл". Я хочу
> его ввести. Вот как?
Не помним - прогрессирующий склероз. Надо показать еще раз.