Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.012 c
14-3145
Hermit
2003-05-14 21:58
2003.06.02
Нужны идеи


1-2961
borg
2003-05-20 16:28
2003.06.02
run-time


3-2809
EugeneK
2003-05-14 10:44
2003.06.02
Проблема с ConnectTimeout при работе с ADO


1-2972
Kreo
2003-05-19 20:27
2003.06.02
Fast Report & StringGrid Как???


1-3007
Dead
2003-05-20 23:04
2003.06.02
SynEdit и иже с ним





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский