Помощь - Поиск - Пользователи - Календарь
Полная версия: Панель инструментов средствами Win API CreateWindowEx
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
IKh
Здравстуйте.

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

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

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

IUnknown
С английским проблем нет? Тогда: App Part 3: Tool and Status bars
IKh
Цитата(IUnknown @ 9.10.2011 15:33) *

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


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

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

Нажмите для просмотра прикрепленного файла

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


Type
TlBarBtn = TTBBUTTON;

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

.

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


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

.

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

Ничего не валится, все работает... Сам исходник тоже прилагаю:
Нажмите для просмотра прикрепленного файла
IKh
Цитата(IUnknown @ 11.10.2011 22:49) *

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

Ничего не валится, все работает... Сам исходник тоже прилагаю:
Нажмите для просмотра прикрепленного файла


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

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

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

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

Нажмите для просмотра прикрепленного файла

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

Нажмите для просмотра прикрепленного файла

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

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

Нажмите для просмотра прикрепленного файла

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

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


Результат тот же самый:
Нажмите для просмотра прикрепленного файла
IUnknown
Цитата
           {Прорисовка окна}
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;
IKh
Спасибо! Ошибку понял.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.