![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
IKh |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Игорь Репутация: ![]() ![]() ![]() |
Здравстуйте.
Объясните пожалуйста, можно ли создать панель инструментов в окне прииложения созданного на Delphi средствами Win API - CreateWindowEx. В описании говориться, что для создания панели инструментов без кнопок можно использовать функцию CreateWindowEx указывая имя класса окна TOOLBARCLASSNAME. Подскажите как можно это сделать в приложении на Delphi. |
IUnknown |
![]()
Сообщение
#2
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
С английским проблем нет? Тогда: App Part 3: Tool and Status bars
|
IKh |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Игорь Репутация: ![]() ![]() ![]() |
Спасибо за ссылку. Изучаю, на данный момент панель управления получена и теперь нужно добавить кнопки на панель управления посредством отправки сообщения 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 |
![]()
Сообщение
#4
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата Пожалуйста подскажите, где ошибаюсь. Без понятия. Взял стандартный пример чисто WinAPI-шного приложения из FPC (Дельфи запускать - лень), добавил то, о чем говорится в статье по ссылке и в твоем посте. Откомпилировал, запустил. Вот:![]() Ничего не валится, все работает... Сам исходник тоже прилагаю: ![]() |
IKh |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Игорь Репутация: ![]() ![]() ![]() |
Без понятия. Взял стандартный пример чисто WinAPI-шного приложения из FPC (Дельфи запускать - лень), добавил то, о чем говорится в статье по ссылке и в твоем посте. Откомпилировал, запустил. Вот: ![]() Ничего не валится, все работает... Сам исходник тоже прилагаю: ![]() Больше Вам спасибо. Я начал сравнивать ваш код и свой и нашел - глупая ошибка, даже не знаю как сказать - невнимательность! Отправлял сообщение на добавление кнопок, до создания экземпляров кнопок. Вот, что получилось: ![]() |
IKh |
![]()
Сообщение
#6
|
Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Игорь Репутация: ![]() ![]() ![]() |
Пожалуйста подскажите, как можно избежать перерисовки клиентской области окна при вызове диалоговых окон "Открыть" или "Сохранить" функциями GetOpenFileName и GetSaveFileName.
До вызова любого из диалоговых окон, родительское окно имеет вид: ![]() После вызова диалогового окна, окно принимает вид: ![]() то есть клиентская часть окна перерисовывается - надпись Заготовка находится под диалоговым окном. Далее при перемещении диалогового окна, родительское принимает вид: ![]() то есть надпись Заготовка перерисовывается во все тех участках основного окна, куда было перемещено диалоговое окно. Надпись занимает свое исходное положение после изменения размера окна (стиль класса окна: CS_HRedraw or CS_VRedraw) или же при посылке сообщения WM_PAINT после закрытия диалогового окна. |
IUnknown |
![]()
Сообщение
#7
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Не воспроизводится (WinXP SP3 + Dephi2009/FPC 2.4.4, проверял окном GetOpenFileName, тягал его во все стороны - не получилось добиться артефактов). Можешь прикрепить минимальный тестовый проект (просто отрисовка главного окна с надписью + запрос имени файла), который воспроизводит проблему? Чтоб можно было откомпилировать, запустить и посмотреть, есть ли проблема, и как от нее избавиться.
|
IKh |
![]()
Сообщение
#8
|
Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Игорь Репутация: ![]() ![]() ![]() |
Не воспроизводится (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 |
![]()
Сообщение
#9
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата {Прорисовка окна}
DevCon := BeginPaint(hwnd, PaintStruct);
DrawText(DevCon,PChar('Заготовка'),-1,PaintStruct.rcPaint,
DT_SINGLELINE or DT_CENTER or DT_VCENTER);
EndPaint(hwnd, PaintStruct);
Цитата 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 - 25.10.2011 1:50 |
IKh |
![]()
Сообщение
#10
|
Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Игорь Репутация: ![]() ![]() ![]() |
Спасибо! Ошибку понял.
|
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 10:57 |