Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.24;
Скачать: CL | DM;

Вниз

Создание кнопки   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.031 c
5-1145868502
Begin
2006-04-24 12:48
2006.12.24
TStrings property


6-1154777105
Screamer
2006-08-05 15:25
2006.12.24
Получение данных передающихся на модем


2-1165467722
N@mCo
2006-12-07 08:02
2006.12.24
ikonka proqrammi ne bila vidna v taskbar i v sistem traye


2-1165575053
sergeyst
2006-12-08 13:50
2006.12.24
Печать в Windows


15-1164907180
TUser
2006-11-30 20:19
2006.12.24
Все не по правилам