Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1165047870
Pazitron_Brain
2006-12-02 11:24
2006.12.24
Почему не продают процессоры Cell?


15-1164888761
халявщик
2006-11-30 15:12
2006.12.24
Лицензия Access


2-1165230352
IGo
2006-12-04 14:05
2006.12.24
Не отображается Label, пока не загрузится OLE объект


15-1164794548
GRAND25
2006-11-29 13:02
2006.12.24
В защиту СУБД FireBird


15-1165168673
Горгер
2006-12-03 20:57
2006.12.24
Получить адрес в ассемблерной вставке





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский