Форум: "Начинающим";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];
ВнизСоздание кнопки Найти похожие ветки
← →
Creative (2006-12-05 18:02) [0]Хочу создать кнопку. Не компоненту TMyButton, а примитивную кнопку, аналог виндовской кнопки, создающейся вот этой функцией:
hwnd_btn := CreateWindow("BUTTON", "Button", WS_VISIBLE or WS_CHILD, 0, 0, 0, 0, hwnd_main, 0, 0, nil);
Вопрос такой - какой именно параметр CreateWindow отвечает за то, что созданный объект отрисуется не на экране непосредственно (как собственно окно), а на поверхности окна? Ведь и окно, и кнопка создаются одной и той же функцией. В чем различие? Не могу найти его в модуле Windows, может это где-то в другом месте лежит?
← →
Игорь Шевченко © (2006-12-05 18:06) [1]
> какой именно параметр CreateWindow отвечает за то, что созданный
> объект отрисуется не на экране непосредственно (как собственно
> окно), а на поверхности окна?
8 и 9-ый
← →
Creative (2006-12-05 18:15) [2]да нет, я не могу найти, где в описании CreateWindow написано - как объявляется родительский хендл, что с ним потом происходит и так далее.
Помните я показывала самодельную процедуру, аналогичную CreateWindow. Там автор не собирался видимо детей заводить, и там просто нет параметра "родительский хендл". Я хочу его ввести. Вот как?
← →
Leonid Troyanovsky © (2006-12-05 18:27) [3]
> Creative (05.12.06 18:15) [2]
> да нет, я не могу найти, где в описании CreateWindow написано
> - как объявляется родительский хендл, что с ним потом происходит
> и так далее.
Далее, видимо, http://msdn2.microsoft.com/en-us/default.aspx
со всеми остановками.
Хотя, конечно, некоторые постановки типа
"как объявляется родительский хендл" имеет смысл прояснять
с помощью тезауруса.
--
Regards, LVT.
← →
trubin © (2006-12-05 18:37) [4]Кнопка это тоже окно, вы используете предопределенный класс окна :
> "BUTTON"
,
указываете, что создаете дочернее окно:
> WS_CHILD
указываете родительский хэндл для создаваемого дочернего окна
> hwnd_main
Чего еще?
Сначала создаете окно верхнего уровня, а затем вышеуказанную кнопку, передавая в рачестве параметра хэндл возвращенный функцией CreateWindow при создании родительского окна.
← →
TUser © (2006-12-05 21:05) [5]А зачем?
← →
Игорь Шевченко © (2006-12-06 10:29) [6]
> Помните я показывала самодельную процедуру, аналогичную
> CreateWindow. Там автор не собирался видимо детей заводить,
> и там просто нет параметра "родительский хендл". Я хочу
> его ввести. Вот как?
Не помним - прогрессирующий склероз. Надо показать еще раз.
← →
Котик Б (2006-12-06 10:34) [7]>самодельную процедуру, аналогичную CreateWindow
LOL :) а это как ? и мы хотим увидеть ...
← →
Creative (2006-12-06 11:28) [8]
> Не помним - прогрессирующий склероз. Надо показать еще раз.
http://delphimaster.net/view/4-1164636377/
← →
Игорь Шевченко © (2006-12-06 12:08) [9]Creative (06.12.06 11:28) [8]
Там только прототип, без тела. Телепатор сломался от непомерной нагрузки
← →
Creative (2006-12-06 12:52) [10]Приношу свои извинения, и выношу тело.
По крайней мере описание типа:
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 13:59) [11]
> constructor CreateWnd(Width, Height : integer; FullScreen,
> VSync : boolean; ColorDepth, Freq : integer); virtual;
>
А тело этого метода ?
← →
Creative (2006-12-06 14:07) [12]
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);
← →
Creative (2006-12-06 14:08) [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;
← →
Игорь Шевченко © (2006-12-06 14:54) [14]Не создать тебе этим методом дочернего окна...Да и к чему в OpenGL дочерние окна ?
← →
Creative (2006-12-06 15:00) [15]Да меня не столько дочерние окна интересуют. сколько собственно кнопка. Я свои кнопки сама создавала (по крайней мере пыталась) - просто объекты со своим размером и методом отрисовки. Но но это были фиктивные кнопки, потому что собственного события onClick у них не было, я просто в WM_RBUTTONDOWN окна расписывала попадание в область кнопки. А сейчас мне захотелось описать событие onClick самой этой самодельной кнопки.
Непонятно наверное получилось...:-(
← →
Creative (2006-12-06 15:00) [16]Да меня не столько дочерние окна интересуют. сколько собственно кнопка. Я свои кнопки сама создавала (по крайней мере пыталась) - просто объекты со своим размером и методом отрисовки. Но но это были фиктивные кнопки, потому что собственного события onClick у них не было, я просто в WM_RBUTTONDOWN окна расписывала попадание в область кнопки. А сейчас мне захотелось описать событие onClick самой этой самодельной кнопки.
Непонятно наверное получилось...:-(
← →
Creative (2006-12-06 15:13) [17]Я подумала, может мне просто нужно написать своей кнопке процедуру перехвата WM_LBUTTONDOWN ?
← →
Игорь Шевченко © (2006-12-06 15:20) [18]Я не совсем понимаю, где ты хочешь кнопку разместить - на окне с графическим контекстом OpenGL ? А зачем ?
Не проще ли создать обычную форму стандартными средствами Delphi, а окно с графикой встроить внутрь ? Примеров есть
← →
Creative (2006-12-06 15:40) [19]
> Не проще
> ли создать обычную форму стандартными средствами Delphi,
> а окно с графикой встроить внутрь ? Примеров есть
Случайно не такой пример описывается здесь? (естественно его аналог на Дельфи)
http://pmg.org.ru/nehe/nehe01.htm
Хотя если вы говорите "форму", вы наверное имеете в виду VCL, так?
Нет, форму я не хочу создавать, я буду создавать только окно.
Я не совсем понимаю, где ты хочешь кнопку разместить - на окне с графическим контекстом OpenGL ? А зачем ?
Затем, что я хочу рисовать свои собственные кнопки, а не пользоваться серыми виндовскими, а если честно другого способа я не придумала.
← →
Anatoly Podgoretsky © (2006-12-06 15:52) [20]> Creative (06.12.2006 15:40:19) [19]
Раз речь про OpenGL, то забыть про окна и формы.
← →
Creative (2006-12-06 15:59) [21]
> Раз речь про OpenGL, то забыть про окна и формы.
Постойте, постойте. Про формы - согласна. А про окна почему? Объясните.
← →
Anatoly Podgoretsky © (2006-12-06 16:27) [22]> Creative (06.12.2006 15:59:21) [21]
Потому что там свои объекты
← →
Creative (2006-12-06 16:33) [23]
> Потому что там свои объекты
Странно, я наверное слишком мало об Огл знаю еще. Пошла читать....
[вернулась] Но объясните тогда, почему все примеры инициализации OpenGL и последующей с ним работы начинаются с создания самого обычного окна??? Объясните, пожалуйста, чувствую себя очень тупой.
← →
Anatoly Podgoretsky © (2006-12-06 16:42) [24]> Creative (06.12.2006 16:33:23) [23]
Ну я еще меньше
← →
Игорь Шевченко © (2006-12-06 22:38) [25]
> Но объясните тогда, почему все примеры инициализации OpenGL
> и последующей с ним работы начинаются с создания самого
> обычного окна
Потому что контекст OpenGL относится к окну.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.04 c