Var str:array[0..8] of string=('New', 'Open', 'Save',
'Cut', 'Copy','Paste',
'Stat', 'Freq', 'Exit');
i:integer;
ToolBar:HWND;
tbb:array[0..11] of TTBBUTTON;
function WndProc(wnd:HWND; msg, wParam, lParam:longint):longint; stdcall;
begin
case msg of
WM_CREATE: begin
//заполняю массив типа TTBBUTTON
tbb[0].iBitmap:=0;
tbb[0].idCommand:=101;
tbb[0].fsState:=TBSTATE_ENABLED;
tbb[0].fsStyle:=TBSTYLE_BUTTON;
tbb[0].iString:=0;
tbb[1].iBitmap:=1;
tbb[1].idCommand:=102;
tbb[1].fsState:=TBSTATE_ENABLED;
tbb[1].fsStyle:=TBSTYLE_BUTTON;
tbb[1].iString:=1;
tbb[2].iBitmap:=2;
tbb[2].idCommand:=103;
tbb[2].fsState:=TBSTATE_ENABLED;
tbb[2].fsStyle:=TBSTYLE_BUTTON;
tbb[2].iString:=2;
tbb[3].fsStyle:=TBSTYLE_SEP;
tbb[4].iBitmap:=3;
tbb[4].idCommand:=109;
tbb[4].fsState:=TBSTATE_ENABLED;
tbb[4].fsStyle:=TBSTYLE_BUTTON;
tbb[4].iString:=3;
tbb[5].iBitmap:=4;
tbb[5].idCommand:=110;
tbb[5].fsState:=TBSTATE_ENABLED;
tbb[5].fsStyle:=TBSTYLE_BUTTON;
tbb[5].iString:=4;
tbb[6].iBitmap:=5;
tbb[6].idCommand:=111;
tbb[6].fsState:=TBSTATE_ENABLED;
tbb[6].fsStyle:=TBSTYLE_BUTTON;
tbb[6].iString:=5;
tbb[7].fsStyle:=TBSTYLE_SEP;
tbb[8].iBitmap:=6;
tbb[8].idCommand:=115;
tbb[8].fsState:=TBSTATE_ENABLED;
tbb[8].fsStyle:=TBSTYLE_BUTTON;
tbb[8].iString:=6;
tbb[9].iBitmap:=7;
tbb[9].idCommand:=116;
tbb[9].fsState:=TBSTATE_ENABLED;
tbb[9].fsStyle:=TBSTYLE_BUTTON;
tbb[9].iString:=7;
tbb[10].fsStyle:=TBSTYLE_SEP;
tbb[11].iBitmap:=8;
tbb[11].idCommand:=107;
tbb[11].fsState:=TBSTATE_ENABLED;
tbb[11].fsStyle:=TBSTYLE_BUTTON;
tbb[11].iString:=8;
//Далее создаю панель инструментов
ToolBar:=CreateToolBarEx(wnd, WS_CHILD or WS_VISIBLE or
TBSTYLE_TOOLTIPS or WS_DLGFRAME
or CCS_ADJUSTABLE, 1, 6, hInstance, 1000, @tbb, 12, 16, 16, 16, 16,
SizeOf(TTBBUTTON));
//И только теперь добавляю надпись к кнопкам
for i:=0 to 8 do
SendMessage(ToolBar, TB_ADDSTRING, 0, longint(PAnsiChar(str)));
end;
end;
end;
БезТемы
«New», «яяяя», «Open», «Save», «Cut», «яяяя», «Copy», «Paste», «Stat»
Должно быть так:
«New», «Open», «Save», «Cut», «Copy», «Paste», «Stat», «Freq», «Exit».
Код написан на Delphi и имеет следующий вид:
Код:
Все попытки исправить надписи ни к чему не привели! В частности пробовал объявить массив str следующим образом:
Код:
Var str:array[0..11] of string=('New', 'Open', 'Save',’’,
'Cut', 'Copy','Paste',’’,
'Stat', 'Freq', ‘ ‘, 'Exit');
…………….
for i:=0 to 11 do
SendMessage(ToolBar, TB_ADDSTRING, 0, longint(PAnsiChar(str)));
'Cut', 'Copy','Paste',’’,
'Stat', 'Freq', ‘ ‘, 'Exit');
…………….
for i:=0 to 11 do
SendMessage(ToolBar, TB_ADDSTRING, 0, longint(PAnsiChar(str)));
Но и это не привело к ожидаемому результату!
И второй вопрос: панель инструментов считается не клиентской частью окна или клиентской? Каким образом можно получить координаты курсора мыши над панелью инструментов при щелчке на ней правой кнопкой мыши? Пробовал писать следующее:
Код:
Var xPos, yPos: integer;
Function WndProc(wnd:HWND; msg, wParam, lParam:longint):longint; stdcall;
Begin
case msg of
WM_NCRBUTTONDOWN: begin
xPos:=PPoint(lParam).X;
yPos:=PPoint(lParam).Y;
end;
case PNMTOOLBAR(lParam).hdr.code of
NM_RCLICK: TrackPopupMenu(PopupMenu, 0, xPos, yPos, 0, wnd, nil);
end;
end;
end;
Function WndProc(wnd:HWND; msg, wParam, lParam:longint):longint; stdcall;
Begin
case msg of
WM_NCRBUTTONDOWN: begin
xPos:=PPoint(lParam).X;
yPos:=PPoint(lParam).Y;
end;
case PNMTOOLBAR(lParam).hdr.code of
NM_RCLICK: TrackPopupMenu(PopupMenu, 0, xPos, yPos, 0, wnd, nil);
end;
end;
end;
При щелчке правой кнопкой мыши по панели инструментов показывается контекстное меню с координатами (0;0); а если щёлкнуть по главному меню появляется ошибка «Exception EAccessViolation in module ‘Project1.exe’ at 000091CF». Что я делаю неправильно?
?????
Цитата: SergPas
IMG]http://D:\ToolBar[/IMG]
баги в форумах ищем чтоли :D
Если объявить стринговый массив таким образом:
Код:
Var str:array[0..8] of string=
('New', 'Open', 'Save',
'Cut', 'Copy','Paste',
'Stat', 'Freq', 'Exit');
('New', 'Open', 'Save',
'Cut', 'Copy','Paste',
'Stat', 'Freq', 'Exit');
то работать будет неправильно (см. рисунок)!
Если же он будет объявлен таким образом:
Код:
Var str:array[0..8] of string=
('New ','Open','Save',
'Cut ','Copy','Paste',
'Stat','Freq','Exit');
('New ','Open','Save',
'Cut ','Copy','Paste',
'Stat','Freq','Exit');
или таким:
Код:
Var str:array[0..8] of string=
('New'#0,'Open','Save',
'Cut'#0,'Copy','Paste',
'Stat','Freq','Exit');
('New'#0,'Open','Save',
'Cut'#0,'Copy','Paste',
'Stat','Freq','Exit');
то названия кнопок будут соответствовать элементам массива, и никаких названий типа "яяяя" отображаться не будет! Обратите особое внимание на разницу в элементах массивов! И элемент-строка 'New' должна заканчиваться нулём ('New'#0) и элемент-строка 'Cut' также заканчивается нулём ('Cut'#0). Только в этом случае будет работать правильно!!!
Итак, завершающие нуль (#0) надо ставить в конце каждой строки!
Одна проблема решена! Может кто-нибудь поможет со второй?
Цитата: SergPas
Итак, завершающие нуль (#0) надо ставить в конце каждой строки!
А что мешало описать массив как array of PChar? Пусть компилятор работает, нули добавляет - он электронный.
Не понял, почему ошибка. У тебя что, "Huge strings" {$H+} в настройках компилятора отключены?
Согласитесь, получается белиберда... Именно поэтому пишем array of string и добавляем символ конца строки!!! И ещё, причём здесь "Huge strings"{$H+} ???
Цитата: SergPas
К сожалению тип PChar в данном случае использовать нельзя. По непонятной мне причине надписи на кнопках появляются в следующем порядке: "New" "Open" "Open" "Save" "Cut" "Copy" "Copy" "Past" "Stat"
Согласитесь, получается белиберда... Именно поэтому пишем array of string и добавляем символ конца строки!!! И ещё, причём здесь "Huge strings"{$H+} ???
Согласитесь, получается белиберда... Именно поэтому пишем array of string и добавляем символ конца строки!!! И ещё, причём здесь "Huge strings"{$H+} ???
Не причем, т.к. строки у тебя меньше 256. Мне думается что проблемма здесь в том что нужно под все слова выделить одинакового размера строки, а не разные как это почемуто происходит в дельфях (:... делается это помойму так
Код:
Var str:array[0..8] of string[COLOR="Red"][32][/COLOR]=('New', 'Open', 'Save',
'Cut', 'Copy','Paste',
'Stat', 'Freq', 'Exit');
'Cut', 'Copy','Paste',
'Stat', 'Freq', 'Exit');
Можно и так объявить, но не рекомендую... В C++ несколько проще работать со строками... Если его так объявить, то на практике получим следующее "Cut" "Copy" и т.д. В файле справки по панели инструментов говорится, что каждая строка должна заканчиваться нулём, а последняя- 2-мя нулями.