怎样实现一个透明Form,并且可以在上面画线(画的线不透明)? 如果使用Form的透明色属性来实现Form透明的话,那这个透明的Form根本就不能响应鼠标(鼠标被此透明的Form下层的Form响应了),更不必说在上面画线了。或者说是实现一个最简单的屏幕作图的小应用程序,这里有一个MFC写的(带有完整的源代码):http://www.xiaozhou.net/ReadNews.asp?NewsID=867但是使用delphi怎样实现? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); private { Private declarations } public { Public declarations }procedure CreateWindowHandle(const Params: TCreateParams); override; end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.CreateWindowHandle(const Params: TCreateParams);varNewParams: TCreateParams;beginNewParams:=Params;NewParams.ExStyle := NewParams.ExStyle or WS_EX_TRANSPARENT;inherited CreateWindowHandle(NewParams);end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);begin canvas.LineTo(x,y);end;end. 非常感谢您的回帖。 非常抱歉我没有把问题叙述清楚,如果因此浪费的您的宝贵时间,请原谅。 我想要一个“玻璃窗”的效果。即,透明层后的内容刷新后这个透明窗体依然透明,事实上,我要在这个透明窗体下播放一段视频。使用“Params”方案实现透明的方法我曾经试过,无法在视频上实现透明和画图。 我想使用透明层的方法实现“在视频上画图”,目前的透明层制作遇到障碍。这里有一段MFC实现的透明层画图代码,怎样在delphi中实现?(delphi中不可以用MFC吧?)//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CMyWnd::CMyWnd(){ }CMyWnd::~CMyWnd(){ }BEGIN_MESSAGE_MAP(CMyWnd, CWnd)//{{AFX_MSG_MAP(CTransparentWnd) ON_WM_RBUTTONDOWN() ON_WM_LBUTTONDOWN() ON_WM_MOUSEMOVE() ON_COMMAND(IDC_EXIT,OnExit) ON_COMMAND(IDC_SET,OnSet) ON_COMMAND(IDC_REFRESH,OnRefresh) ON_COMMAND(IDC_EXIT_ALL,OnExitAll)//}}AFX_MSG_MAPEND_MESSAGE_MAP() void CMyWnd::CreateMyWnd(LPCTSTR pTitle,RECT &rect){ //建立窗口 CreateEx(WS_EX_TRANSPARENT, //透明 AfxRegisterWndClass(0,AfxGetApp()->LoadCursor(IDC_PEN)), pTitle, WS_POPUP, rect, NULL, NULL, NULL ); }void CMyWnd::OnRButtonDown(UINT nFlags, CPoint point){ CMenu m_menu; m_menu.LoadMenu(IDR_MENU1); ClientToScreen(&point); CMenu *psub = (CMenu *)m_menu.GetSubMenu(1); psub->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this); m_menu.DestroyMenu(); CWnd::OnRButtonDown(nFlags, point);}void CMyWnd::OnLButtonDown(UINT nFlags, CPoint point){ m_pt=point; CWnd::OnLButtonDown(nFlags, point); }void CMyWnd::OnMouseMove(UINT nFlags, CPoint point) { if(nFlags & MK_LBUTTON) { CClientDC dc(this); CPen pen( ((CPageDlg*)AfxGetMainWnd())->m_page1.m_nPenStyle, ((CPageDlg*)AfxGetMainWnd())->m_page1.m_nPenWidth, ((CPageDlg*)AfxGetMainWnd())->m_page1.m_PenColor ); CPen* pOldPen=dc.SelectObject (&pen); dc.MoveTo (m_pt.x,m_pt.y); dc.LineTo (point.x,point.y); m_pt=point; dc.SelectObject (pOldPen); } CWnd::OnMouseMove(nFlags, point);} 用鼠标hook试试。我没有VC,不知道你给的这个程序是否能实现这样的功能。 应该类似于学校里面用到的教鞭软件吧..网上有类似的资源.呵呵...你之前没有说清楚.害我专门做了个例子出来,可能不是你想要的效果,不过还是放上来吧.制作背景透明窗体,然后实现可以自由绘画步骤:1.新建一个应用程序,设置Form1的WindowState为最大化wsMaximized2.在窗体上放置两个ColorDialog 控件(该控件位于控件栏:Dialogs下), 分别命名Name为:LCD和RCP 再放置两个Panel控件(该控件位于控件栏:Standard下), 分别命名Name为:LCP和RCP.并将这两个panel控件的Color属性设置为:ClRed和ClLime3.再放置一个SpeedButton按钮说明: ColorDialog控件和Panel控件主要用于绘画时,选择颜色用. SpeedButton 主要用于程序运行退出代码如下:unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Buttons, ExtCtrls, StdCtrls;type TForm1 = class(TForm) LCP: TPanel; RCP: TPanel; SpeedButton1: TSpeedButton; RCD: TColorDialog; LCD: TColorDialog; Button1: TButton; procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure SpeedButton1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure LCPClick(Sender: TObject); procedure RCPClick(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1; x0,y0:integer;implementation{$R *.dfm}procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, //窗体上鼠标移动时 Y: Integer);beginif ssleft in shift then begin //从按鼠标左键画曲线 canvas.Pen.Width:=3; canvas.Pen.Color:=lcp.Color; canvas.Pen.Mode:=pmcopy; canvas.moveto(x0,y0); canvas.lineto(x,y); end else if ssright in shift then begin //从按鼠标右键画曲线 canvas.Pen.Width:=3; canvas.Pen.Color:=rcp.Color; canvas.Pen.Mode:=pmcopy; canvas.moveto(x0,y0); canvas.lineto(x,y); end; x0:=x; y0:=y;end;procedure TForm1.SpeedButton1Click(Sender: TObject); //单击退出时beginapplication.Terminate ;end;procedure TForm1.FormCreate(Sender: TObject); //窗体创建时beginBrush.Style:=bsclear;with Form1 do SetWindowPos(Handle,HWND_TOPMOST,Left,Top,Width,Height,SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); //将窗体置在最上面end;procedure TForm1.LCPClick(Sender: TObject); //单击颜色选框时,弹出颜色面板(单击鼠标左键绘画时颜色选择)beginif lcd.Execute then LCP.Color:=LCD.Color;end;procedure TForm1.RCPClick(Sender: TObject); //单击颜色选框时,弹出颜色面板(单击鼠标右键绘画时颜色选择)beginif rcd.Execute then rCP.Color:=rCD.Color;end;end.买手机,找搜鸡网.品种多,价格便,质量好!http://shop.paipai.com/77181269 菜鸟求救!请问各位大虾~分享到: 请问如果不装delphi的开发环境,在哪里能找到delphi的文档 请问有什么软件可以制作64*64的.cur文件 一个程序里面如何在状态栏显示多个窗口? 关于版本的疑惑?(新手请教) QQ珊瑚虫版的安装文件是什么软件打包的 我们的软件工程老师艾尼瓦尔给出以下问题:------好难的!! D7中没有NMurl,怎么编码呢? 有成都的delphi程序员吗? 请问在安装控件时为什么会出现这样的错误? 在DELPHI中怎样动态创建一下带按钮的窗体 Dos下的inportb和outportb对应delphi下的那个函数?
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
procedure CreateWindowHandle(const Params: TCreateParams); override;
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.CreateWindowHandle(const Params: TCreateParams);
var
NewParams: TCreateParams;
begin
NewParams:=Params;
NewParams.ExStyle := NewParams.ExStyle or WS_EX_TRANSPARENT;
inherited CreateWindowHandle(NewParams);
end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
canvas.LineTo(x,y);
end;end.
我想使用透明层的方法实现“在视频上画图”,目前的透明层制作遇到障碍。这里有一段MFC实现的透明层画图代码,怎样在delphi中实现?(delphi中不可以用MFC吧?)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////CMyWnd::CMyWnd()
{
}CMyWnd::~CMyWnd()
{
}
BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
//{{AFX_MSG_MAP(CTransparentWnd)
ON_WM_RBUTTONDOWN()
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_COMMAND(IDC_EXIT,OnExit)
ON_COMMAND(IDC_SET,OnSet)
ON_COMMAND(IDC_REFRESH,OnRefresh)
ON_COMMAND(IDC_EXIT_ALL,OnExitAll)
//}}AFX_MSG_MAP
END_MESSAGE_MAP() void CMyWnd::CreateMyWnd(LPCTSTR pTitle,RECT &rect)
{
//建立窗口
CreateEx(WS_EX_TRANSPARENT, //透明
AfxRegisterWndClass(0,AfxGetApp()->LoadCursor(IDC_PEN)),
pTitle,
WS_POPUP,
rect,
NULL,
NULL,
NULL );
}void CMyWnd::OnRButtonDown(UINT nFlags, CPoint point)
{
CMenu m_menu;
m_menu.LoadMenu(IDR_MENU1);
ClientToScreen(&point);
CMenu *psub = (CMenu *)m_menu.GetSubMenu(1);
psub->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
m_menu.DestroyMenu(); CWnd::OnRButtonDown(nFlags, point);
}void CMyWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
m_pt=point;
CWnd::OnLButtonDown(nFlags, point);
}
void CMyWnd::OnMouseMove(UINT nFlags, CPoint point)
{
if(nFlags & MK_LBUTTON)
{
CClientDC dc(this);
CPen pen(
((CPageDlg*)AfxGetMainWnd())->m_page1.m_nPenStyle,
((CPageDlg*)AfxGetMainWnd())->m_page1.m_nPenWidth,
((CPageDlg*)AfxGetMainWnd())->m_page1.m_PenColor
);
CPen* pOldPen=dc.SelectObject (&pen); dc.MoveTo (m_pt.x,m_pt.y);
dc.LineTo (point.x,point.y); m_pt=point;
dc.SelectObject (pOldPen);
}
CWnd::OnMouseMove(nFlags, point);
}
制作背景透明窗体,然后实现可以自由绘画
步骤:
1.新建一个应用程序,设置Form1的WindowState为最大化wsMaximized
2.在窗体上放置两个ColorDialog 控件(该控件位于控件栏:Dialogs下), 分别命名Name为:LCD和RCP
再放置两个Panel控件(该控件位于控件栏:Standard下), 分别命名Name为:LCP和RCP.并将这两个panel
控件的Color属性设置为:ClRed和ClLime
3.再放置一个SpeedButton按钮
说明:
ColorDialog控件和Panel控件主要用于绘画时,选择颜色用.
SpeedButton 主要用于程序运行退出代码如下:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, ExtCtrls, StdCtrls;type
TForm1 = class(TForm)
LCP: TPanel;
RCP: TPanel;
SpeedButton1: TSpeedButton;
RCD: TColorDialog;
LCD: TColorDialog;
Button1: TButton;
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure SpeedButton1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure LCPClick(Sender: TObject);
procedure RCPClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
x0,y0:integer;
implementation{$R *.dfm}procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, //窗体上鼠标移动时
Y: Integer);
begin
if ssleft in shift then
begin //从按鼠标左键画曲线
canvas.Pen.Width:=3;
canvas.Pen.Color:=lcp.Color;
canvas.Pen.Mode:=pmcopy;
canvas.moveto(x0,y0);
canvas.lineto(x,y);
end
else
if ssright in shift then
begin //从按鼠标右键画曲线
canvas.Pen.Width:=3;
canvas.Pen.Color:=rcp.Color;
canvas.Pen.Mode:=pmcopy;
canvas.moveto(x0,y0);
canvas.lineto(x,y);
end;
x0:=x;
y0:=y;
end;procedure TForm1.SpeedButton1Click(Sender: TObject); //单击退出时
begin
application.Terminate ;
end;procedure TForm1.FormCreate(Sender: TObject); //窗体创建时
begin
Brush.Style:=bsclear;with Form1 do
SetWindowPos(Handle,HWND_TOPMOST,Left,Top,Width,Height,SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); //将窗体置在最上面
end;procedure TForm1.LCPClick(Sender: TObject); //单击颜色选框时,弹出颜色面板(单击鼠标左键绘画时颜色选择)
begin
if lcd.Execute then
LCP.Color:=LCD.Color;
end;procedure TForm1.RCPClick(Sender: TObject); //单击颜色选框时,弹出颜色面板(单击鼠标右键绘画时颜色选择)
begin
if rcd.Execute then
rCP.Color:=rCD.Color;
end;end.买手机,找搜鸡网.品种多,价格便,质量好!
http://shop.paipai.com/77181269