Форум: "WinAPI";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];
ВнизКак определить Handle родительского окна для контрола Найти похожие ветки
← →
Grrey (2003-04-02 12:56) [0]Есть такая функция DrawFocusRect. Мне нужно написать компоненту ActiveX чтобы она могла перемещаться на форме. Для DrawFocusRect нужен Handle родительского окна. Owner.Canvas.Handle не работает. Может чего-нибудь посоветуете?
← →
Style (2003-04-02 13:04) [1]Тебе нужен Owner чего. Объясни подробнее или код дай.
← →
Grrey (2003-04-02 13:22) [2]procedure TMovButton.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
inherited MouseMove(Shift,X,Y);
if (IsMouseDown and ((abs(x-x0)>5) or (abs(y-y0)>5))) then
begin
(Owner as TCustomForm).Canvas.DrawFocusRect(rec); //этот код не работает в ActiveX, построенном на этом компоненте.
with rec do begin
left:=Left+x-x0;
top:=Top+y-y0;
right:=right+x-x0;
bottom:=bottom+y-y0;
x0:=x;
y0:=y;
end;
(Owner as TCustomForm).Canvas.DrawFocusRect(rec); //и этот тоже
Moving:=true;
end else
begin
//Select
end;
end;
← →
Grrey (2003-04-02 13:26) [3]Вместо этих строк можно вставить чего-нибудь вроде:
DrawFocusRect(ParentControl.Handle,rec)
Как получить этот ParentControl?
← →
Grrey (2003-04-02 17:26) [4]Неужели никто помочь не сможет?
← →
NAlexey (2003-04-02 17:34) [5]ParentControl скорее всего есть Parent для компонента. Owner тот кто владеет и уничтожает. Parent это тот в кого вставлен твой компонент.
← →
NAlexey (2003-04-02 17:38) [6]Не рисуется методом TCanvas.DrawFocusRect. скорее из затого, что неправильный цвет Brush или Rect твой непонятно где, или опять же
TCanvas.Brush.Style у тебя bsClear.
← →
Songoku (2003-04-02 17:48) [7]Я делал это так .... если поможет напиши!!!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
CheckBox1: TCheckBox;
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
xx,yy,d,index,index2,i:Integer;
Rects:array [0..256] of TRect;
Points:array [0..256] of TRect;
implementation
{$R *.DFM}
procedure DrawLine(DC:HDC;Color,x,y,xc,yc:Integer);
var Pen:HPen;
begin
Pen:=CreatePen(PS_SOLID, 1, Color);
SelectObject(DC,Pen);
MoveToEx(DC, x, y, nil);
LineTo(DC, xc, yc);
DeleteObject(Pen);
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if CheckBox1.Checked=False then begin
if d=23 then begin
Form1.RePaint;
DrawFocusRect(GetDC(Handle),RECT(xx,yy,x,y));
if x<xx then DrawFocusRect(GetDC(Handle),RECT(x,yy,xx,y));
if y<yy then DrawFocusRect(GetDC(Handle),RECT(xx,y,x,yy));
if (y<yy)and(x<xx) then DrawFocusRect(GetDC(Handle),RECT(x,y,xx,yy));
end;end else begin
if d=23 then begin
Form1.RePaint;
DrawLine(GetDC(Handle),0,xx,yy,x,y);
end;
end;
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
d:=23;
xx:=x;
yy:=y;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if CheckBox1.Checked=False then begin
if d=23 then begin
Rects[index]:=Rect(xx,yy,x,y);
if x<xx then Rects[i]:=Rect(x,yy,xx,y);
if y<yy then Rects[i]:=Rect(xx,y,x,yy);
if (y<yy)and(x<xx) then Rects[i]:=Rect(x,y,xx,yy);
index:=index+1;
end; end else
begin
Points[index2]:=Rect(xx,yy,x,y);
index2:=index2+1;
end;
d:=0;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
For i:=0 to index do
DrawFocusRect(GetDC(Handle),Rects[i]);
For i:=0 to index2 do
DrawLine(GetDC(Handle),0,Points[i].Left,Points[i].Top,Points[i].Right,Points[i].Bottom);
end;
end.
← →
Grrey (2003-04-02 17:49) [8]Не рисуется скорее потому, что это ActiveX компонента, и проверяю ее я на VB.
← →
Grrey (2003-04-02 17:58) [9]to Songoku-> Ты здесь напрямую используешь handle окна. Я этого сделать не могу, т.к. при компиляции не извесно какое окно (и вообще окно ли) будет содержать в себе мою компоненту.
Если есть функции для определения Child Control"a, то, наверное, должны быть функции для определения Parent Control"a.
← →
Songoku (2003-04-02 18:05) [10]Так ты что компанет пишешь???
А ты в место Handle по пробуй GetDesktopWindow
← →
Grrey (2003-04-02 18:31) [11]Посмотрел по документации, и мне кажется, что эта функция возвращает Handle Рабочего стола. А мне он совсем не нужен.
Конечно я попробовал. Но ничего не рисуется.
← →
Grrey (2003-04-02 18:35) [12]Скорее надо использовать GetForegroundWindow, но с ней также ничего не рисуется!
← →
Songoku (2003-04-02 18:53) [13]ПО пробуй GetFocus ...
← →
Grrey (2003-04-02 19:15) [14]Никаких результатов.
Опять не рисуется. Может и правда настрйки не правильные. Хотя, если делать с явным определением Canvas"a, то рисуется правильно!
← →
Songoku (2003-04-02 19:21) [15]Скинь мне исходник ....
← →
Grrey (2003-04-02 19:25) [16]Все дошло!
DrawFocusRect(GetWindowDC(GetActiveWindow),RECT(0,0,X,Y));
Спасибо всем!
← →
Songoku (2003-04-02 19:26) [17]а ЧТО ЗА прога???
← →
nikkie (2003-04-03 00:20) [18]GetParent(Handle)
← →
Grrey (2003-04-03 10:36) [19]to Songoku>Это не прога, а компонент. Нужно сделать возможность добавлять в программу копоненты без перекомпиляции. Я решил использовать ActiveX.
to nikkie> Спасибо. Это, чего я искал. Но эта функция тоже возвращает Handle окна, а мне нужен (как оказалось) DC.
И еще один вопрос меня беспокоит. Почему координаты при обращении к Canvas"у не совпадают с координатами при обращении к DC окна?
← →
nikkie (2003-04-03 13:21) [20]The GetWindowDC function retrieves the device context (DC) for the entire window, including title bar, menus, and scroll bars.
The GetDC function retrieves a handle to a display device context (DC) for the client area of a specified window or for the entire screen.
← →
Grrey (2003-04-03 14:00) [21]Спасибо!
Я это увидел!
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.009 c