![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Посоветуйте, как реализовать
Darvin © (2007-09-18 11:53:00)Здравствуйте!
В Ворде, в режиме предварительного просмотра есть кнопочка [Несколько страниц], позволяющая выбрать кол-во страниц по горизонтали и по вертикали. По нажатии выпадает окошко с гридом из страниц. Если НЕ БРОСАЕШЬ КНОПКУ МЫШКИ ПОСЛЕ НАЖАТИЯ НА КНОПКУ и двигаешь курсор по гриду, выделяются ячейки этого грида и меняется его размер. При отпускании кнопки мыши окошко прячется и запоминается количество ячеек (страниц) по горизонтали и вертикали.
Я хочу в своем проекте сделать такой-же диалог выбора. Для этого сделал форму с BorderStyle = bsNone, на нее поместил StringGrid. Далее на событии MouseDown кнопки показываю и позиционирую данное окно. Все работает, но возникает проблема. Грид на появившейся форме не получает события MouseMove и MouseUp до тех пор, пока принудительно не нажмешь кнопку мыши и соответственно не выделяются ячейки на гриде и не меняет он своего размера.
Вопрос:
Как сделать так, чтоб появившаяся форма и грид на ней СРАЗУ воспринимал события MouseMove и MouseUp, без предварительного нажатия на гриде в этой форме?
DVM (2007-09-18 15:36:00) [1]
> CM_ вякие же посылаются вроде
он то WM_XXX посылать пытается
А CM_XXX это другое совсем. Да и обрабатываются они не оконной процедурой TSpeedButton, тем более, что у нее ее нет.
homm (2007-09-18 15:31:00) [2]> [29] DVM © (18.09.07 15:29)
> TSpeedButton никакие сообщения не могут посылаться, т.к.
> она не окно
CM_ вякие же посылаются вроде
DVM (2007-09-18 15:29:00) [3]
> Какие сообщения надо посылаются кнопке при отпускании кнопки
> мышки?
TSpeedButton никакие сообщения не могут посылаться, т.к. она не окно
Darvin (2007-09-18 13:52:00) [4]>{RASkov} © (18.09.07 13:38) [24]
Сделал после создания формы, как у тебя в примере:
Form1.Grid.Perform(WM_LBUTTONDOWN, 0, 0);
и заработало :-)
Но кнопка, по нажатии которой вызывается форма TSpeedButton остается нажатой. Делаю так:
Button1.Perform ( WM_LBUTTONUP, 0, 0 );
Form1.Grid.Perform(WM_LBUTTONDOWN, 0, 0);
все равно нажатая!
Вопрос:
Какие сообщения надо посылаются кнопке при отпускании кнопки мышки?
{RASkov} (2007-09-18 13:38:00) [5]> procedure TForm1.PaintBox1Paint(Sender: TObject);
> var Rc: TRect; C, R, W, H, BDR: Integer; P: TPoint;
> begin
......
> W:=PaintBox1.Width div 25;
> H:=PaintBox1.Height div 25;!
Правильно должно быть 35 Т.е.
H:=PaintBox1.Height div 35;
Впрочем там есть и еще ошибки, но я не код а идею хотел показать....
{RASkov} (2007-09-18 13:34:00) [6]> Попробуй развить вот эту идею:
Хм... Пока писал код эту идею уже предложили :)
Галинка (2007-09-18 13:32:00) [7]в опене и с не нажатой все прекрасно меняется.
{RASkov} (2007-09-18 13:32:00) [8]> [19] Darvin © (18.09.07 13:04)
Попробуй развить вот эту идею:
Брось на форму СпидБатон и ПаинтБокс и пропиши обработчики
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Buttons;
type
TForm1 = class(TForm)
SpeedButton1: TSpeedButton;
PaintBox1: TPaintBox;
procedure SpeedButton1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure SpeedButton1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure PaintBox1Paint(Sender: TObject);
procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
DoubleBuffered:=True;
end;
procedure TForm1.SpeedButton1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
PaintBox1.Left:=SpeedButton1.Left;
PaintBox1.Top:= SpeedButton1.Top+SpeedButton1.Height;
PaintBox1.Width:=100;
PaintBox1.Height:=140;
PaintBox1.Show;
ReleaseCapture;
end;
procedure TForm1.SpeedButton1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
PaintBox1.Hide;
end;
procedure TForm1.PaintBox1Paint(Sender: TObject);
var Rc: TRect; C, R, W, H, BDR: Integer; P: TPoint;
begin
with PaintBox1.Canvas do begin
Rc:=ClipRect; GetCursorPos(P);
P:=PaintBox1.ScreenToClient(P);
W:=PaintBox1.Width div 25;
H:=PaintBox1.Height div 25;
DrawEdge(Handle, Rc, BDR_RAISEDOUTER , BF_RECT);
for C:= 0 to W do
for R := 0 to H do begin
Rc.Left:=C*25; Rc.Top:=R*35;
Rc.Right:=Rc.Left+25; Rc.Bottom:=Rc.Top+35;
if (C<=(P.X div 25)) and (R<=(P.Y div 35)) then begin
BDR:=BDR_SUNKENOUTER;
Brush.Color:=clWhite;
end else begin
BDR:=BDR_RAISEDOUTER;
Brush.Color:=PaintBox1.Color;
end;
DrawEdge(Handle, Rc, BDR, BF_RECT);
InflateRect(Rc, -2, -2);
FillRect(Rc);
end;
end;
end;
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if (X>95) then
if (X>PaintBox1.Width-5) then begin
PaintBox1.Width:=PaintBox1.Width+25;
PaintBox1.Invalidate;
end else if X<PaintBox1.Width-50 then PaintBox1.Width:=PaintBox1.Width-25;
if (Y>135) then
if (Y>PaintBox1.Height-5) then begin
PaintBox1.Height:=PaintBox1.Height+35;
end else if Y<PaintBox1.Height-70 then PaintBox1.Height:=PaintBox1.Height-35;
PaintBox1.Invalidate;
end;
procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
SpeedButton1.Perform(WM_LBUTTONUP, 0, 0);
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
SpeedButton1.Perform(WM_LBUTTONUP, 0, 0);
end;
end.
Код кривой.... так для раздумия, что StringGrid(или нечто другое как обычно любят) не для этих целей :)
Darvin (2007-09-18 13:22:00) [9]>Галинка © (18.09.07 13:19) [22]
Если мыша не нажата, то окошки выделяются, а изменение размеров окно / грида не происходит. С нажатой кнопкой происходит
Галинка (2007-09-18 13:19:00) [10]в опенофисе не обязательно тоже держать мышку все время нажатой. А для тебя критично, чтобы все это было только при нажатой кнопке?
Галинка (2007-09-18 13:08:00) [11]в дотнете есть SplitToolButton. По исполнению очень похоже на то, что в опенофисе. Поищи в VCL что-то подобное.
Darvin (2007-09-18 13:07:00) [12]>Галинка © (18.09.07 12:51) [14]
Меню выпадает ТОЛЬКО ПОСЛЕ ОТПУСКАНИЯ кнопки мышки, вызвавшего меню
Darvin (2007-09-18 13:04:00) [13]>Галинка © (18.09.07 12:51) [14]
Не получается сделать выпадающий список с использованием TollButton или SpeedButton аналогично работе соотв. кнопке ворда или опенофиса
Галинка (2007-09-18 12:56:00) [14]homm © (18.09.07 12:53) [16]
я в такие дебри пока не вдавалась )) Хотя это скорее для формы. А я вроде про пункт меню. Наверное все же будет легче туда типа PictureBox'а что-то туркнуть... Или хотя бы вросто Image.
Галинка (2007-09-18 12:54:00) [15]Матрица - суть картинка. В которой с опережением дорисовываются клеточки. Что-то вроде проверки:
if (X > picbox.Width - cell.Width)
{
дориосвать еще один столбик
}
И так же для Y.
homm (2007-09-18 12:53:00) [16]> [14] Галинка © (18.09.07 12:51)
> Есть ли у него вообще канва?
GetDC(HWnd) :)
Darvin (2007-09-18 12:52:00) [17]>Галинка © (18.09.07 12:51) [14]
спасибо, попробую
Галинка (2007-09-18 12:51:00) [18]Darvin © (18.09.07 12:46) [12]
так вот я потому и спрашивала у homm, можно ли рисовать на выпадающем списке. Есть ли у него вообще канва? Если есть, то решение вполне тривиально. Делаешь кнопочку, делаешь к ней выпадающее меню с одним итемом. И потом уже в нем рисуешь с опережением "кирпичики" и закрашиваешь их в нужный цвет, оставляя крайние "опережающие" белыми.
Это все можно осуществить, например, и в том случае, если в пункт меню можно поместить PictureBox скажем. И уже на нем рисовать будешь.
Darvin (2007-09-18 12:50:00) [19]>Галинка © (18.09.07 12:42) [11]
Смотрел в опенофисе. Там тоже выпадающая матрица с изменяющимися размерами.
Darvin (2007-09-18 12:46:00) [20]>Галинка © (18.09.07 12:42) [11]
не знаю, как в openoffice, но в ворде там не выпадающий список, а выпадающая матрица с исзменяющимися размерами (количеством итемов). Может, я чего не знаю.... и выпадающие списки бывают такого вида?