Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Посоветуйте, как реализовать


Страницы:   1 2

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, но в ворде там не выпадающий список, а выпадающая матрица с исзменяющимися размерами (количеством итемов). Может, я чего не знаю.... и выпадающие списки бывают такого вида?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо