Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];

Вниз

Кнопка на API   Найти похожие ветки 

 
Dmitry_177   (2006-09-29 18:25) [0]

Хочу создать кнопку на API, но не обычную... Хочу чтобы она обладала всеми свойствами что и обычная кнопка, но перерисовку изменить полностью, чтобы небыло виндовс-прорисовки рамки(бордюра кнопки), чтобы прорисовка была полностью моя... Как так сделать? Помогите...


 
Eraser ©   (2006-09-29 18:37) [1]

> [0] Dmitry_177   (29.09.06 18:25)

VCL пока что с исходниками поставляется, так что глянь как реализован TButton.


 
Dmitry_177   (2006-09-29 18:40) [2]

Я искал... Но не нашел...((( Я конечно понимаю что можно на форме в какомто месте нарисовать наподобии кнопки и следить за курсором, если он окажется над кнопкой то прорисовать кнопку как курсор над ней, а если нажать на нее то прорисовать как нажатая... Но мне этот способ не нравится, хотелось бы всеже по нормальному, но без VCL и чтобы это была кнопка..


 
Eraser ©   (2006-09-29 23:19) [3]

> [2] Dmitry_177   (29.09.06 18:40)

зачем же все делать с нуля?

> Я конечно понимаю что можно на форме в какомто месте нарисовать
> наподобии кнопки и следить за курсором

для этого нужно создать наследника TGraphicControl, но если нужна полноценная кнопка, которая может получать фокус - делай наследника TWinControl.

А вообще перед тем, как писать свои компоненты, не плохобы теорию изучить, а не задавать вопросы тут.


 
Dmitry_177   (2006-09-30 10:37) [4]

Я бы хотел от TWndClass наследника сделать... На API все... чтобы борландовские модули вообще не подключать...


 
@!!ex ©   (2006-09-30 12:41) [5]


> Я бы хотел от TWndClass наследника сделать...

противоречит

> На API все... чтобы борландовские модули вообще не подключать.
> ..


 
Don Nikola ©   (2006-09-30 12:58) [6]

2Dmitry_177:
Если именно на WinApi, а не на "low-level" VCL, то посмотри donnikola.narod.ru - NXGDI.


 
Dmitry_177   (2006-09-30 13:09) [7]

Я оговорился насчет наследника, я имел ввиду кнопка имеющая класс TWndClass, и создать функцией CreateWindow или CreateWindowEx, вобщем API...


 
Eraser ©   (2006-09-30 14:45) [8]

> [4] Dmitry_177   (30.09.06 10:37)

вопрос. зачем?


 
Dmitry_177   (2006-09-30 15:32) [9]

Хочу сделать маленькую(на API), красивую программку, и просто хочу знать как можно это реализовать на API


 
Eraser ©   (2006-09-30 15:45) [10]

> [9] Dmitry_177   (30.09.06 15:32)
> Хочу сделать маленькую(на API),

программа, в которой пустая форма с кнопокой у меня занимает 388 КБ.
после сжатия - 166 КБ. Куда еще меньше и зачем?
Луче, чем заниматься ерундой и изобретением велосипедов, реализуй и совершенствуй функионал ;-)


 
Don Nikola ©   (2006-09-30 16:03) [11]

2Eraser:
Изобретательство велосипедов очень здорово прокачивает скилл "Механика", что позволяет в последствии с намного меньшими усилиями чинить чужие автомобили. Образно выражаясь.

>Куда еще меньше и зачем?

Например, затем чтобы сделать программку без тормозов от трех десятков сторонних компонент, написанных часто очень криво. Что бы писать эффективно на VCL нужно его исходники вдоль и поперек перечитать раз так несколько, что по времени не сильно отличается от "лисопедостроительства".
Плюсы "лисопедов" - малый размер, не перегруженная функциональность, максимальная скорость и полученный опыт.
Минусы - время начальной разработки, уникальные "аутотентичные" глюки ;)


 
Eraser ©   (2006-09-30 16:10) [12]

> [11] Don Nikola ©   (30.09.06 16:03)


> Например, затем чтобы сделать программку без тормозов от
> трех десятков сторонних компонент

делай 3 десятка компонентов на чистом API, тогда и сравним где тормозов больше.

> Плюсы "лисопедов" - малый размер

это плюсы вирусов, или 166 КБ это много?

> максимальная скорость

спорный вопрос, особенно учитывая, что программу будут писать люди, которые на форумах задают вопрос "Кнопка на API", я пишу это не в обиду автору, просто есть сильное подозрение, что развитие данного продукта закончится на недоделанном UI, а до функциональности так дело и не дайдет, не хотелось бы этого .. и прежде всего автору.


 
@!!ex ©   (2006-09-30 16:23) [13]


> делай 3 десятка компонентов на чистом API, тогда и сравним
> где тормозов больше.

Зуб даю, работать будет быстрее. и намного.

P.S.
Насколько мне известно VCL(как и MFC -  просто надстройка над WinAPI)


 
Dmitry_177   (2006-09-30 16:28) [14]

Ну так есть у кого-нибудь какиенибудь соображения по вопросу? (Кнопка на API с полной своей прорисовкой, бордюра в том числе)


 
Eraser ©   (2006-09-30 16:31) [15]

> [13] @!!ex ©   (30.09.06 16:23)


> Зуб даю, работать будет быстрее. и намного.

не уверен.
особенно с
> и намного.


 
Don Nikola ©   (2006-09-30 16:49) [16]

2Eraser:
Обычно те 30 сторонних компонентов - это 147 раз отнаследованные враперы, которые максимально абстрагируются от WinApi(или любого другого Api) и естественно что работать они будут меделеннее чем класс работающий непосредственно с очередью сообщений и функциями WinApi, также часто теряется изначальная функциональность (простейший пример: Seek/SetFilePointer).
Естественно, что тормоза будут лишь в интерфейсной части, логика может работать и быстрее чем Api"шные аналоги. Например, отрисовка графики c ColorKey в WinApi сделаны через "ниже поясницы", если сделать свою отрисовку в буффер, то скорость будет заметно выше. Другой пример LZ* и APLib.
И вообще, "лисопед" не цель, а средство.


 
Eraser ©   (2006-09-30 17:03) [17]

> [16] Don Nikola ©   (30.09.06 16:49)


> Обычно те 30 сторонних компонентов - это 147 раз отнаследованные
> враперы, которые максимально абстрагируются от WinApi(или
> любого другого Api) и естественно что работать они будут
> меделеннее чем класс работающий непосредственно с очередью
> сообщений и функциями WinApi

из этих 30 компонентов треть или добрую половину в VCL реализуют т.н. lightweight controls, т.е. наследники TGraphicControl, которые вообще говоря, не являются окнами или другими системными объектами, за счет этого, в большенстве случаев, экономятся системные ресурсы.

> также часто теряется изначальная функциональность (простейший
> пример: Seek/SetFilePointer).

в чем здесь теряется функциональность?

в общем imho такое, хочется писать на чистом api - зачем тогда Делфи вообще, MSVC++ намного более приспособлен для этого. хочется тратить на создание качественного интерфейса как можно меньше времени - используйте VCL Делфи.


 
ANTPro ©   (2006-09-30 17:16) [18]

Dmitry_177   (30.09.06 15:32) [9]
Хочу сделать маленькую(на API), красивую программку, и просто хочу знать как можно это реализовать на API

А почему именно API? Есть же KOL или AvL ...


 
Dmitry_177   (2006-09-30 17:23) [19]

Я хочу именно на API, мне ктонибудь подскажет по моему вопросу чтонибудь?


 
ANTPro ©   (2006-09-30 17:35) [20]

Dmitry_177   (30.09.06 17:23) [19]
Ну так в AvL все на нем и сделано :)
А в KOL даже визуальные компоненты есть

Dmitry_177   (30.09.06 17:23) [19]
Я хочу именно на API

Вопрос. Зачем?
Если для уменьшения размера, то на KOL программа, в которой только форма 12.5 кб.
На чистом API вроде 3.5 кб.


 
Dmitry_177   (2006-09-30 17:37) [21]

Хочется мне... ктонибудь может мне подсказать?


 
n0name   (2006-09-30 17:47) [22]


> Dmitry_177   (30.09.06 17:37) [21]

После создания кнопки:

BtnOldProc := Pointer(SetWindowLong(hBtn, GWL_WNDPROC, DWORD(@BtnWndProc)));

BtnWndProc, в нём отрисовываешь кнопку.

function BtnWndProc(Wnd: HWND; Msg, wParam, lParam: Integer): Integer; stdcall;
begin
if Msg = WM_PAINT then
 begin
// твой код
  result := 0;
  exit;
 end;
result := CallWindowProc(BtnOldProc, Wnd, Msg, wParam, lParam);
end;


 
Don Nikola ©   (2006-09-30 17:51) [23]

2Eraser:

>не являются окнами или другими системными объектами, за счет этого, в большенстве случаев, экономятся системные ресурсы

Я бы не сказал что экономия HWND это "типа круто". Куча лишних прослоек - зло.
Я просто проверял программку на VCL и на WinApi, чисто визуально последняя быстрее и "чище" по экрану ездит.
Но это уже из области "имховости".

>в чем здесь теряется функциональность?

В Seek опущен параметры lpDistanceToMoveHigh и dwMoveMethod.

>хочется писать на чистом api - зачем тогда Делфи вообще, MSVC++ намного более приспособлен для этого. хочется тратить на создание качественного интерфейса как можно меньше времени - используйте VCL Делфи.

C++/VB не любли из эстетико-религиозных соображений, у FreePascal мне как-то компилер не нравится. Кстати, работать на Delphi c WinApi вроде бы никто в лицензии не запрещал, возможности есть, почему не использовать.

2Dmitry_177:

>мне ктонибудь подскажет по моему вопросу чтонибудь?
Молодой человек, не мешайте дядям разговаривать ;)))

Почитай Win32Help(Win32.hlp)  - RegisterClass, CreateWindow, GetMessage, WindowProc, Subclassing a Window, Window Procedure Superclassing.
Посмотри сайт который я указал, там уже мой подход к задаче, сделано на дельфевых классах.


 
Eraser ©   (2006-09-30 18:07) [24]

> [23] Don Nikola ©   (30.09.06 17:51)


> Кстати, работать на Delphi c WinApi вроде бы никто в лицензии
> не запрещал, возможности есть, почему не использовать.

но на MSVC++ это удобнее, если в данном случае это слово вообще можно употребить )), например там вполне потребный редактор ресурсов, он же редактор форм. Оч. удобно, при написании проги на чистом API.
Что касается лично меня, то я под win32 пишу и надеюсь буду писать на Делфи :)
Да и не сторонник я такой экономии, как хочет автор. Лучше бросить свои силы на написание ядра программы, т.е. основной функциональности, а остальное прийдет.

> Я бы не сказал что экономия HWND это "типа круто". Куча
> лишних прослоек - зло.

но все таки в борланде не дураки сидят, и зачем-то таки придумали этот TGraphicControl.

> Почитай Win32Help(Win32.hlp)  - RegisterClass, CreateWindow

скорее, в данном случае, по CreateWindowEx, RegisterClassEx )


 
n0name   (2006-09-30 18:16) [25]

Зачем *Ex? Зачем ему дополнительные стили?

> Почитай Win32Help(Win32.hlp)  - RegisterClass, CreateWindow,
>  GetMessage, WindowProc, Subclassing a Window, Window Procedure
> Superclassing.

А ещё лучше MSDN.


 
Don Nikola ©   (2006-09-30 18:24) [26]

2Eraser:

>Лучше бросить свои силы на написание ядра программы

С этим полностью согласен - зачем нужны обои без стен?

>зачем-то таки придумали этот TGraphicControl.

Наверное что бы избежать ситуаций такого рода: на форме лежит самопальный грид, а каждая ячейка - винконтрол, то винде может поплохеть.
"Лисопеды" обычно заточены под определенный круг задач, потому часто и быстрее, VCL - вещь универсальная и вынужденна поддерживать все варианты.

>скорее, в данном случае, по CreateWindowEx, RegisterClassEx )

Ну CreateWindowEx еще ладно, но RegisterClassEx отличается только полем размера и маленькой иконкой, которую все равно редко кто в ресурсы кладет.


 
@!!ex ©   (2006-09-30 18:49) [27]

Большое преимущество WinAPiI перед VCL, KOl и все такое прочее - это переносимость. Если ты умеешь писать на WinAPI тебе без разницы на каком языке и в какой IDE писать.

P.S.
Кстати, редактор форм в MSVC++ использует MFC, если мне не изменяет память, так что говорить что он позволяет бытсро и удобно писать на чистом API не есть корректно. :)


 
Eraser ©   (2006-09-30 19:21) [28]

> [27] @!!ex ©   (30.09.06 18:49)


> Кстати, редактор форм в MSVC++ использует MFC

вроде нет.


 
@!!ex ©   (2006-09-30 20:46) [29]

Eraser ©   (30.09.06 19:21) [28]

Ступил. Действительно редактор ресурсов работает с WinAPI.


 
XProger ©   (2006-09-30 22:57) [30]

Насчёт маленького размера... вот извращался не так давно http://xproger.mirgames.ru/tmp/Form1.rar


 
balepa ©   (2006-10-03 06:50) [31]

Что Вы докопались до размера и зачем это нужно. Нужно это скорее всего для общего развития и понимания как это делается и работает. Ну хочет человек. Мож он потом напишет новую ОС Buttons :)



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.043 c
15-1169247208
Shumer
2007-01-20 01:53
2007.02.18
протокол ModBus


15-1169826172
TUser
2007-01-26 18:42
2007.02.18
ЕГЭ протолкнули,


2-1170336039
Lera
2007-02-01 16:20
2007.02.18
Наличие файла


2-1170413046
Extar
2007-02-02 13:44
2007.02.18
Чем лучше соорудить инсталлятор для своей программы?


15-1169917017
Ученик чародея
2007-01-27 19:56
2007.02.18
Кто такой программист?





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