IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Панель инструментов средствами Win API CreateWindowEx
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Игорь

Репутация: -  0  +


Здравстуйте.

Объясните пожалуйста, можно ли создать панель инструментов в окне прииложения созданного на Delphi средствами Win API - CreateWindowEx.

В описании говориться, что для создания панели инструментов без кнопок можно использовать функцию CreateWindowEx указывая имя класса окна TOOLBARCLASSNAME.

Подскажите как можно это сделать в приложении на Delphi.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


С английским проблем нет? Тогда: App Part 3: Tool and Status bars
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Игорь

Репутация: -  0  +


Цитата(IUnknown @ 9.10.2011 15:33) *

С английским проблем нет? Тогда: App Part 3: Tool and Status bars


Спасибо за ссылку. Изучаю, на данный момент панель управления получена и теперь нужно добавить кнопки на панель управления посредством отправки сообщения TB_ADDBUTTONS с указанием числа добавляемых кнопок и указателя на массив кнопок заданных структурой TTBBUTTON.

При компилировании выдается сообщение:

Прикрепленный файл  Application_Error.bmp ( 182.97 килобайт ) Кол-во скачиваний: 1207


Массив кнопок для добавления определил так:


Type
TlBarBtn = TTBBUTTON;

Var
TlBarBtns: Array [0..5] of TlBarBtn;

.

Кнопки добавляю так:


SendMessage(TlBar, TB_BUTTONSTRUCTSIZE, SizeOf(TlBarBtns) div SizeOf(TTBBUTTON), Integer(@TlBarBtns));

.

Пожалуйста подскажите, где ошибаюсь. Спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
Пожалуйста подскажите, где ошибаюсь.
Без понятия. Взял стандартный пример чисто WinAPI-шного приложения из FPC (Дельфи запускать - лень), добавил то, о чем говорится в статье по ссылке и в твоем посте. Откомпилировал, запустил. Вот:
Прикрепленное изображение

Ничего не валится, все работает... Сам исходник тоже прилагаю:
Прикрепленный файл  winhello_1.pas ( 3.44 килобайт ) Кол-во скачиваний: 707
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Игорь

Репутация: -  0  +


Цитата(IUnknown @ 11.10.2011 22:49) *

Без понятия. Взял стандартный пример чисто WinAPI-шного приложения из FPC (Дельфи запускать - лень), добавил то, о чем говорится в статье по ссылке и в твоем посте. Откомпилировал, запустил. Вот:
Прикрепленное изображение

Ничего не валится, все работает... Сам исходник тоже прилагаю:
Прикрепленный файл  winhello_1.pas ( 3.44 килобайт ) Кол-во скачиваний: 707



Больше Вам спасибо. Я начал сравнивать ваш код и свой и нашел - глупая ошибка, даже не знаю как сказать - невнимательность! Отправлял сообщение на добавление кнопок, до создания экземпляров кнопок.

Вот, что получилось:

Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Игорь

Репутация: -  0  +


Пожалуйста подскажите, как можно избежать перерисовки клиентской области окна при вызове диалоговых окон "Открыть" или "Сохранить" функциями GetOpenFileName и GetSaveFileName.

До вызова любого из диалоговых окон, родительское окно имеет вид:

Прикрепленное изображение

После вызова диалогового окна, окно принимает вид:

Прикрепленное изображение

то есть клиентская часть окна перерисовывается - надпись Заготовка находится под диалоговым окном.

Далее при перемещении диалогового окна, родительское принимает вид:

Прикрепленное изображение

то есть надпись Заготовка перерисовывается во все тех участках основного окна, куда было перемещено диалоговое окно. Надпись занимает свое исходное положение после изменения размера окна (стиль класса окна: CS_HRedraw or CS_VRedraw) или же при посылке сообщения WM_PAINT после закрытия диалогового окна.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Не воспроизводится (WinXP SP3 + Dephi2009/FPC 2.4.4, проверял окном GetOpenFileName, тягал его во все стороны - не получилось добиться артефактов). Можешь прикрепить минимальный тестовый проект (просто отрисовка главного окна с надписью + запрос имени файла), который воспроизводит проблему? Чтоб можно было откомпилировать, запустить и посмотреть, есть ли проблема, и как от нее избавиться.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Игорь

Репутация: -  0  +


Цитата(IUnknown @ 24.10.2011 23:25) *

Не воспроизводится (WinXP SP3 + Dephi2009/FPC 2.4.4, проверял окном GetOpenFileName, тягал его во все стороны - не получилось добиться артефактов). Можешь прикрепить минимальный тестовый проект (просто отрисовка главного окна с надписью + запрос имени файла), который воспроизводит проблему? Чтоб можно было откомпилировать, запустить и посмотреть, есть ли проблема, и как от нее избавиться.


Вот текст, оставил отрисовку окна с надписью и вызов диалогового окна.

program test;

uses
CommCtrl,
ComCtrls,
CommDlg,
Messages,
Windows;

const
AppName ='Упражнение';

var
MainWnd: HWND;
WindowClass: TWndClass;
OpnSvFileStr: TOpenFileName;
FilePath : array [0..260] of Char = '';
FileName : array [0..260] of Char = '';
PaintStruct: TPaintStruct;
Msg: TMsg;
DevCon: HDC;

function WindowProc(hwnd:HWND; uMsg:UINT; wPARAM:WPARAM; lPARAM:LPARAM):LongInt;
stdcall;
begin
WindowProc := 0;
case uMsg of
WM_DESTROY:
begin
PostQuitMessage(0);
exit;
end;
WM_PAINT:
begin
{Прорисовка окна}
DevCon := BeginPaint(hwnd, PaintStruct);
DrawText(DevCon,PChar('Заготовка'),-1,PaintStruct.rcPaint,
DT_SINGLELINE or DT_CENTER or DT_VCENTER);
EndPaint(hwnd, PaintStruct);
end;
end;
WindowProc := DefWindowProc(hwnd, uMsg, wPARAM, lPARAM);
end;

begin

ZeroMemory(@WindowClass, SizeOf(WindowClass));
with WindowClass do
begin
Style := cs_HRedraw or cs_VRedraw;
lpfnWndProc := @WindowProc;
cbClsExtra := 0;
cbWndExtra := 0;
hInstance := 0;
hIcon := LoadIcon (0, IDI_Application);
hCursor := LoadCursor (0, IDC_Arrow);
hbrBackground := GetStockObject(WHITE_BRUSH);
lpszMenuName := '';
lpszClassName := AppName;
end;

if InitCommonControl(ICC_BAR_CLASSES) = False then halt;

If RegisterClass(WindowClass) = 0 then Halt;
MainWnd := CreateWindowEx(WS_EX_DLGMODALFRAME or WS_EX_WINDOWEDGE,AppName,
'Упражнение',WS_OVERLAPPEDWINDOW or WS_HSCROLL
or WS_VSCROLL,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,0,0,HInstance,nil);
ShowWindow(MainWnd,SW_SHOW);

ZeroMemory(@OpnSvFileStr, SizeOf(OpnSvFileStr));
with OpnSvFileStr do
begin
lStructSize := SizeOf(OpnSvFileStr);
hwndOwner := MainWnd;
lpstrFilter := 'Файлы bmp'#0'*.bmp'#0'Файлы JPEG'#0'*.jpeg'#0#0;
lpstrCustomFilter := nil;
lpstrFile := FilePath;
nMaxFile := SizeOf(FilePath);
lpstrFileTitle := FileName;
nMaxFileTitle := SizeOf(FileName);
lpstrInitialDir := nil;
Flags := OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST;
end;

getopenfilename(OpnSvFileStr);

while GetMessage (Msg,0,0,0) do
begin
TranslateMessage (Msg);
DispatchMessage (Msg);
end;

Halt (Msg.wParam);
end.


Результат тот же самый:
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
           {Прорисовка окна}
DevCon := BeginPaint(hwnd, PaintStruct);
DrawText(DevCon,PChar('Заготовка'),-1,PaintStruct.rcPaint,
DT_SINGLELINE or DT_CENTER or DT_VCENTER);
EndPaint(hwnd, PaintStruct);
Что это должно делать? PaintStruct.rcPaint, судя по MSDN, это:
Цитата
A RECT structure that specifies the upper left and lower right corners of the rectangle in which the painting is requested, in device units relative to the upper-left corner of the client area.
Мало ли, что запросит перерисовать система... Сообщение должно быть в центре окна, а не в центре перерисовываемой области:

     WM_PAINT:
begin
{Прорисовка окна}
DevCon := BeginPaint(hwnd, PaintStruct);
GetClientRect(hwnd, Rc);
DrawText(DevCon,PChar('Заготовка'),-1, Rc,
DT_SINGLELINE or DT_CENTER or DT_VCENTER);
EndPaint(hwnd, PaintStruct);

Exit;
end;


Сообщение отредактировано: IUnknown -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Игорь

Репутация: -  0  +


Спасибо! Ошибку понял.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 8.05.2024 18:00
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name