PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » OpenSource » Cвернуть все окна


Cвернуть все окна

Сообщений 1 страница 20 из 20

1

Перечитываю подшивку журнала ПРОграммист.
В восьмом номере  журнала есть статья WINAPI ГРАФИКА. PANIC BUTTON создаем средствами WinApi - кнопку быстро свернуть все окна.

http://purebasic.ucoz.com/PB_img/button.png

В оригинали автора программа имеет порядка больше 180 строк
И в конце приводится скрин параметров EXE файла, с гордостью: 68,5КБ, а после преобразования 32,5КБ

Используя те-же иконки и WinAPI (и функции PB) из статьи переложил на PureBasic

Код:
hWnd = OpenWindow(0,5,GetSystemMetrics_(#SM_CYSCREEN)-100,64,64,"",#PB_Window_BorderLess|#PB_Window_Invisible)
SkinWin(hWnd,LoadImage(0, "button.bmp"))
SetWindowLongPtr_(WindowID(0),#GWL_EXSTYLE,#WS_EX_TOOLWINDOW) 
SetWindowPos_(hWnd,#HWND_TOPMOST, 0, 0, 0, 0,#SWP_NOACTIVATE|#SWP_NOMOVE|#SWP_NOSIZE)
 
HideWindow(0,0) 
Repeat 
  Select WaitWindowEvent() 
   Case #WM_LBUTTONDOWN 
    keybd_event_(#VK_LWIN,0,0,0) 
    keybd_event_(#VK_D  ,0,0,0)  
    keybd_event_(#VK_D  ,0,#KEYEVENTF_KEYUP,0)
    keybd_event_(#VK_LWIN,0,#KEYEVENTF_KEYUP,0)
   Case #WM_RBUTTONDOWN
    Break             
  EndSelect  
ForEver

Результат вроде не плохой - 30КБ и строк меньше...

Архив файлов

Ни чего плохого в сторону автора статьи сказать не хочу.... 
По поводу лучшего языка споры бесконечны...
PureBasic - отлично!

Отредактировано mirashic (14.03.2011 22:23:36)

0

2

Ну как-бы по размеру это не предел - 3.5КБ,  :D но нет рисунка.

Код:
Procedure WindowCallback(Window, Message, wParam, lParam) 
  Select Message
    Case #WM_LBUTTONDOWN 
      keybd_event_(#VK_LWIN,0,0,0) 
      keybd_event_(#VK_D  ,0,0,0)  
      keybd_event_(#VK_D  ,0,#KEYEVENTF_KEYUP,0)
      keybd_event_(#VK_LWIN,0,#KEYEVENTF_KEYUP,0)
    Case #WM_RBUTTONDOWN
      DestroyWindow_(Window) 
    Case #WM_CLOSE 
      DestroyWindow_(Window) 
    Case #WM_DESTROY 
      PostQuitMessage_(0) 
      Result  = 0 
    Default 
      Result  = DefWindowProc_(Window, Message, wParam, lParam) 
  EndSelect 
  ProcedureReturn Result 
EndProcedure 

InitCommonControls_()

#Style  = #WS_VISIBLE | #WS_BORDER
#StyleEx  = #WS_EX_TOPMOST | #WS_EX_TOOLWINDOW	 

WindowClass.s  = "MyWin" 
wc.WNDCLASSEX 
wc\cbsize  = SizeOf(WNDCLASSEX) 
wc\lpfnWndProc  = @WindowCallback() 
wc\hCursor  = LoadCursor_(0, #IDC_ARROW)
wc\hbrBackground  =  #COLOR_WINDOW 
wc\lpszClassName  = @WindowClass 
RegisterClassEx_(@wc) 

hWndMain  = CreateWindowEx_(#StyleEx, WindowClass, "", #Style, 5,GetSystemMetrics_(#SM_CYSCREEN)-100,64,64, 0, 0, 0, 0) 
ShowWindow_(hWndMain,  #SW_SHOWDEFAULT) 
UpdateWindow_(hWndMain); 

While GetMessage_(msg.MSG, #Null, 0, 0 ) 
  TranslateMessage_(msg) 
  DispatchMessage_(msg) 
Wend
mirashic написал(а):

Используя те-же иконки и WinAPI (и функции PB) из статьи переложил на PureBasic

Надо там запостить парочку статей с прогами на пурике.  :idea:

0

3

Вот теперь с рисунком. Размер по прежнему 3.5КБ
http://pure-basic.narod.ru/forum/MicroProgWin.rar

Код:
Procedure WindowCallback(Window, Message, wParam, lParam) 
  Select Message
    Case #WM_LBUTTONDOWN 
      keybd_event_(#VK_LWIN,0,0,0) 
      keybd_event_(#VK_D  ,0,0,0)  
      keybd_event_(#VK_D  ,0,#KEYEVENTF_KEYUP,0)
      keybd_event_(#VK_LWIN,0,#KEYEVENTF_KEYUP,0)
    Case #WM_RBUTTONDOWN
      DestroyWindow_(Window) 
    Case #WM_CLOSE 
      DestroyWindow_(Window) 
    Case #WM_DESTROY 
      PostQuitMessage_(0) 
      Result  = 0 
    Default 
      Result  = DefWindowProc_(Window, Message, wParam, lParam) 
  EndSelect 
  ProcedureReturn Result 
EndProcedure 

InitCommonControls_()
#Style  = #WS_VISIBLE | #WS_BORDER | #WS_POPUPWINDOW    
#StyleEx  = #WS_EX_TOPMOST | #WS_EX_TOOLWINDOW	 | #WS_EX_WINDOWEDGE	

WindowClass.s  = "MyWin" 
wc.WNDCLASSEX 
wc\cbsize  = SizeOf(WNDCLASSEX)
wc\lpfnWndProc  = @WindowCallback() 
wc\hCursor  = LoadCursor_(0, #IDC_ARROW)
wc\hbrBackground  = CreatePatternBrush_(LoadImage_(0,@"block.bmp",0,0,0,$2050))
wc\lpszClassName  = @WindowClass 
RegisterClassEx_(@wc) 

hWndMain  = CreateWindowEx_(#StyleEx, WindowClass, "", #Style, 5,GetSystemMetrics_(#SM_CYSCREEN)-100,64,64, 0, 0, 0, 0) 
ShowWindow_(hWndMain,  #SW_SHOWDEFAULT) 
UpdateWindow_(hWndMain);
While GetMessage_(msg.MSG, #Null, 0, 0 ) 
  TranslateMessage_(msg) 
  DispatchMessage_(msg) 
Wend

0

4

Ещё раз убеждаюсь - PureBasic - рулит...

0

5

Пётр написал(а):

Вот теперь с рисунком. Размер по прежнему 3.5КБ
http://pure-basic.narod.ru/forum/MicroProgWin.rar

Так не корректно сравнивать! У тебя Петя 3.5Кб, но это БЕЗ иконки. А у автора иконка есть. С Иконкой у тебя будет 17.2, что уже не так впечатляет.

У mirashic всё честно, но он использовал стороннюю либу PBOSL для скина, она и дает некоторый лишний прирост в размере.
Если написать этот код не на чистом АПИ, а то что возможно средствами Пурика, а то что не возможно, то АПИ, то получится вот так

Код:
hWnd=OpenWindow(0,5,GetSystemMetrics_(#SM_CYSCREEN)-100,64,64,"",#PB_Window_BorderLess|#PB_Window_Invisible)
hBrush = CreatePatternBrush_(LoadImage(1,"button.bmp")) ; АПИ LoadImage_ убрал бы ещё пару Кб
SetClassLong_(WindowID(0), #GCL_HBRBACKGROUND, hBrush)
InvalidateRect_(WindowID(0), 0,1)
SetWindowLongPtr_(WindowID(0),#GWL_EXSTYLE,#WS_EX_TOOLWINDOW) ; убираем значок
SetWindowPos_(hWnd,#HWND_TOPMOST, 0, 0, 0, 0,#SWP_NOACTIVATE|#SWP_NOMOVE|#SWP_NOSIZE)
 
HideWindow(0,0) 
Repeat 
  Select WaitWindowEvent() 
   Case #WM_LBUTTONDOWN 
    keybd_event_(#VK_LWIN,0,0,0) 
    keybd_event_(#VK_D  ,0,0,0)  
    keybd_event_(#VK_D  ,0,#KEYEVENTF_KEYUP,0)
    keybd_event_(#VK_LWIN,0,#KEYEVENTF_KEYUP,0)
   Case #WM_RBUTTONDOWN
    Break             
  EndSelect  
ForEver

Но тут тоже в отличии от авторского кода нет  процедуры расчета вертикальной позиции, а просто жестко указаны цифры.
В итоге получается примерно те же 30 Кб в отличии от авторских 39 Кб. Ну это примерно одно и то же. Ценность кода на Пурике не в размере конечно же, а в лаконичности кода и простоте.

0

6

ВиниПур написал(а):

но это БЕЗ иконки. А у автора иконка есть. С Иконкой у тебя будет 17.2, что уже не так впечатляет.

А теперь тоже самое только по русски.
Разве в окне не отображается BMP рисунок?
Разве у автора не загружается рисунок такого же формата?
Тогда почему не честно? И не забываем что статья называется WINAPI ГРАФИКА.

0

7

В оригинале рисунок BMP и отдельно иконка  для EXE файла...
Но по любому, на PureBasic проще   и понятней код.

Отредактировано mirashic (15.03.2011 11:17:10)

0

8

mirashic написал(а):

отдельно иконка  для EXE файла

Ну иконка будет весить 2 КБ. И как это увеличит размер проги с 3.5 КБ до 17 КБ?

0

9

Иконку автор даёт - 12.5КБ

0

10

mirashic написал(а):

Иконку автор даёт - 12.5КБ

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

0

11

Пётр написал(а):

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

Ну в  первом топике mirashic задачу определил четко:

mirashic написал(а):

Используя те-же иконки и WinAPI (и функции PB) из статьи переложил на PureBasic

Так что измеряем всё - и иконки и код и получившийся ехе шник.

Когда пишешь на АПИ то вообще нет ни какого смысла что то сравнивать - принцип у любого языка будет сходный, хоть Си, хоть Делфи. Размер исполняемого файла будет зависеть от эффективности компилятора. У Пурика своего компилятора нет, а FASM, что он использует довольно не плох, потому и размер ехе шника приемлемый, если на АПИ писать. А вот транслятор в FASM, который Фред написал имеет свои недостатки, тут уже и интересно сравнивать с другими ЯП. Что собственно и было сделано.

P.s. Нет, конечно иконка в 12.5 Кб это нонсенс, и не делает чести автору статьи, тем более, что он вроде борется за маленький размер, даже упаковывает ЕХЕшник! Странный он какой то ;)

0

12

ВиниПур написал(а):

Размер исполняемого файла будет зависеть от эффективности компилятора. У Пурика своего компилятора нет, а FASM, что он использует довольно не плох, потому и размер ехе шника приемлемый

Ну мы ведь не на FASMе пишем.
Поэтому в данном случае, размер исполняемого файла во многом зависит от эффективности транслятора из пурика в фасм.

0

13

Берем код Петра он на чистом API, дописываем комментарии для понятности (мне надо самому разобраться )  и отправляем им на форум...
Наверно пошлют, куда подальше...

0

14

Пётр написал(а):

Поэтому в данном случае, размер исполняемого файла во многом зависит от эффективности транслятора из пурика в фасм.

В том то и дело, если писать на API то "вмешательство" транслятора в результирующий код минимально. FASM не переводит API функции в ассемблер, а использует как есть. Вот к примеру MessageBox в FASM:

Код:
invoke	MessageBox,0,_message,_caption,MB_ICONQUESTION+MB_YESNO

В Пурике её вызов почти ни чем не отличается, и для транслятора особо работы нет. Вся эффективность транслятора проявляется именно при работе с самописными функциями Пурика.
К стати, я пару лет назад проверял эффективность транслятора на примере именно с FASM. Есть код:

Код:
; Beer - example of tiny (one section) Win32 program

format PE GUI 4.0

include '%include%\win32a.inc'

; no section defined - fasm will automatically create .flat section for both
; code and data, and set entry point at the beginning of this section

	invoke	MessageBox,0,_message,_caption,MB_ICONQUESTION+MB_YESNO
	cmp	eax,IDYES
	jne	exit

	invoke	mciSendString,_cmd_open,0,0,0
	invoke	mciSendString,_cmd_eject,0,0,0
	invoke	mciSendString,_cmd_close,0,0,0

exit:
	invoke	ExitProcess,0

_message db 'Do you need additional place for the beer?',0
_caption db 'Desktop configuration',0

_cmd_open db 'open cdaudio',0
_cmd_eject db 'set cdaudio door open',0
_cmd_close db 'close cdaudio',0

; import data in the same section

data import

 library kernel32,'KERNEL32.DLL',\
	 user32,'USER32.DLL',\
	 winmm,'WINMM.DLL'

 import kernel32,\
	ExitProcess,'ExitProcess'

 import user32,\
	MessageBox,'MessageBoxA'

 import winmm,\
	mciSendString,'mciSendStringA'

end data

Если его скомпилировать в FASM то ЕХЕ имеет размер 1 024 байта.

Файл не трудно перевести в аналогичный на Пурике:

Код:
If MessageBox_(0,"Do you need additional place For the beer?","Desktop configuration",#MB_ICONQUESTION|#MB_YESNO) = #IDYES
mciSendString_("open cdaudio",0,0,0)
mciSendString_("set cdaudio door open",0,0,0)
mciSendString_("close cdaudio",0,0,0)
Else
End
EndIf

Всего 7 строчек, причем в последних 3-х по 1 слову! На порядок проще, чем писать в FASM!
Но скомпилировав этот код, понимаешь всё несовершенство транслятора - 2 048 байт, и меньше уже ни как!

А там есть ещё приложение MINIPAD.EXE, так вообще в FASM размер 5 632 байта, а в Пурике аналогичное 16 384 байта. Но правда там есть Окно и я его для чистоты эксперимента писал не на АПИ, а встроенными средствами Пурика.

0

15

mirashic написал(а):

Берем код Петра он на чистом API, дописываем комментарии для понятности (мне надо самому разобраться )  и отправляем им на форум...

И все же я бы сделал акцент на простоту программирования на Пурике, где не надо особо разбираться и кол-во кода минимально. Ну согласитесь, что выгода в 20-30 килобайт сейчас ни кого не удивит, это не актуально. Так что твой код в этом свете выглядит более привлекательно.

0

16

ВиниПур написал(а):

В Пурике её вызов почти ни чем не отличается, и для транслятора особо работы нет. Вся эффективность транслятора проявляется именно при работе с самописными функциями Пурика.

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

ВиниПур написал(а):

К стати, я пару лет назад проверял эффективность транслятора на примере именно с FASM.

Но сильно большой разницы нет.
Да и прога на фасме, по большому счету напрямую не работает со строками, а прога на пурике их использует. Это тоже приводит к увеличению размера EXE.
Кроме того, есть такое понятие как выравнивание секций исполняемого файла PE формата.

ВиниПур написал(а):

Окно и я его для чистоты эксперимента писал не на АПИ, а встроенными средствами Пурика.

Как раз надо было на API чтобы эксперимент был чистым.

PS.
По моему не совсем корректно сравнивать ассемблер с бейсиком. Уровни языков разные!

0

17

ВиниПур написал(а):

И все же я бы сделал акцент на простоту программирования на Пурике, где не надо особо разбираться и кол-во кода минимально. Ну согласитесь, что выгода в 20-30 килобайт сейчас ни кого не удивит, это не актуально. Так что твой код в этом свете выглядит более привлекательно.

А можно сразу 2 варианта чтобы показать простоту программирования и компактность исполняемых файлов.

0

18

Отписался на форуме http://forum.procoder.info/index.php/to … ml#msg3018
Предлагают идти в авторы... но боюсь что знаний не достаточно.
Пётр возможно это по вашей части красиво разрекламировать язык PB

0

19

mirashic написал(а):

Предлагают идти в авторы... но боюсь что знаний не достаточно.

Ну почему же?
У тебя не плохо получается писать программы. Различные плееры и проги для контакта получались просто супер.

mirashic написал(а):

Пётр возможно это по вашей части красиво разрекламировать язык PB

А зачем мне рекламировать пурик? Вот если бы разробы мне за это заплатили....
А так, бесплатно рекламировать чей-то продукт, зачем?

Кстати, у них статьи оплачиваются или как?

PS.
Думаю что не плохая тема для статьи в журнале.

0

20

международный некоммерческий проект по выпуску журнала «ПРОграммист»

Скорее всего бесплатно...

Думаю что не плохая тема для статьи в журнале.

автор статьи и сайта не я

Отредактировано mirashic (15.03.2011 20:02:15)

0


Вы здесь » PureBasic - форум » OpenSource » Cвернуть все окна