Что такое код getmenustring

Что такое код getmenustring

Всем хорошего настроения!

Код: Выделить всё
procedure TForm1.StringGrid1MouseWheelDown(Sender: TObject;
Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
StringGrid1.Perform(WM_VSCROLL, SB_PAGEDOWN, 0);
Handled := True;
end;

procedure TForm1.StringGrid1MouseWheelUp(Sender: TObject;
Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
StringGrid1.Perform(WM_VSCROLL, SB_PAGEUP, 0);
Handled := True;
end;

Вышеприведённый код, постранично скролит StringGrid1.
Если скролить колёсиком мышки := всё чудесно работает.

ПРОБЛЕМА:
если потянуть за скролеер (а не крутить колёсиком мышки), то постраничное перелистывание сбивается.
Может сбиться на строчку, а может на пол строчки.
Как постранично скролить, перемещая grid за скроллер?

Добавлено спустя 88 минут 88 секунд:
Код: Выделить всё TScrollCode = (
// . Beware. The position of these enums must correspond to the SB_xxx
// values in LCLType (Delphi compatibility, not our decision)
// MWE: Don’t know it this still is a requirement
// afaik have I remeved all casts from the LCL
scLineUp, // = SB_LINEUP
scLineDown, // = SB_LINEDOWN
scPageUp, // = SB_PAGEUP
scPageDown, // = SB_PAGEDOWN
scPosition, // = SB_THUMBPOSITION
scTrack, // = SB_THUMBTRACK
scTop, // = SB_TOP
scBottom, // = SB_BOTTOM
scEndScroll // = SB_ENDSCROLL
);

Выше код из исходников лазаруса ( StdCtrls ). Возможность постраничного перелистывания туда заложена.
Но не могу понять: где мне задать ему TScrollCode := scPageUp and scPageDown, для пролистывания за скроллер ?

Заранее всем спасибо!

Re: StringGr > olegy123 » 22.12.2020 02:21:20

TScrollCode часть оконных сообщений WM_VSCROLL и WM_HSCROLL

var Mes: TWMScroll;
mes.Msg := WM_VSCROLL;
mes.ScrollCode := SB_Right;
mes.Pos := 0;
StringGrid1.Dispatch(mes);

ну и функции
GetScrollRange(StringGrid1.Handle,SB_VERT,vMin,vMax); возращает vMin,vMax значение;
vPos := GetScrollPos(StringGrid1.Handle,SB_VERT); — возращает vPos
SetScrollPos(StringGrid1.Handle,WM_VSCROLL, vPos, True); перейти на vPos

я точно не понял в чем проблема, но для гибкости проще преопределить сообщения:
procedure WMHScroll(var message : TLMHScroll); message LM_HSCROLL;
procedure WMVScroll(var message : TLMVScroll); message LM_VSCROLL;

Re: StringGr > vitaly_l » 22.12.2020 08:40:16

Если установить:
StringGrid1.Perform(WM_VSCROLL, SB_PAGEUP, 0);
StringGrid1.Perform(WM_VSCROLL, SB_PAGEDOWN, 0);
то при прокрутке КОЛЁСИКОМ, программа прокручивает грид ПОСТРАНИЧНО.

Однако, при скроллинге за скроллер, ПОСТРАНИЧНОЕ перемещение ломается и получается некрасиво
( обрезается пол строки, а страницы начинают «скакать» даже при скроллинге за колёсико, т.к. сбилось ПОСТРАНИЧНОЕ перемещение
из-за отсутствия в моём коде, команды, ПОСТРАНИЧНОГО перемещения за скроллер. При этом при перемещении КОЛЁСИКОМ — всё работает. ).

Как ПОСТРАНИЧНО скролить, перемещая grid за СКРОЛЛЕР?
PS: Точнее я уже написал костыль, который после перемещения ставит скроллер в нужное положение на onMouseEnter и всё работает. Как активировать системную функцию ПОСТРАНИЧНОГО перелистывания StringGrid за скроллер ?

Добавлено спустя 88 минут 88 секунд:
По сути нужно установить, у StringGrid: ШАГ ПЕРЕМЕЩЕНИЯ СКРОЛЛЕРА — равный одной странице.
Как это делается? ( Должна быть: какая-то системная команда, т.к. для колёсика она уже существует. )

Re: StringGr > olegy123 » 23.12.2020 22:17:34

Я не большой специалист по скролбарам, но примерах в системных окнах (TWinControl) скролбар не имеет шага. его поведения нужно предопределять
посмотрите на код в grids.pas где в классе TCustomGrid (TStringGrid -> TCustomStringGrid -> TCustomDrawGrid -> TCustomGrid) описана процедура обработки сигналов со скроллбаров
procedure WMVScroll(var message : TLMVScroll); message LM_VSCROLL;

там кстати есть обработка этих сообщений:
StringGrid1.Perform(WM_VSCROLL, SB_PAGEUP, 0);
StringGrid1.Perform(WM_VSCROLL, SB_PAGEDOWN, 0);

Илон Маск рекомендует:  Что такое код ifx_affected_rows

если не хотите создовать свой класс от TStringGrid с предопределенным ..message LM_VSCROLL;
можно решить задачу через TScrollBar, он имеет шаг ползунка (LargeChange/SmallChange).
Им можно сэмулировать системный ScrollBar -> StringGr >в событиях OnScroll у ScrollBar можно уже давать
либо позиционировать StringGrid на заданную строку (наверное TopRow?)
или использовать те же:
StringGrid.Perform(WM_VSCROLL, SB_PAGEUP, 0);
StringGrid1.Perform(WM_VSCROLL, SB_PAGEDOWN, 0);

Re: StringGr > vitaly_l » 23.12.2020 22:33:30

Вот именно что там есть. Да, верно оно там заложено. Но как его активировать?

Вы сами привели пример: GetScrollRange(StringGrid1.Handle,SB_VERT,vMin,vMax);
Из этого примера следует, что существует СИСТЕМНАЯ функция, которую нужно вызвать и заложить туда SB_PAGEUP и SB_PAGEDOWN.

Возможно кто-то уже сталкивался и\или знает ответ, вот я и спросил. Как перелистывать постранично за скроллер?

olegy123 писал(а): можно решить задачу через TScrollBar, он имеет шаг ползунка (LargeChange/SmallChange).
Им можно сэмулировать системный ScrollBar -> StringGr >

Это, реальное решение, я над ним давно задумался, но всё ещё тешу себя надеждой, что есть готовая системная функция,
потому что, для колёсика, она есть. Значит и для скроллера должна быть.

Re: StringGr > olegy123 » 23.12.2020 22:53:05

созданием своего компонента:

TMyStringGr >protected
procedure WMVScroll(var message : TLMVScroll); message LM_VSCROLL;
end;

procedure TMyStringGrid.WMVScroll(var message: TLMVScroll);
.
end;

— уже этого достаточно чтобы он умел правильно скролить.
можно разместить на панели контроллов и использовать везде где надо.
но надо зарегистрировать его.

Добавлено спустя 5 минут 4 секунды:

Re: StringGr > Лекс Айрин » 24.12.2020 10:43:36

А чем не устраивает щелчок не на модификаторе(кнопке), а на самом ползунке? Лично я так делаю даже чаще чем колесиком. Причем, это системное поведение.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

GetMenuString

WinApi Функция GetMenuString

Описание:
function GetMenuString(Menu: HMenu; IDItem: Word; Str: PChar; MaxCount: Integer; Flag: Word): Integer;

Копиpует метку элемента меню в Str. Копиpуемая метка заканчивается пустым символом.

Паpаметpы:
Menu: Идентификатоp меню.
IDItem: Идентификатоp элемента меню.
Str: Пpинимающий буфеp.
MaxCount: Размеp буфеpа.
Flag: Одна из констант меню mf_ByPosition, mf_ByCommand. См. «Флаги меню, mf_».

Возвpащаемое значение:
Фактическое число скопиpованных байт

Если кто то из вас до сих пор думает что установка атс и её настройка это легко, могу с уверенностью сказать, что это не так, буквально сегодня мне пришлось работать со старенькой моделью атс Ericsson. Безумная куча настроек и не меньшее количество багов (так например, после 2-ух дней я наконец понял что панель управления не сохраняет измененные данные если вы используете браузер IE старше 6 версии и у вас стоит Win Xp Sp3), хорошо что многое мне подсказали знающие люди, один бы я бы точно не разобрался.

Материал взят из:
Русская спpавка по Windows API

Прочитайте онлайн СПРАВОЧНИК ПО WinAPI | GetMenuString

Описание: function GetMenuString(Menu: HMenu; IDItem: Word; Str: PChar; MaxCount: Integer;

Flag: Word): Integer;

Копиpует метку элемента меню в Str. Копиpуемая метка заканчивается пустым символом.

Паpаметpы:

Menu: Идентификатоp меню.

IDItem: Идентификатоp элемента меню.

Str: Пpинимающий буфеp.

MaxCount: Размеp буфеpа.

Flag: Одна из констант меню mf_ByPosition, mf_ByCommand. См. pаздел «Флаги меню, mf_» в главе 1.

Возвpащаемое значение:

Фактическое число скопиpованных байт. функция находится в файле user32.dll

Внимание!

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

Публикация данных материалов не преследует за собой никакой коммерческой выгоды.

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

Все права на исходные материалы принадлежат соответствующим
организациям и частным лицам.

Что такое код getmenustring

We recommend upgrading to the latest Google Chrome or Firefox.

Join GitHub today

GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.

Win32API / libraries / user32 / GetMenuString.md

Function name : GetMenuString

The GetMenuString function copies the text string of the specified menu item into the specified buffer.

hMenu [in] Handle to the menu.

Илон Маск рекомендует:  Что такое код cpdf_begin_text

uIDItem [in] Specifies the menu item to be changed, as determined by the uFlag parameter.

lpString [out] Pointer to the buffer that receives the null-terminated string.

nMaxCount [in] Specifies the maximum length, in characters, of the string to be copied.

uFlag [in] Specifies how the uIDItem parameter is interpreted: MF_BYCOMMAND or MF_BYPOSITION

If the function succeeds, the return value specifies the number of characters copied to the buffer, not including the terminating null character.

Что такое код getmenustring

Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ !
4. Используйте теги [ code=vba ] . текст программы. [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

ВИДЕОКУРС
выпущен 4 ноября!

Описание:
function GetMenuString(Menu: HMenu; IDItem: Word; Str: PChar; MaxCount: Integer;
Flag: Word): Integer;

Копиpует метку элемента меню в Str. Копиpуемая метка заканчивается пустым
символом.

Паpаметpы:
Menu: Идентификатоp меню.
IDItem: Идентификатоp элемента меню.
Str: Пpинимающий буфеp.
MaxCount: Размеp буфеpа.
Flag: Одна из констант меню mf_ByPosition, mf_ByCommand. См. pаздел «Флаги меню,
mf_» в главе 1.

Возвpащаемое значение:
Фактическое число скопиpованных байт.

GetMenuString returns empty string [closed]

Want to improve this question? Update the question so it’s on-topic for Stack Overflow.

Closed 5 years ago .

I’m trying to read string from menu like this :

WHats wrong with this code, the method returns correct non zero length, but empty string ?

2 Answers 2

The fourth argument is supposed to be the size of the buffer. Try rewriting as

By passing in 0 as the size of the buffer GetMenuString just returns the length of the string, so it did precisely what you told it to do. :-)

Share and enjoy.

You need to provide an allocated buffer with the maximum length specified in the max count parameter. You’ve indicated to the function that that max count is 0 .

You need to provide a buffer for the text to be copied into.

Not the answer you’re looking for? Browse other questions tagged c winapi or ask your own question.

Hot Network Questions

site design / logo © 2020 Stack Exchange Inc; user contributions licensed under cc by-sa 4.0 with attribution required. rev 2020.11.12.35412

GetMenuString возвращает пустую строку

0 Conker [2014-02-08 21:31:00]

Я пытаюсь читать строку из меню следующим образом:

Что неправильно с этим кодом, метод возвращает правильную ненулевую длину, но пустую строку?

2 ответа

2 Решение Bob Jarvis [2014-02-08 21:35:00]

Четвертый аргумент должен быть размером с буфером. Попробуйте переписать как

Переходя в 0 как размер буфера, GetMenuString просто возвращает длину строки, поэтому она сделала именно то, что вы сказали ей сделать. :-)

Поделитесь и наслаждайтесь.

1 Chad [2014-02-08 21:38:00]

Вам необходимо предоставить выделенный буфер с максимальной длиной, указанной в параметре максимального количества. Вы указали функции, что максимальное число равно 0 .

Вам необходимо предоставить буфер для текста, который нужно скопировать.

Загрузка динамических меню в CBuilder

После предыдущей дискуссии вы могли подумать, что загрузка меню из файла ресурса будет довольно простой задачей. У меню есть свой тип ссылок, именуемый HMENU, и его можно загрузить из ресурса с помощью функции API LoadMenu. Так что вы могли решить, что для загрузки меню из файла ресурса достаточно написать примерно такую строку кода:

Илон Маск рекомендует:  Что такое код asp iiswebdirectory

MainMenu1->Handle = LoadMenu( HInstance, MAKEINTRESOURCE(ID_MY_MENU));

Вы могли бы так подумать; однако суть в том, что это не работает. Меню обрабатываются Windows API по-другому, нежели растровые рисунки, значки или строки, так как меню является частью окна, в то время как все остальное — отдельные элементы, не связанные с чем-либо. Я был, по правде говоря, слегка удивлен, что компания Borland не оформила функциональность меню так же, как оформлено все остальное, но, в конце концов, не надо обольщаться, что кто-то сделает за вас всю работу.

Почему вы не можете написать приведенный только что код? Ответ прост. Свойство Handle объекта TMainMenu является частным (private) членом класса, так что вы не можете обращаться к нему напрямую из вашей формы. Вместо этого вы можете обращаться к свойствам меню косвенно, добавляя или удаляя элементы из меню.

Однако выходит, что мы можем эмулировать динамическую загрузку элементов меню, делая это вручную. Для этого поместите на форму компонент TMainMenu (главное меню) без элементов. Форма, которую мы используем, приведена на рис. 10.2. Как видите, на ней нет ничего, кроме

главного меню без элементов.

Используя эту форму, мы собираемся загружать меню из файла ресурсов, присоединенного к программе. Во-первых, создайте файл ресурса и присоедините его к программе. Для получения файла ресурса вам нужно создать текстовый файл с определениями ресурсов (как наша таблица строк в предыдущем примере) и затем добавить файл в проект. Для нашего проекта ресурсный файл будет выглядеть так:

1001 MENU PRELOAD DISCARDABLE BEGIN

MENUITEM «&New\tCtrl+N», 101

MENUITEM «&Open…\tCtrl+O», 102 MENUITEM «&P&rint setup…», 103 MENUITEM «&Recent File», 104 MENUITEM «E&xit», 105

POPUP «&View» BEGIN

MENUITEM «&Toolbar», 106 MENUITEM «&Status bar», 107 END

POPUP «&Help» BEGIN

MENUITEM «&About», 108 END

Рис. 10.2. Форма примера динамического меню

Добавление файла ресурсов в проект — дело нехитрое. Выберите команду меню Project д Add to project и выберите файл ресурса из списка, задав маску файлов *.rc (описания ресурсов). CBuilder знает о файлах ресурсов достаточно, так что он автоматически их скомпилирует и свяжет с исполняемым файлом во время сборки приложения.

Итак, у нас теперь есть некоторые ресурсы, присоединенные к проекту. Нужен нам тот, в котором определено наше меню. Теперь пора научиться загружать этот ресурс из исполняемого файла во время работы приложения. Если бы у вас было несколько меню, то вы могли бы выбирать из них одно, основываясь на каком-либо своем критерии, и точно таким же образом загружать. Давайте

посмотрим на сам код, который загружает меню из ресурса и встраивает его в форму:

void __fastcall TForm1::FormCreate(TObject *Sender)

// Загрузить ресурс меню из файла ресурсов

HMENU hMenu = LoadMenu((HINSTANCE) HInstance, MAKEINTRESOURCE(1001));

// Получить количество подменю в этом меню

int nCount = GetMenuItemCount(hMenu);

// Пройтись по всем пунктам,

// получая нужную информацию

for ( int i=0; i Caption = szBuffer;

// Получить информацию о подменю

for ( int nSubPos = 0; nSubPos Caption = szBuffer;

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

Прочитайте онлайн СПРАВОЧНИК ПО WinAPI | GetMenuString

Описание: function GetMenuString(Menu: HMenu; IDItem: Word; Str: PChar; MaxCount: Integer;

Flag: Word): Integer;

Копиpует метку элемента меню в Str. Копиpуемая метка заканчивается пустым символом.

Паpаметpы:

Menu: Идентификатоp меню.

IDItem: Идентификатоp элемента меню.

Str: Пpинимающий буфеp.

MaxCount: Размеp буфеpа.

Flag: Одна из констант меню mf_ByPosition, mf_ByCommand. См. pаздел «Флаги меню, mf_» в главе 1.

Возвpащаемое значение:

Фактическое число скопиpованных байт. функция находится в файле user32.dll

Внимание!

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

Публикация данных материалов не преследует за собой никакой коммерческой выгоды.

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

Все права на исходные материалы принадлежат соответствующим
организациям и частным лицам.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL