Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Win32 API | PureBasic | Управление буфером консольного окна (http://forum.oszone.net/showthread.php?t=75006)

unhappy 22-11-2006 10:20 515384

Win32 API | PureBasic | Управление буфером консольного окна
 
Добрый день.
Мне необходимо изменить размер буфера консольного окна.
Я нашел описание функции SetConsoleScreeBufferSize_ на http://msdn.microsoft.com
Но когда я запускаю на выполнение такой код:
Код:

If OpenConsole()   
  stdout.l=GetStdHandle_(#STD_OUTPUT_HANDLE) 
  mySize.COORD
  mySize\x = 80
  mySize\y = 29
  SetConsoleScreenBufferSize_(stdout, mySize)
  Debug(Str(GetLastError_()) )
EndIf

ничего не происходит. В дебаге я получаю код ошибки 87 (на MSDN сказано: ERROR_INVALID_PARAMETER - The parameter is incorrect.)
Вместе с тем параметр, как видно из кода, заявлен как и нужно COORD, handle окна ловится нормально потому что вот такой код, к примеру, работает нормально:
Код:

If OpenConsole()   
  stdout.l=GetStdHandle_(#STD_OUTPUT_HANDLE) 
  NewSize.SMALL_RECT
  NewSize\Top = 0
  NewSize\Left = 0
  NewSize\Bottom=29
  NewSize\Right=80
  SetConsoleWindowInfo_(stdout,1,@NewSize)
EndIf

и окно (само окно, а не буфер) ресайзится нормально.
Кто сталкивался с чем-либо похожим?

amel27 23-11-2006 12:51 515904

unhappy
спасибо за сабж... очень неплох, жаль небесплатный :(
насколько понял из справки пурибасик поддерживает передачу сруктур (в функции и процедуры) только "по ссылке", а SetConsoleScreenBufferSize принимает структуру "по значению".
Цитата:

You must pass a pointer to this variable as you cannot pass structured variables directly.
...тем не менее удалось его обмануть заменив структуру на число двойной длины:
Код:

If OpenConsole()   
  stdout.l=GetStdHandle_(#STD_OUTPUT_HANDLE) 
  NewSize.SMALL_RECT
  NewSize\top = 0
  NewSize\left = 0
  NewSize\bottom=50
  NewSize\right=50
  SetConsoleWindowInfo_(stdout,1,@NewSize)
 
  mySize.l
  mySize = (51 << 16) + 51
  SetConsoleScreenBufferSize_(stdout, mySize)
  Debug(Str(GetLastError_()) )
EndIf


unhappy 26-03-2007 11:34 566589

amel27
Спасибо! Сейчас попробовал - всё работает.
Действительно же в описаниии функции на msdn указано, что надо передавать не указатель на структуру, а именно параметр в dword. это всё невнимательность :(
Полную версию PureBasic можно найти на ru-board'е


Время: 16:41.

Время: 16:41.
© OSzone.net 2001-